zoukankan      html  css  js  c++  java
  • 链表(三)——链表删除冗余结点&插入结点到有序链表

    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 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("
    ");
    }
    
    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;
    }
  • 相关阅读:
    Redis系列之一缓存穿透,缓存击穿,缓存雪崩
    centos 7 安装KVM
    windows 下免安装版本(zip archive)的 mysql 安装
    IDEA Scala 程序报错 Exception in thread "main" java.lang.NoClassDefFoundError: scala/Predef$
    Could not open client transport with JDBC Uri: jdbc:hive2://localhost:10000: Invalid status 16 (state=08S01,code=0)
    串口知识笔记
    C语言常用函数笔记
    流媒体服务器、海康威视 大华摄像头实现视频监控、直播解决方案(转)
    315M、433M和2.4G笔记
    MOS管开关电路笔记
  • 原文地址:https://www.cnblogs.com/llguanli/p/7171731.html
Copyright © 2011-2022 走看看