C中的链表未打印



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

#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;
}

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将始终为NULL;它将不跟踪对CCD_ 7的改变。您必须将其分配给start的新值。

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

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

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

正确的代码-

#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

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


说明:

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

  2. 接下来,我使用start来检查用户输入的最后一个值。如果为0,则循环将中断。请注意,我已经将循环转换为do-while循环,因为start一开始是NULL。

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

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

相关内容

  • 没有找到相关文章

最新更新