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


    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;
    }
  • 相关阅读:
    go字面量常量
    go ssh开箱即用,注意几点
    dtle 3.x数据同步
    大厂晋升指南:材料准备,PPT 写作和现场答辩
    电商广告营销中,有哪些常见公式和优化手段?
    用Turkle库和OpenCV图像识别画一个冰墩墩
    gRPC in ASP.NET Core 3.x Protocol Buffer(3)更新消息类型 yangxu
    Rust 使用 dotenv 来设置环境变量 yangxu
    以正确的方式下载和配置 ASP.NET Core 官方源码 yangxu
    ASPOSE.Cells & ASPOSE.Words 操纵Excel和Word文档的 .NET Core 实例 yangxu
  • 原文地址:https://www.cnblogs.com/llguanli/p/7171731.html
Copyright © 2020-2023  润新知