gpt4 book ai didi

c - 向双向链表末尾插入一个元素

转载 作者:行者123 更新时间:2023-11-30 15:52:27 24 4
gpt4 key购买 nike

我正在编写一个程序,可以将元素插入到列表末尾,并显示其中一个元素。它插入正确,但我可以显示指定的。

typedef struct Node
{
int data;
struct Node *next;
struct Node *prev;
} node;

void insert(node *head, int data)
{
node *newNode = (node*) malloc(sizeof(node));
newNode->data = data;
newNode->next = NULL;

if(head == NULL)
{
head = newNode;
}
else
{
while(head != NULL)
head = head->next;

head->next = newNode;
(head->next)->prev = head;
}
}

void print(node *head, int element)
{
node *temp = head;
int count = 0, i = 1;
while(i < element)
{
temp = temp->next;
i++;
}
printf("%d", temp->data);
}

int main()
{
node *start = (node*) malloc(sizeof(node));
start = NULL;

int data1 = 4, data2 = 5;
insert(start,data1);
insert(start,data2);

print(start, 1);
}

为什么不起作用?另外,你能告诉我我这样做是否正确吗?

最佳答案

这是因为您按值传递start指针。这意味着一旦函数返回,insert 函数内对其进行的任何更改都将丢失。

您可以通过引用传递指针:

void insert(node **head, int data)
{
/* ... */
if (*head == NULL)
*head = newNode;
else
{
/* ... */
}
}

int main(void)
{
node *start = NULL;
insert(&start, 1);
/* ... */
}

或者从函数返回指针:

node *insert(node *head, int data)
{
/* ... */
return head;
}

int main(void)
{
node *start = NULL;
start = insert(start, 1);
insert(start, 2); /* Do not get the returned pointer, as the returned pointer no longer points to the start of the list */
/* ... */
}

这两个解决方案的问题是,如果 head 不为 NULL,则将其更改为指向最后一个节点之前的节点。在 insert 内的循环中,您应该使用临时指针。

<小时/>

作为安全预防措施,您应该检查 print 函数的循环中是否没有 NULL 节点。想想如果您传递的数字大于列表中的节点数,否则会发生什么情况。

关于c - 向双向链表末尾插入一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14416683/

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