不带头结点的单链表的插入,删除,原地转置,判断空,清空,统计节点数目等操作
2017-07-19 19:53
459 查看
//不带头结点的单链表 #include<stdio.h> #include<malloc.h> //链表结构体 typedef struct _Node { int val; struct _Node* next; }Node,*LinkList; void InitList(LinkList* list) { *list = NULL; } void InsertHeadList(LinkList* list) { in 4000 t data; scanf("%d", &data); while (data != 0) { Node* node = (Node*)malloc(sizeof(Node)); node->val = data; if (*list == NULL) { *list = node; (*list)->next = NULL; } else { node->next = *list; *list = node; } scanf("%d", &data); } } void Print(LinkList list) { Node* s = list; while (s != NULL) { printf("%d ", s->val); s = s->next; } printf("\n"); } void InsertTailList(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* s = *list; while (s->next != NULL) { s = s->next; } s->next = node; } scanf("%d", &data); } } void DeleteHeadList(LinkList* list) { if (*list == NULL) { return; } Node* s = *list; *list = (*list)->next; free(s); } void DeleteTailList(LinkList* list) { if (*list == NULL) { return; } Node* s = *list; if (s->next == NULL) { DeleteHeadList(list); } while (s->next->next != NULL) { s = s->next; } Node* r = s->next; s->next = s->next->next; free(r); } int Count(LinkList list) { Node* s = list; int count = 0; while (s != NULL) { s = s->next; count++; } return count; } bool IsEmpty(LinkList list) { if (list != NULL) { return false; } return true; } void Clear(LinkList* list) { while (*list != NULL) { DeleteHeadList(list); } } void Reverse(LinkList* list) { if (*list == NULL || (*list)->next == NULL) { return; } //三节点法 Node* first; Node* second; Node* last; first = *list; second = (*list)->next; last = second->next; first->next = NULL; //如果有三个节点以上开始转置 while (last != NULL) { //连接 second->next = first; //后移 first = second; second = last; last = last->next; } second->next = first; *list = second; } int main(void) { LinkList list; //初始化 InitList(&list); //插入 //头插 //InsertHeadList(&list); //尾插 InsertTailList(&list); //统计节点个数 int ncount = Count(list); printf("ncount=%d\n", ncount); //单链表原地转置 Reverse(&list); //打印 Print(list); //删除 //头删 DeleteHeadList(&list); //尾删 DeleteTailList(&list); Print(list); //判断是否为空 bool temp = IsEmpty(list); if (temp) { printf("空\n"); } else { printf("不是空\n"); } //清空 Clear(&list); temp = IsEmpty(list); if (temp) { printf("空\n"); } else { printf("不是空\n"); } return 0; }
相关文章推荐
- 带头结点的单链表的插入,删除,转置,清空,判断空,统计节点数目
- 链表的创建,插入,删除,查询,合并,清空,销毁(带头结点)
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- 带头节点循环单链表的操作(创建,保序插入,指定插入,删除指定表元,删除相同元素,统计某元素表元个数)
- 不带头结点的链表操作----插入删除打印
- java实现创建链表以及插入节点,查找结点,删除节点等操作
- 建立一个带附加头结点的单链表.实现测长/打印/删除结点/插入结点/逆置/查找中间节点/查找倒数第k个节点/判断是否有环
- 链表操作总结-包括链表合并、插入删除、清空复制、逆序
- [原]C语言实现双向链表删除节点、插入节点、双向输出等操作
- 双链表的建立、求长、定位、插入、删除、输出和释放(带头结点且成环状)
- C语言实现双向链表删除节点、插入节点、双向输出等操作
- 单链表的建立(头部延长、尾部延长)、插入操作、删除操作(无头结点的删除、有头结点的删除)
- 每天一个小程序(2)——带头结点的链表的创建以及插入和删除
- 带头结点的链表头插,尾插,中间插以及删除节点
- C语言实现双向链表删除节点、插入节点、双向输出等操作
- 不带头结点的单链表删除任意一个节点
- 带头节点链表的操作(链表的创建、删除、查找、逆转、打印等等)
- 【链表】C++链表操作大全:创建链表、遍历链表、删除链表结点、寻找环入口、链表加法、判断回文等
- 删除没有头结点的链表指点节点操作
- C语言实现单链表节点的删除(带头结点)