如何删除单链表中的任何节点
这是我的代码:
#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...."); }
总是重要的是头。