但是,我试图将节点追加到链表中,当我使用while循环检查“ link”是否设置为NULL时,则在不执行循环的情况下执行该循环。
就好像“ cursor-> link”未设置为NULL,而while循环中的代码正在执行时,我将print语句放在那里只是为了对其进行测试,即使“ cursor- > link“设置为NULL。 create函数返回一个“ node *”。
编辑-对不起,我在深夜发布了此问题,我想我可能并没有处于最佳状态来正确表达自己。另外,我还是对如何处理和使用链接列表感到困惑(如我的代码所示)。我已经得到了一个可以使用的模板(因为在功能中追加和显示是预设的,因此我必须按原样使用它们)。编译器并未按原样使用该代码引发任何警告。但是,程序仍然在While循环周围的append函数中崩溃。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node {
int data;
struct node * link;
} node;
node* create(int data,node* link) {
node* newNode = (node*)malloc(sizeof(node));
newNode->data = data;
newNode->link = link;
return newNode;
}
void append ( node **, int ) ;
void display ( node * ) ;
int main() {
node *p ;
p=NULL;
int n;
char ch[10];
do {
printf("Enter the value\n");
scanf("%d",&n);
append(&p,n);
printf("Do you want to add another node? Type Yes/No\n");
scanf("%s",ch);
}while(!strcmp(ch,"Yes"));
printf("The elements in the linked list are");
display(p);
printf("\n");
return 0;
}
/* adds a node at the end of a linked list */
void append ( node **q, int num ){
node *cursor;
if (*q == NULL) {
*q = create(num, NULL);
node *cursor = *q;
}
while(cursor->link != NULL) {
printf("1\n");
cursor = cursor->link;
}
node* newNode = create(num, NULL);
cursor->link = newNode;
}
void display ( node *q ){
node *cursor = q;
while(cursor->link != NULL) {
printf(" %d", q->data);
cursor = cursor->link;
}
printf(" %d", cursor->data);
}
答案 0 :(得分:0)
正如Ry所提到的,问题在于在while循环中使用的游标,它从未被初始化。相反,当* q为null时,您将创建一个具有相同名称的新变量。我在代码中看到另一个问题,当列表为空时,您将两次添加新节点。首先是null检查条件,然后是while循环。
要修复此行 “节点*光标= * q” 如果条件之外,则添加回报。也删除这行 “节点*光标”
注意:我假设您的create方法没有问题。