不带头结点的单链表删除任意一个节点
2017-07-22 09:02
363 查看
#include<stdio.h> #include<malloc.h> //删除单链表中的任意一个节点,可能是传节点删除,也可能是传节点的值删除 typedef struct _Node { int val; struct _Node* next; }Node,*LinkList; //不带头结点的单链表 void Init(LinkList* list) { (*list) = NULL; } void Creat(LinkList* list) { int data; scanf("%d", &data); while (data != 0) { Node* node = (Node*)malloc(sizeof(Node)); node->val = data; node->next = NULL; if (*list == NULL) { *list = node; } else { Node* r = *list; while (r->next != NULL) { r = r->next; } r->next = node; } scanf("%d", &data); } } void Print(LinkList list) { Node* r = list; while (r != NULL) { printf("%d ", r->val); r = r->next; } printf("\n"); } /* bool DeleteNode(Node* r,LinkList* list) { if (*list == NULL || r == NULL) { return false; } Node* s = *list; while (s != NULL && s->next != r) { s = s->next; } if (s == NULL) { return false; } Node* k = s->next; s->next = s->next->next; free(k); return true; } */ //根据节点删除,还有一种方法就是,把它下一个节点的数据给它自己,然后删除它的下一个节点 bool DeleteNode(Node* r, LinkList* list) { if (*list == NULL || r == NULL) { return false; } if (r->next != NULL) { r->val = r->next->val; Node* t = r->next; r->next = r->next->next; free(t); return true; } //其它情况和下面相似 } bool DeleteNode(int data, LinkList* list) { if (*list == NULL) { return false; } Node* s = *list; while (s != NULL && s->next -> val 9848 != data) { s = s->next; } if (s == NULL) { return false; } Node* r = s->next; s->next = s->next->next; free(r); return true; } int main(void) { LinkList list; Init(&list); Creat(&list); Print(list); //删除,根据节点删除 Node* r = list->next->next; bool ret = DeleteNode(r,&list); //删除,根据传进去的值删除 //bool ret = DeleteNode(4,&list); if (ret) { printf("删除成功\n"); } else { printf("删除失败\n"); } Print(list); return 0; }
相关文章推荐
- 数据结构:设有一个不带头结点的单链表L,设计两个递归算法,del(L,x)删除单链表L中第一个值为x的节点,delall(L,x)删除单链表L中的最小节点值。
- 不带头结点的单链表的插入,删除,原地转置,判断空,清空,统计节点数目等操作
- 有一个单项的链表,在没有头结点的情况下,只知道有一个指向结点B的指针p,假设这个结点B不是尾结点,删除该节点B。
- 带头结点的单链表的插入,删除,转置,清空,判断空,统计节点数目
- 建立一个带头结点的的单向链表并输出到out53.dat和屏幕上。各节点的值为对应的下表。链表的节点数及输出地文件名作为参数传入
- C语言实现单链表节点的删除(带头结点)
- 【C语言】删除任意一个节点n(不知道头结点,且所删节点既不是头结点也不是尾节点)
- 设计一个递归算法,删除不带头结点的单链表中所有值为x的结点
- 单链表头结点未知的情况下删除任意节点
- 设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点
- 带头结点的链表头插,尾插,中间插以及删除节点
- C语言实现单链表节点的删除(带头结点)
- 建立一个带附加头结点的单链表.实现测长/打印/删除结点/插入结点/逆置/查找中间节点/查找倒数第k个节点/判断是否有环
- 每天一个小程序(2)——带头结点的链表的创建以及插入和删除
- [Happy DSA] 删除单链表中任意一个节点的方法
- 给定一个链表,链表的每一个节点包含三个属性:1、节点值;2、指向下一个结点的引用;3、随机指向链表内任意一个节点的引用,也能不指向任何节点。复制该链表
- 设ha和hb分别是两个带头节点的费递减有序单链表的表头指针,设计以算法,将将两个有序链表合成一个非递减的有序单链表,该程序以以前发表的博客中的链表中的区别在与该立案表带有头结点
- 链表——删除排序链表的重复结点(一个都不保留)
- 数据结构和算法设计专题之---单链表中在指定的节点前面插入以及删除一个节点
- 有一个特殊的链表,其中每个节点不但有指向下一个节点的指针pNext,还有一个指向链表中任意节点的指针pRand,如何拷贝这个特殊链表?