2024.7.19 作业

1.链表的排序

cs 复制代码
int list_sort(NodePtr L)
{
	    if(NULL==L || L->len<=1)
    	{
	 	    printf("排序失败");
        	return -1;
    	}
   
    	int len=L->len+1;
    	NodePtr p;
    	int i,j;
    	for( i=1;i<len;i++)
    	{
        	for( j=0,p=L;j<len-i;j++,p=p->next)
        	{
            		if( p->data > p->next->data )
            		{
                		datatype t=p->data;
                		p->data=p->next->data;
                		p->next->data=t;
            		}
        	}
    	}
	    printf("排序成功\n");
	    return 0;
}

2.链表的反转(递归实现)

cs 复制代码
// 递归反转链表  
NodePtr list_fz(NodePtr L) 
{  
	    // 基础情况:空链表或只有一个节点  
    	if (L == NULL || L->next == NULL) 
	    {  
        	return L;  
    	}  

   	    NodePtr new_L = list_fz(L->next);  

   	    L->next->next = L;  
    	L->next = NULL;

    	return new_L; 
}

3.链表去重

cs 复制代码
// 去重函数
int list_dr(NodePtr L) 
{
	 NodePtr current = L;
     NodePtr prev = NULL;

   	 while (current != NULL) 
	 {
        	NodePtr runner = L;
        	prev = NULL;
        	int flag = 0;

        	// 查找当前节点的重复项
        	while (runner != current) 
		    {
            		if (runner->data == current->data) 
			        {
                		flag = 1;
                		break;
            		}
            		prev = runner;
            		runner = runner->next;
        	}

        	if (flag) 
		    {
            		// 如果是重复节点,删除当前节点
            		NodePtr temp = current;
            		if (prev != NULL) 
			        {
                		prev->next = current->next;
            		} 
			        else 
			        {
                		L = current->next; // 更新头节点
            
			        }
            		current = current->next;
            		free(temp);
        	} 	
		    else 	
		    {
            		current = current->next;
        	}
    	}
}

linklist.h

cs 复制代码
#ifndef LINKLIST_H

#define LINKLIST_H
#include <myhead.h>

typedef int datatype;

typedef struct Node
{
	union
	{
		int len;
		datatype data;
	};

	struct Node *next;
}Node,*NodePtr;

//创建链表
NodePtr list_create();

//申请节点封装数据函数
NodePtr apply_node(datatype e);

//链表判空
int list_empty(NodePtr L);

//头插
int list_insert_head(NodePtr L,datatype e);

//链表遍历函数
int list_show(NodePtr L);

//通过位置查找节点
NodePtr list_search_pos(NodePtr L,int pos);

//任意位置插入
int list_insert_pos(NodePtr L,int pos,datatype e);

//链表头删
int list_delete_head(NodePtr L);

//任意位置删除
int list_delete_pos(NodePtr L,int pos);

//通过值查找返回位置
int list_search_value(NodePtr L,datatype e);

//链表按位置进行修改
int list_update_pos(NodePtr L,int pos,datatype e);

//链表按值进行修改
int list_update_value(NodePtr L,datatype old_e,datatype new_e);

//将链表进行翻转
void list_reverse(NodePtr L);

//释放链表
void list_destroy(NodePtr L);

//链表排序
int list_sort(NodePtr L);

// 去重函数
int list_dr(NodePtr head);

// 递归反转链表 
NodePtr list_fz(NodePtr L);


#endif

linklist.c

cs 复制代码
#include "linklist.h"

NodePtr list_create()
{
	NodePtr L=(NodePtr)malloc(sizeof(Node));
	if(NULL==L)
	{
		printf("创建失败\n");
		return NULL;
	}
	L->len=0;
	L->next=NULL;
	printf("链表创建成功\n");
	return L;
}

//申请节点封装数据函数
NodePtr apply_node(datatype e)
{
	NodePtr p=(NodePtr)malloc(sizeof(Node));
	if(NULL==p)
	{
		printf("申请失败\n");
		return NULL;
	}
	p->data = e;
	p->next = NULL;
	return p;
}

//链表判空
int list_empty(NodePtr L)
{
	return L->next ==NULL;
}

//头插
int list_insert_head(NodePtr L,datatype e)
{
	if(NULL==L)
	{
		printf("链表不合法\n");
		return -1;
	}
	NodePtr p = apply_node(e);
	if(NULL==p)
	{
		return -1;
	}
	p->next=L->next;
	L->next=p;
	
	L->len++;
	printf("头插成功\n");
	return 0;

}

//链表遍历函数
int list_show(NodePtr L)
{
	if(NULL==L || list_empty(L))
	{
		printf("遍历失败\n");
		return -1;
	}	

	NodePtr q = L->next;
	while(q!=NULL)
	{
		printf("%d\t",q->data);
		q=q->next;
	}
	putchar(10);
}

//通过位置查找节点
NodePtr list_search_pos(NodePtr L,int pos)
{
	if(NULL==L || list_empty(L) || pos<0 || pos>L->len)
	{
		printf("查找失败\n");
		return NULL;
	}
	NodePtr q= L;
	for(int i=0;i<pos;i++)
	{
		q=q->next;
	}
	return q;
}

//任意位置插入
int list_insert_pos(NodePtr L,int pos,datatype e)
{
	if(NULL==L || pos<=0 ||pos>L->len+1)
	{
		printf("插入失败\n");
		return -1;
	}
	NodePtr p = apply_node(e);
	if(NULL==p)
	{
		return -1;
	}
	NodePtr q =list_search_pos(L,pos-1);

	p->next=q->next;
	q->next=p;
	
	L->len++;
	printf("插入成功\n");
	return 0;
}


//链表头删
int list_delete_head(NodePtr L)
{
	if(NULL==L || list_empty(L))
	{
		printf("删除失败\n");
		return -1;
	}
	NodePtr p=L->next;
	L->next=p->next;
	free(p);
	p=NULL;

	L->len--;
	printf("头删成功\n");
	return 0;
}

//任意位置删除
int list_delete_pos(NodePtr L,int pos)
{
	if(NULL==L || list_empty(L) || pos<1 || pos>L->len)
	{
		printf("删除失败\n");
		return -1;
	}
	NodePtr q=list_search_pos(L,pos-1);
	NodePtr p=q->next;
	q->next =p->next;
	free(p);
	p=NULL;

	L->len--;
	printf("删除成功\n");
	return 0;
}

//通过值查找返回位置
int list_search_value(NodePtr L,datatype e)
{
	if(NULL==L || list_empty(L))
	{
		printf("查找失败\n");
		return -1;
	}

	NodePtr q=L->next;
	for(int index=1;index<=L->len;index++)
	{
		if(q->data==e)
		{
			return index;
		}
		q=q->next;
	}
	printf("没找到\n");
	return -1;
}

//链表按位置进行修改
int list_update_pos(NodePtr L,int pos,datatype e)
{
	if(NULL==L || list_empty(L) || pos<1 || pos>L->len )
	{
		printf("修改失败\n");
		return -1;
	}

	list_search_pos(L,pos)->data = e;
	printf("修改成功\n");
	return 0;
}

//链表按值进行修改
int list_update_value(NodePtr L,datatype old_e,datatype new_e)
{
	if(NULL==L || list_empty(L))
	{
		printf("修改失败\n");
		return -1;
	}
	int res = list_search_value(L,old_e);
	if(res == -1)
	{
		printf("没有要修改的值\n");
		return -1;
	}
	list_update_pos(L,res,new_e);
	printf("修改成功\n");
	return 0;

}

//将链表进行翻转
void list_reverse(NodePtr L)
{
	if(NULL==L || L->len<=1)
	{
		printf("翻转失败\n");
		return;
	}
	NodePtr H = L->next;
	L->next = NULL;
	NodePtr p = NULL;
	while(H!=NULL)
	{
		p=H;
		H=H->next;
		p->next =L->next;
		L->next =p;
	}
	printf("翻转成功\n");
	return;
}

//释放链表
void list_destroy(NodePtr L)
{
	//判断逻辑
    	if(NULL == L)
    	{
        	return;
    	}

    	//将所有结点进行释放
    	while(!list_empty(L))
    	{
        	//头删
        	list_delete_head(L);
    	}

    	//释放头结点
    	free(L);
    	L = NULL;

    	printf("释放成功\n");
}




//链表排序
int list_sort(NodePtr L)
{
	if(NULL==L || L->len<=1)
    	{
	 	printf("排序失败");
        	return -1;
    	}
   
    	int len=L->len+1;
    	NodePtr p;
    	int i,j;
    	for( i=1;i<len;i++)
    	{
        	for( j=0,p=L;j<len-i;j++,p=p->next)
        	{
            		if( p->data > p->next->data )
            		{
                		datatype t=p->data;
                		p->data=p->next->data;
                		p->next->data=t;
            		}
        	}
    	}
	printf("排序成功\n");
	return 0;
}


// 递归反转链表  
NodePtr list_fz(NodePtr L) 
{  
	// 基础情况:空链表或只有一个节点  
    	if (L == NULL || L->next == NULL) 
	{  
        	return L;  
    	}  

   	NodePtr new_L = list_fz(L->next);  

   	L->next->next = L;  
    	L->next = NULL;

    	return new_L; 
} 




// 去重函数
int list_dr(NodePtr L) 
{
	NodePtr current = L;
    	NodePtr prev = NULL;

   	 while (current != NULL) 
	 {
        	NodePtr runner = L;
        	prev = NULL;
        	int flag = 0;

        	// 查找当前节点的重复项
        	while (runner != current) 
		{
            		if (runner->data == current->data) 
			{
                		flag = 1;
                		break;
            		}
            		prev = runner;
            		runner = runner->next;
        	}

        	if (flag) 
		{
            		// 如果是重复节点,删除当前节点
            		NodePtr temp = current;
            		if (prev != NULL) 
			{
                		prev->next = current->next;
            		} 
			else 
			{
                		L = current->next; // 更新头节点
            
			}
            		current = current->next;
            		free(temp);
        	} 	
		else 	
		{
            		current = current->next;
        	}
    	}
}

main.c

cs 复制代码
#include"linklist.h"

int main(int argc, const char *argv[])
{
    
	//调用函数创建一个链表
    	NodePtr L = list_create();
    	if(NULL == L)
    	{
        	return -1;
    	}

    	//调用头插函数
    	list_insert_head(L, 520);
    	list_insert_head(L, 1314);
    	list_insert_head(L, 666);
    	list_insert_head(L, 999);
    
    	//调用遍历函数
    	list_show(L);

    	//调用任意位置插入函数
    	list_insert_pos(L, 1, 100);
   	    list_insert_pos(L, 3, 100);
    	list_insert_pos(L, L->len+1, 100);
    	list_show(L);
	    printf("排序: ");
	    list_sort(L);
	    list_show(L);
	    printf("去重:");
	    list_dr(L);
	    list_show(L);
	    printf("反转:");
	    L->next=list_fz(L->next);
	    list_show(L);
    	return 0;
}

思维导图

相关推荐
系统之家装机大师17 分钟前
Win11 22H2/23H2系统11月可选更新KB5046732发布!
windows·电脑
系统之家装机大师19 分钟前
微软发布Win11 24H2系统11月可选更新KB5046740!
windows·电脑
戎梓漩2 小时前
windows下安装curl,并集成到visual studio
ide·windows·visual studio
蓝田~4 小时前
观察者模式和订阅模式
windows·观察者模式
梓仁沐白11 小时前
ubuntu+windows双系统切换后蓝牙设备无法连接
windows·ubuntu
九鼎科技-Leo15 小时前
什么是 WPF 中的依赖属性?有什么作用?
windows·c#·.net·wpf
Yang.9917 小时前
基于Windows系统用C++做一个点名工具
c++·windows·sql·visual studio code·sqlite3
我不瘦但很逗17 小时前
Windows下使用DBeaver连接云数据库(MySQL)
数据库·windows
ashane131419 小时前
Java list
java·windows·list
万里沧海寄云帆19 小时前
Word 插入分节符页码更新问题
windows·microsoft·word