【C语言】 作业11 链表+实现函数封装

递归实现链表数据互换,纯不会,明天再说

1、链表实现以下功能

链表,创建链表,申请节点,判空,头插,遍历输出,通过位置查找节点,任意位置插入,头删,任意位置删除,安置查找返回位置,按位置进行修改,按值进行修改,翻转链表,释放链表,链表的排序,反转链表(递归实现)

cs 复制代码
//link_list.h
#ifndef LINK_LIST_H
#define LINK_LIST_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_retval(NodePtr L,datatype e);

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

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

//将链表进行翻转
int list_reserve(NodePtr L);

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

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

//链表的翻转(递归函数实现)
NodePtr list_reserve1(NodePtr L);

#endif
cs 复制代码
//link_list.c
#include "link_list.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");
	}

	NodePtr p = apply_node(e);

	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;
	}
	printf("链表中的元素是:");
	NodePtr q = L->next;
	while(q)
	{
		printf("%d->",q->data);
		q = q->next;
	}
	printf("NULL\n");
}

//通过位置查找结点
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 < 1 || pos > L->len+1)
	{
		printf("插入失败\n");
		return -1;
	}
	NodePtr p = apply_node(e);
	if(p == NULL)
	{
		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 q = L->next;
	L->next = q->next;
	free(q);
	q = NULL;
	L->len--;
	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("成功删除第%d个元素\n",pos);
	return 0;
}


//链表按值查找返回位置
int list_search_retval(NodePtr L,datatype e)
{
	if(NULL == L || list_empty(L))
	{
		printf("查找失败\n");
		return -1;
	}
	NodePtr q = L->next;
	for(int i = 1;i <= L->len;i++)
	{
		if(q->data == e)
		{
			return i;
		}
		q = q->next;
	}
	printf("没有找到该元素\n");
	return -1;
}


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


//按值进行修改
int list_updata_data(NodePtr L,datatype old_e,datatype new_e)
{
	if(NULL == L || list_empty(L))
	{
		printf("修改失败\n");
		return -1;
	}
	NodePtr q = L->next;
	while(q)
	{
		if(q->data == old_e)
		{
			q->data = new_e;
			return 0;
		}
		q = q->next;
	}
	printf("没有该元素\n");
	return -1;
}


//将链表进行翻转
int list_reserve(NodePtr L)
{
	if(NULL == L || list_empty(L) || L->len == 1)
	{
		printf("翻转失败\n");
		return 0;
	}
	NodePtr H = L->next;
	L->next = NULL;
	while(H)
	{
		NodePtr q = H;
		H = H->next;
		q->next = L->next;
		L->next = q;
	}
	printf("翻转成功\n");
	return 0;
}

//释放链表
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 || list_empty(L) || L->len ==1)
	{
		printf("排序失败\n");
		return -1;
	}
	
	for (int i = 1; i < L->len; i++) 
	{
		NodePtr p = L->next;
		for (int j = 0; j < L->len - i; j++) {
			if (p->data > p->next->data)
			{
				int temp = p->data;
				p->data = p->next->data;
				p->next->data = temp;
			}
			p = p->next;
		}
	}	
	
	printf("排序成功\n");
	return 0;
}


//链表的翻转(递归函数实现)
NodePtr list_reserve1(NodePtr L)
{
	if(NULL == L || L->len == 1)
	{
		printf("翻转失败\n");
		return L;
	}
	NodePtr q = list_reserve1(L->next);
	L->next->next = L;
	L->next = NULL;
	return q;
}
cs 复制代码
//main.c
#include "link_list.h"

int main(int argc, 	const char *argv[])
{
	NodePtr L = list_create();

	int retem = list_empty(L);
	
	list_insert_head(L,520);
	list_insert_head(L,1314);
	list_insert_head(L,123);
	list_insert_head(L,456);
	list_insert_head(L,789);
	
	list_show(L);

	
	list_insert_pos(L,2,200);
	list_show(L);

	list_delete_head(L);
	list_show(L);

	list_delete_pos(L,3);
	list_show(L);

	int retval = list_search_retval(L,200);
	if(retval != -1)
	{
		printf("该元素在第%d个位置\n",retval);
	}

	retval = list_search_retval(L,232);
	
	list_updata_pos(L,3,520);
	list_show(L);

	list_updata_data(L,456,997);
	list_show(L);



	list_reserve(L);
	list_show(L);

	list_sort(L);
	list_show(L);

	NodePtr retPtr = list_reserve1(L);
	list_show(retPtr);

	list_destroy(L);
	L = NULL;
	list_show(L);
	return 0;
}

输出结果如下:

相关推荐
gqkmiss1 分钟前
Chrome 浏览器 131 版本开发者工具(DevTools)更新内容
前端·chrome·浏览器·chrome devtools
Summer不秃7 分钟前
Flutter之使用mqtt进行连接和信息传输的使用案例
前端·flutter
旭日猎鹰11 分钟前
Flutter踩坑记录(二)-- GestureDetector+Expanded点击无效果
前端·javascript·flutter
hccee15 分钟前
C# IO文件操作
开发语言·c#
Viktor_Ye18 分钟前
高效集成易快报与金蝶应付单的方案
java·前端·数据库
hummhumm20 分钟前
第 25 章 - Golang 项目结构
java·开发语言·前端·后端·python·elasticsearch·golang
J老熊30 分钟前
JavaFX:简介、使用场景、常见问题及对比其他框架分析
java·开发语言·后端·面试·系统架构·软件工程
猿java35 分钟前
什么是 Hystrix?它的工作原理是什么?
java·微服务·面试
寻找码源40 分钟前
【头歌实训:利用kmp算法求子串在主串中不重叠出现的次数】
c语言·数据结构·算法·字符串·kmp
Matlab精灵42 分钟前
Matlab科研绘图:自定义内置多款配色函数
算法·matlab