我已经开始学习链表了,我已经编写了这段代码。
它应该是一个递归调用,在c.中的链表中创建一个新的链接
但是,如果您检查输出,您会看到它正在通过中间链接。
我不知道为什么我会失去中间环节。
顺便说一句,我的代码中确实有一个destroy函数,我只是没有在这里写它。
我确实有一个不同版本的工作代码,我不要求解决方案,我只是问为什么这个递归的想法不起作用。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef struct node {
int data;
struct node *next;
}node;
node *create(node **head, int data)
{
if(!*head) {
*head = malloc(sizeof(node));
assert(*head);
(*head)->data = data;
(*head)->next = NULL;
return *head;
}
node *new = NULL;
new = create(&new,data);
(*head)->next = new;
return *head;
}
void display(node *head)
{
assert(head);
node *current = head;
do
{
printf("%dt",current->data);
current = current->next;
}while(current);
}
int main()
{
int count = 0, data = 0;
node *head = NULL;
printf("Enter list count:n");
while(count <= 0){
scanf("%d",&count);
if(count <= 0) printf("nEnter a valid number:n");
}
while(count){
scanf("%d",&data);
head = create(&head,data);
count--;
}
printf("nHere are the elements:n");
display(head);
return 0;
}
实现的create()
要么向尾部添加新节点,要么迭代到下一个链接节点。逻辑发生了变化,影响了这一点。令人困惑的是,第一个参数被称为head
,却将其更改为n
。更改了main()
以保留head
,并使程序不具有交互性以便于测试。使用for()
循环的再生显示:
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node *next;
} node;
node *create(node **n, int data) {
if(!*n) {
*n = malloc(sizeof(**n));
assert(*n);
(*n)->data = data;
(*n)->next = NULL;
return *n;
}
node *n2 = (*n)->next;
(*n)->next = create(&n2, data);
return n2;
}
void display(node *head) {
assert(head);
for(node *c = head; c; c = c->next) {
printf("%dt", c->data);
}
}
int main() {
node *head = NULL;
node *tail = NULL;
for(int i = 0; i < 10; i++) {
tail = create(&tail, i);
if(!head) head = tail;
}
display(head);
return 0;
}
它显示:
0 1 2 3 4 5 6 7 8 9
如果您使用NDEBUG编译代码(有些人这样做是为了生产(,那么您的代码就不再有任何错误处理。
感谢大家的回答。在"向鸭子解释"了一千遍之后,我现在明白了这个问题。在函数create((中,在if((块下,我分配了(*head(->next=新;而不是首先使它指向最后一个链接,所以它只是在每次调用函数时重写下一个链接。解决方案是:
- 添加指向头部的"当前"指针(以免丢失其值(
- 遍历列表,直到找到最后一个链接
- 分配当前->接下来是new的值。以下是固定部分:
node *new = NULL;
new = create(&new,data);
node *current = *head;
while(current->next) current = current->next;
current->next = new;
return *head;