如何删除单链表中的任何节点

这是我的代码:

#include #include 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()只是函数名称我应该使用哪种算法? 或者删除什么或如何删除它?

不是一个答案,只是一些一般的建议

出于解决这类问题的目的,通常足以解决三种情况

  • 要删除的节点是头部
  • 要删除的节点是尾部
  • 要删除的节点位于列表的内部

你将遇到的主要麻烦来源是

  • 确保前面任何节点中的“next”字段正确重置
  • 确保调用者获得或保留指向头的有效指针。

请注意,有一个递归实现(想想n.next = remove(n.next,val) )会使这两个问题变得一致,并且您可以将它主要转换为循环以防止非常长的列表上的堆栈溢出。


可能出现的子问题是在列表中找到要删除的节点。 你可以通过分离关于从remove(node* head, node* target)找到目标节点的部分来使你的生活更轻松吗?

我在C中写了一个关于链表的教程,也许它会有所帮助:

http://www.4pmp.com/2009/10/linked-lists-in-c-push-pop-shift-and-unshift/

算法原型需要是:

 struct node * removenode(struct node *head, int y); 

因为如果您要删除第一个项目,原始的“head”指针将不再有效。

该算法只是逐步浏览列表,记住前一项(和头部),并查找数据。 找到后,将上一项的下一个指针设置为当前项的下一个。

在较高级别,要删除任何节点,您需要做的是:

1)指向指向要删除的节点的项目。

2)将要删除的项目的引用设置为要删除的项目的下一个项目。

3)删除要删除的项目。

这样,您的链就会被维护,并且您已从内存中释放该元素。

像这样:

 Head -> Item1 -> Item2 -> Item3 -> NULL 

如果你想删除Item2,你会这样:

 Head -> Item1 -> Item2 -> Item3 -> NULL ^ ^ (Grab pointers to these items) 

将Item1设置为Item2的下一个,然后删除Item2。

  /--------------\ Head -> Item1 Item2 -> Item3 -> NULL ^ ^ (Delete 2) 

编辑:删除项目或项目3:

 Head -> Item1 -> Item2 -> Item3 -> NULL ^ ^ (Grab pointers to these items) 

将头部重新指向Item2,然后删除Item1:

  /--------------\ Head Item1 -> Item2 -> Item3 -> NULL ^ ^ (Delete 1) 

要么

 Head -> Item1 -> Item2 -> Item3 -> NULL ^ ^ (Grab pointers to these items) 

将头部重新指向Item2,然后删除Item1:

  /--------------\ Head -> Item1 -> Item2 Item3 -> NULL ^ ^ (Delete 3) 

看看这是否适合你,也许是因为这样的情况存储在我的电脑的某个地方:

 void RemoveNode(struct node*x) { struct node *temp=x,*tempo=NULL; int i=0,n; printf("\nWould you like to delete a node?\nPress 1 for Yes 2 for No: "); scanf("%d",&i); if(i==1) { printf("Enter nth node to be deleted"); scanf("%d",&n); i=0; if(n==1) { x=temp->next; free(temp); } while(inext; i++; } if(temp->next->next==NULL) { tempo=temp->next; temp->next=NULL; free(tempo); } else { tempo=temp->next; temp->next=temp->next->next; free(tempo); } } else printf("\n No Changes Made\nExiting...."); } 

总是重要的是头。