我目前正在研究使用C的数据结构,现在被分配使用指针创建列表。然后在尝试将元素添加到创建的列表中时遇到问题。这是我的代码。
#include <stdio.h>
#include <stdlib.h>
struct NODE
{
int x;
char c;
struct NODE *next;
};
void make_list(struct NODE **n)
{
for(int k = 0; k < 20; k++)
{
*n = (struct NODE *)malloc(sizeof(struct NODE));
(*n)->x = k+1;
(*n)->c = 'A'+k;
n = &(*n)->next;
}
*n = NULL;
}
void print_list(struct NODE *node)
{
int k = 0;
printf("###### Content of list ######\n");
while(node != NULL)
{
printf("[%d]:x = %d, c = %c\n", k++, node->x, node->c);
node = node->next;
}
}
void append_last_node(struct NODE *node)
{
struct NODE *next;
while(node->next != NULL)
{
node->next = next;
}
node->next = (struct NODE *)malloc(sizeof(struct NODE));
node->next->next = NULL;
node->next->x = 100;
node->next->c = 'a';
}
int main()
{
struct NODE *n;
make_list(&n);
print_list(n);
append_last_node(n);
print_list(n);
return 0;
运行此命令后,仅打印在make_list函数中创建的列表,而未打印append_last_node函数,并且在打印列表后执行过程不会自动结束。
###### Content of list ######
[0]:x = 1, c = A
[1]:x = 2, c = B
[2]:x = 3, c = C
[3]:x = 4, c = D
[4]:x = 5, c = E
[5]:x = 6, c = F
[6]:x = 7, c = G
[7]:x = 8, c = H
[8]:x = 9, c = I
[9]:x = 10, c = J
[10]:x = 11, c = K
[11]:x = 12, c = L
[12]:x = 13, c = M
[13]:x = 14, c = N
[14]:x = 15, c = O
[15]:x = 16, c = P
[16]:x = 17, c = Q
[17]:x = 18, c = R
[18]:x = 19, c = S
[19]:x = 20, c = T
append_last_node函数是否存在任何错误,或者我在那里缺少某些东西?
P / S:对不起,我的英语不好。
答案 0 :(得分:0)
让我们分析一下这段代码:
struct NODE *next; while(node->next != NULL) { node->next = next; }
首先声明NODE
的指针next
,并且从未初始化。它指向内存的随机位置。通常,最好对所有内容进行初始化。
node
是列表的开头。
在第一次迭代中,node->next
是列表的第二个元素,由于列表应该包含20个元素,因此显然不为null。
向此元素分配未初始化的next
。
未定义的行为。
此时node->next
是一些随机地址,您的进程甚至可能无法访问。 最后一个节点将附加到此随机内存位置或崩溃。
您所追求的,一直循环到列表的最后一个元素。因此:
struct NODE *curr = node;
while(curr->next != NULL)
{
curr= curr->next;
}
所以curr
将是最后一个节点。