首页 > 代码库 > 链表(三)——链表删除冗余结点&插入结点到有序链表
链表(三)——链表删除冗余结点&插入结点到有序链表
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 = http://www.mamicode.com/x;>链表(三)——链表删除冗余结点&插入结点到有序链表
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。