C中的链表未打印

C中的链表未打印,c,linked-list,C,Linked List,我认为它没有打印,因为我没有正确插入列表。我看到大多数人在循环之外分配空间,但我不确定情况是否如此 #include <stdio.h> #include <stdlib.h> typedef struct intList { int number; struct intList *next; } INT_LIST; int main() { INT_LIST *start = NULL, *temp; INT_LIST *trvPtr

我认为它没有打印,因为我没有正确插入列表。我看到大多数人在循环之外分配空间,但我不确定情况是否如此

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

typedef struct intList {
    int number;
    struct intList *next;
} INT_LIST;

int main() {
    INT_LIST *start = NULL, *temp;
    INT_LIST *trvPtr = start;
    /* Insert into list */
    while (temp->number != 0) {
        temp = malloc(sizeof(INT_LIST));
        printf("Enter your integer: ");
        scanf("%d", &(temp->number));
        temp->next = start;
        start = temp;
    }
    printf("List is: \n");
    while (trvPtr != NULL) {
        printf("%d", trvPtr->number);
        trvPtr = trvPtr->next;
    }
    return 0;
}
#包括
#包括
类型定义结构intList{
整数;
结构intList*下一步;
}国际清单;
int main(){
INT_LIST*start=NULL,*temp;
INT_LIST*trvPtr=start;
/*插入列表*/
同时(临时->编号!=0){
temp=malloc(sizeof(INT_LIST));
printf(“输入整数:”);
scanf(“%d”和(临时->编号));
温度->下一步=开始;
启动=温度;
}
printf(“列表为:\n”);
while(trvPtr!=NULL){
printf(“%d”,trvPtr->number);
trvPtr=trvPtr->next;
}
返回0;
}

temp
未初始化并指向垃圾。检查
temp->number!=0是未定义的行为

您可以通过do/while循环来解决这个问题。循环将始终运行一次。分配
temp
,设置它,然后检查

    INT_LIST *start = NULL, *temp;
    do {
        temp = malloc(sizeof(INT_LIST));
        printf("Enter your integer: ");
        scanf("%d", &(temp->number));
        temp->next = start;
        start = temp;
    } while(temp->number != 0);
请注意,列表将始终以值0开头。要避免这种情况,请在执行任何其他操作之前检查输入。使用
while(1)
进行无限循环,并使用
break
结束循环

    INT_LIST *start = NULL;
    while(1) {
        int input;
        printf("Enter your integer: ");
        scanf("%d", &input);
        if(input == 0) {
            break;
        }

        INT_LIST *temp = malloc(sizeof(INT_LIST));
        temp->number = input;
        temp->next = start;

        start = temp;
    }
打印时,
trvPtr
将始终为空;它不会跟踪对
开始的更改。您必须将其分配给新值
start

    printf("List is: ");
    INT_LIST *trvPtr = start;
    while (trvPtr != NULL) {
        printf("%d ", trvPtr->number);
        trvPtr = trvPtr->next;
    }
    puts("");

请注意,您并不局限于在函数开始时声明所有变量。

我已经对您的代码进行了一些修改/更正,下面应该可以使用-

正确代码- 如果不希望打印0,请在第一个while循环结束后立即包含
temp=start


说明:
  • 首先,在代码中,您没有分配任何
    temp
    。它应该先被分配了空间并分配了一些东西,否则语句
    temp->number!=0只是未定义的行为。

  • 接下来,我使用
    start
    检查用户输入的最后一个值。如果为0,则循环将中断。请注意,我已将循环转换为
    Do while
    循环,因为
    start
    在开始时为空

  • 最后,循环结束后,我将next of temp设置为null,以便正确执行打印循环。在您的代码中,此部分也有一个错误,因为您将NULL分配给了
    trvPtr
    ,但从未更改该值。因此,在您的情况下,循环永远不会执行


  • 注意:在使用malloc时,最好明确提到强制类型转换。某些编译器会发出警告/错误。所以,我也修改了它,无论你在哪里使用
    malloc()

    你都不会初始化
    temp
    指向任何东西,所以
    while(temp->number!=0)
    调用未定义的行为,所以你的
    trvPtr
    被初始化为
    NULL
    ,之后再也不会更改,所以你的“打印循环”永远不要执行始终记住的有用提示-始终初始化变量
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct intList {
        int number;
        struct intList *next;
    } INT_LIST;
    
    int main() {
        INT_LIST *start = NULL, *temp;
        temp = (INT_LIST*)malloc(sizeof(INT_LIST));
        INT_LIST *trvPtr = temp;
        /* Insert into list */
        do {
            
            printf("Enter your integer: ");
            scanf("%d", &(temp->number));
            start = temp;
            temp->next = (INT_LIST*)malloc(sizeof(INT_LIST));
            temp = temp->next;
            
        }while (start->number != 0);
        temp->next=NULL;
    
        printf("List is: \n");
        while (trvPtr->next != NULL) {
            printf("%d", trvPtr->number);
            trvPtr = trvPtr->next;
        }
        return 0;
    }
    
    Enter your integer: 1
    Enter your integer: 2
    Enter your integer: 3
    Enter your integer: 0
    List is:
    1230