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