我有下面的程序,它创建了一个简单的字符链表。
typedef struct letter{
char c;
struct letter *next;
}letter;
int count(letter *c){
int n = 0;
letter *t = c;
while(t){
n++;
t = t->next;
}
t = NULL;
return n;
}
int main(){
letter *head = (letter*)malloc(sizeof(letter));
letter *cur = head;
int n;
printf("Give me a number:");
scanf("%d",&n);
while(n > 0){
printf("Give me a char:");
scanf(" %c",&cur->c);
cur->next = (letter*)malloc(sizeof(letter));
cur=cur->next;
cur->next = NULL;
printf("Give me a number:");
scanf("%d",&n);
}
cur = head;
printf("Total nodes: %d",count(head));
system("pause");
return 0;
}
在用户按下0之前,我一直在用字符填充列表。问题是,当我试图使用count((函数输出节点总数时,我得到了错误的结果。例如,考虑以下输入:
1
a
2
b
3
c
0
结果是:
Total nodes:4
这是错误的。应该是Total nodes:3
你能解释一下为什么会发生这种事吗?
创建列表时,您还创建了第一个节点,但从未为其char
赋值。
关于如何解决您的问题,我有两个建议:
- 不要计算第一个节点。检索值或计算列表长度时,请始终跳过它。这稍微容易一点,IMO
或
- 当列表为空时,让头指向
NULL
。这并不是说这个解决方案意味着头指针在插入第一个元素时会改变它的值,所以你需要通过引用插入/删除函数来传递列表指针
cur->next = (letter*)malloc(sizeof(letter));
cur=cur->next;
cur->next = NULL;
每次执行循环时,此代码都会创建一个节点,所以在第三个字符输入后,将创建不包含任何值的节点。因此在计数循环中,它将产生4个节点。
修改环路:运行并检查
while(n > 0){
printf("Give me a char:");
scanf(" %c",&cur->c);
cur->next = NULL;
printf("Give me a number:");
scanf("%d",&n);
if(n > 0)
{
cur->next = (letter*)malloc(sizeof(letter));
cur=cur->next;
}
}