【发布时间】:2011-03-25 14:42:28
【问题描述】:
这是我的代码:
#include<stdio.h>
#include<stdlib.h>
struct node
{
int x;
struct node *next;
};
struct node *addNode(struct node *head, int y)
{
struct node *traverser;
traverser = head;
if(traverser!=NULL)
{
while(traverser->next!=NULL)
traverser=traverser->next;
traverser -> next = malloc(sizeof(struct node));
traverser -> next -> x = y;
traverser -> next -> next = NULL;
}
else
{
head= malloc(sizeof(struct node));
head -> x=y;
head -> next = NULL;
}
return head;
}
void display(struct node *head)
{
struct node *traverser;
traverser = head;
while(traverser!=NULL)
{
printf("%d\n",traverser->x);
traverser=traverser->next;
}
}
struct node *InitializeList(void)
{
return NULL;
}
int main()
{
struct node *head;
head = InitializeList();
head = addNode(head,2);
head = addNode(head,15);
head = addNode(head,5);
head = addNode(head,8);
display(head);
free(head);
getchar();
}
我需要像这样删除 main 中的一个节点
struct node *head;
head = InitializeList();
head = addNode(head,2);
head = addNode(head,15);
head = addNode(head,5);
head = addNode(head,8);
display(head);
removenode(5);
display(head);
removenode(8);
display(head);
free(head);
在我的程序中删除特定节点时,这是我的 main() 代码。
但是我该怎么做呢? removenode() 只是函数名我应该使用什么算法?或者什么或如何删除它?
【问题讨论】:
-
关于建议的副本:在删除第一个节点时,c# 在更新调用者的 head 副本方面是否存在相同的问题?可能stackoverflow.com/questions/1857457/… 是一个更好的副本,但那里的答案不完整。
-
@dmckee,无论您使用哪种语言,都必须移动头部。我认为这个问题与语言无关,因为他要求的是一种算法。与 C 的唯一真正区别是您必须确保在丢失指针之前释放节点。不管怎样,这个问题已经被问了无数次了。仅通过扫描“相关”侧边栏中的标题,就有 4 个候选重复项,专门处理从单链表中删除节点的问题,我相信如果我点击一下,我可以找到更多。我刚刚选择了第一个有不错答案的人。
-
@Karl:我只要求最好的副本,虽然您必须始终更新头部,但 c 的 use-pointers-for-pass-by-reference 语法以适合程序员习惯于具有真正的按引用传递语义的语言。以我的经验,这是学生在 c 中解决这个问题的最大障碍。
标签: c linked-list