您的位置:首页
链表(三)——链表删除冗余结点&插入结点到有序链表
2017-07-14 17:57
417 查看
1.一个以递增方式排列的链表,去掉链表中的冗余值。
思路一:设有两个指针p和q。使p不动,q依次往后循环直到p->data不等于q->data,再将中间的冗余数据删除。
思路二:设有两个指针p和q,使p在前,q在后,仅仅要找到一个冗余就删除一个,依次往后删除。
输入的链表:1 3 3 3 3 6 6 8 9 10
删除后的链表:1 3 6 8 9 10
比較两种思路。思路二的想法相比于思路一要好。所以这里实现思路二的代码。
2.将一个结点插入到一个有序的链表中。
思路:首先要判定这个链表是递增排列的链表还是递减排列的链表。然后相相应的查找这个结点须要插入的位置。对于递增链表来说,须要查找到第一个节点值大于等于要插入的结点,然后将须要插入的结点插入到该结点前面;对于递减链表来说,须要查找到第一个小于等于要插入的结点。然后将须要插入的结点插入到该结点前面。须要考虑的特殊情况是插入的结点可能会插入在第一个位置。
思路一:设有两个指针p和q。使p不动,q依次往后循环直到p->data不等于q->data,再将中间的冗余数据删除。
思路二:设有两个指针p和q,使p在前,q在后,仅仅要找到一个冗余就删除一个,依次往后删除。
输入的链表:1 3 3 3 3 6 6 8 9 10
删除后的链表:1 3 6 8 9 10
比較两种思路。思路二的想法相比于思路一要好。所以这里实现思路二的代码。
2.将一个结点插入到一个有序的链表中。
思路:首先要判定这个链表是递增排列的链表还是递减排列的链表。然后相相应的查找这个结点须要插入的位置。对于递增链表来说,须要查找到第一个节点值大于等于要插入的结点,然后将须要插入的结点插入到该结点前面;对于递减链表来说,须要查找到第一个小于等于要插入的结点。然后将须要插入的结点插入到该结点前面。须要考虑的特殊情况是插入的结点可能会插入在第一个位置。
#include <stdio.h> #include <malloc.h> #define NULL 0 typedef struct node { int data; struct node *next; }ElemSN; ElemSN * creat_link(int ms); //逆向创建一个链表 void print_link(ElemSN *head); //输出单向链表 void delete_rdy(ElemSN *head); //删除冗余的项 ElemSN * insert_node(ElemSN *head, int x); //插入结点到有序链表 ElemSN * clear_link(ElemSN *head); //删除链表 int main() { ElemSN *head; int ms, x; printf("Please input node number:"); scanf("%d", &ms); head = creat_link(ms); //创建链表 print_link(head); delete_rdy(head); print_link(head); head = insert_node(head, 5); print_link(head); head = clear_link(head); //删除链表 } ElemSN * creat_link(int ms) { ElemSN *h = NULL, *p; int i, x; for(i = 0; i < ms; i++) { printf("Please input data:"); scanf("%d", &x); p = (ElemSN *)malloc(sizeof(ElemSN)); p->data = x; p->next = h; h = p; } return h; } void print_link(ElemSN *head) { for(; head; head = head->next) { printf("%d ", head->data); } printf("\n"); } void delete_rdy(ElemSN *head) { ElemSN *p, *q; if(NULL == head) return; p = head; q = p->next; while(q) { if(p->data == q->data) { p->next = q->next; free(q); q = p->next; } else { p = q; q = p->next; } } } ElemSN * insert_node(ElemSN *head, int x) { ElemSN *p, *q; if(NULL == head || NULL == head->next) return NULL; p = head; q = head; //这里不能赋值为head->next,比較必须从第一个结点開始 if(q->data >= q->next->data) //递减链表 { for(; q && q->data >= x; p = q, q = q->next){} } else //递增链表 { for(; q && q->data <= x; p = q, q = q->next){} } if(NULL == q) //插入在链表尾部 { q = (ElemSN *)malloc(sizeof(ElemSN)); q->data = x; q->next = NULL; p->next = q; } else if(q == head) //插入在表首 { q = (ElemSN *)malloc(sizeof(ElemSN)); q->data = x; q->next = head; head = q; } else //插入在中间位置 { p->next = (ElemSN *)malloc(sizeof(ElemSN)); p->next->next = q; p->next->data = x; } return head; } ElemSN * clear_link(ElemSN *head) { ElemSN *p; while(head) { p = head->next; free(head); head = p; } return head; }
相关文章推荐
- 链表(三)——链表删除冗余结点&插入结点到有序链表
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- 【数据结构作业二】写出单链表结点的结构体类型定义及查找、插入、删除算法,并以单链表作存储结构,实现有序表的合并
- 从键盘读入n个整数(升序),请编写算法实现: 建立带表头结点的单链表; 显示单链表,(形如:H->10->20->30->40); 在有序单链表中插入新的数据元素x; 将单链表就地逆
- 单链表之插入删除结点
- 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
- 不带头结点的单链表的插入,删除,原地转置,判断空,清空,统计节点数目等操作
- 链表中插入和删除结点
- 初始化链表 ,插入结点,删除结点,返回结点位置 ,遍历链表 。
- 不带头结点的链表操作----插入删除打印
- 3.4 从无头链表中删除给定的结点 & 遍历一次逆转链表
- 带头结点的单链表的插入,删除,转置,清空,判断空,统计节点数目
- <笔试><面试>单链表相关(1)从尾到头打印链表、删除一个无头链表的非尾结点
- 每天一个小程序(2)——带头结点的链表的创建以及插入和删除
- 设单链表以非递减有序排列,设计算法实现在单链表中删除值相同的多余结点
- 链表的创建,插入,删除,查询,合并,清空,销毁(带头结点)
- 有序的循环链表中插入结点
- C/C++,数据结构单链表(采用C++&quot;引用&quot;方法)(寻找节点、在某处插入结点、删除某位置结点)
- c++链表 建立 输入 输出 删除结点 插入结点 释放链表 的函数
- C语言实现带头结点的链表的创建、查找、插入、删除操作