链表(三)——链表删除冗余结点&插入结点到有序链表

来源:互联网 发布:python读音 编辑:程序博客网 时间:2024/06/05 05:39
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.将一个结点插入到一个有序的链表中。
思路:首先要判定这个链表是递增排列的链表还是递减排列的链表,然后相对应的查找这个结点需要插入的位置。对于递增链表来说,需要查找到第一个节点值大于等于要插入的结点,然后将需要插入的结点插入到该结点前面;对于递减链表来说,需要查找到第一个小于等于要插入的结点,然后将需要插入的结点插入到该结点前面。需要考虑的特殊情况是插入的结点可能会插入在第一个位置。
#include <stdio.h>#include <malloc.h>#define NULL0typedef 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;}
1 0
原创粉丝点击