为什么这个基本的C程序会导致无限循环



我的任务是构建一个"代表堆栈"的基本链表。因此,只能根据后进先出原则访问数据。我必须在该"堆栈"上应用某些功能。我的代码编译得很好,但是通过执行,它只是无限打印 1。我不知道这是怎么回事,因为我实际上只使用一个while循环。有谁知道我的问题是什么?也许我将来如何防止此类错误。感谢您的任何帮助。提前道歉,我是初学者!

    #include <stdio.h>
#include <stdlib.h>

typedef struct Stack {
    struct Stack *next;
    int data;
} Stack;
Stack* push(Stack*head, int d) {   //add a datapoint to the top of the stack
    Stack *temp;
    temp=malloc(sizeof(Stack));
    temp->data=d;
    temp->next=head;
    return temp;
}

Stack* pop(Stack*head) {      //read the top data point, and delete it
    Stack* newHead=head->next;
    printf("%i", head->data );
    free(head);
    return newHead;
}
int peek(Stack*head) {   // return the top datapoint, without delete
    return head->data;
}
void isempty(Stack*head) {     
    if (head==NULL) {
        printf("Stack empty");
    }
    printf("Stack has data");
}
void print(Stack*head) {    //print complete Stack
    Stack* cursor;
    cursor=head;
    while (cursor!=NULL) {
        printf("%i", cursor->data);
    }
}
int main(int argc, const char * argv[]) {
    Stack* head;
    head=malloc(sizeof(Stack));
    head=NULL;
    head=push(head, 4);
    head=push(head, 2);
    head=push(head, 1);
    printf("%i", peek(head));
    print(head);
    head=pop(head);
    print(head);
    isempty(head);
    head=pop(head);
    head=pop(head);
    isempty(head);

    return 0;
}

您不会在函数print中递增cursor

    while (cursor!=NULL) {
        printf("%i", cursor->data);
   }

代码还在此处泄漏内存:

head=malloc(sizeof(Stack));
head=NULL;

在此代码中:

while (cursor!=NULL) {
    printf("%i", cursor->data);
}

您没有更改光标。所以把它改成

for (cursor = head; cursor!=NULL; cursor = cursor->next) {
    printf("%i", cursor->data);
}

你在函数 print 中有一个无限循环。 您需要更新循环中的cursor,否则它将永远循环。 以下是我会怎么做:

void print(Stack*head) {    //print complete Stack
    Stack* cursor;
    for (cursor = head; cursor != NULL; cursor = cursor->next) {
        printf("%i", cursor->data);
    }
}

while 循环有一个问题:

while (cursor!=NULL) {
    printf("%i", cursor->data);
    cursor = cursor->next; // you forgot this line
}

没有此行,光标将永远不会更改。

您必须在函数 print 的循环中向前一步:

void print( Stack*head )
{
    Stack* cursor = head;
    while (cursor != NULL)   // 
    {
        printf("%i", cursor->data);
        cursor = cursor->next; // step one forward
    }
}

此外,还存在内存泄漏。您为变量 head 分配内存,但您将其设置为NULL

Stack* head;
// head=malloc(sizeof(Stack)); // delete this
head=NULL;

相关内容

  • 没有找到相关文章

最新更新