gpt4 book ai didi

c - 使用双指针在 C 中插入链表

转载 作者:行者123 更新时间:2023-11-30 19:03:53 24 4
gpt4 key购买 nike

嗨,我是学习链接列表的新手,我创建了这个示例程序,但它没有填充所有列表,只有最后两个被填充(或者这些覆盖第一个链接元素)

有人可以帮我看看是什么原因导致了这个问题吗?

#include<stdio.h>
#include<stdlib.h>

struct node {
int data;
struct node *link;
};

void appendNode(int data, struct node **ptr) {

struct node *newnode = (struct node*)malloc(sizeof(struct node));

newnode->data = data;
newnode->link = NULL;

if(*ptr == NULL) {
*ptr = newnode;
} else {
while((*ptr)->link != NULL ) {
*ptr = (*ptr)->link;
}
(*ptr)->link = newnode;
}

}

void printList(struct node *node)
{
while (node != NULL)
{
printf(" %d ", node->data);
node = node->link;
}
}

int main() {

struct node *head = NULL ;

appendNode(23,&head);
appendNode(45,&head);
appendNode(32,&head);
appendNode(11,&head);
appendNode(98,&head);
printList(head);

}

红外打印

 11  98 

是什么导致了这里的问题?

最佳答案

您的问题是您正在 appendNode[1] 中使用指针本身进行迭代。每次您将某些内容分配给 *ptr 时,都会更改列表地址,例如

     *ptr = newnode;
...
*ptr = (*ptr)->link;

每次分配 *ptr 时,列表地址都会更改(如 appendNodemain())

你的列表操作是正确的,你需要做的就是使用一个临时指针来迭代列表(下面的iter)

void appendNode (int data, struct node **ptr) {

struct node *newnode = malloc (sizeof *newnode),
*iter = *ptr;

if (!newnode) { /* VALIDATE every allocation */
perror ("malloc-newnode");
exit (EXIT_FAILURE);
}

newnode->data = data;
newnode->link = NULL;

if (iter == NULL) {
*ptr = newnode;
}
else {
while (iter->link != NULL) {
iter = iter->link;
}
iter->link = newnode;
}
}

(注意使用与 sizeof 一起使用的解引用指针来设置类型大小。如果使用解引用指针来设置大小,则可以消除任何错误设置所需的实际类型。此外,如果您分配 - 您必须每次都验证)

进行此更改(以及对 printList 进行以下更改)

void printList (struct node *node) 
{
while (node != NULL)
{
printf(" %d ", node->data);
node = node->link;
}
putchar ('\n'); /* tidy up with newline */
}

您的列表工作得很好,例如

示例使用/输出

$ ./bin/lllast2
23 45 32 11 98

脚注:

1. 虽然不是错误,但 C 通常会避免使用 camelCaseMixedCase 变量名称,而倾向于使用所有较低的 -case,同时保留大写的名称以与宏和常量一起使用。这是一个风格问题 - 所以这完全取决于你,但不遵循它可能会导致某些圈子中错误的第一印象。

关于c - 使用双指针在 C 中插入链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53355182/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com