数据结构day4

一、思维导图

二、课后练习

头文件

复制代码
#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 element);


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

//链表的头插
int list_insert_head(NodePtr L,datatype element);

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

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

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

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

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

//按值查找返回位置
int list_search_element(NodePtr L,datatype element);

//按位置修改元素
int list_update_pos(NodePtr L,int pos,datatype element);

//按值修改元素
int list_update_element(NodePtr L,datatype target,datatype element);

//链表的反转
void list_reverse(NodePtr L);

//链表的反转(递归实现)
NodePtr list_reverse_recursion(NodePtr L);

//链表去重
void list_delete_repeat(NodePtr L);

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

//链表的销毁
void list_destroy(NodePtr L);




#endif

链表的排序

复制代码
//链表的排序
void list_sort(NodePtr L)
{
	//判断逻辑
	if(NULL == L || list_empty(L))
	{
		printf("排序失败\n");
		return;
	}

	//定义指针记录排序轮数
	NodePtr N = L;
	//定义两个指针分别指向新一轮排序的前面两个元素
	NodePtr p = N;
	NodePtr q = N->next;

	//冒泡排序交换数据域
	while(N)
	{
		while(q->next)
		{
			if(p->next->data < q->next->data)
			{
				//交换数据域
				datatype temp = p->next->data;
				p->next->data = q->next->data;
				q->next->data = temp;
			}
			p = p->next;
			q = q->next;
		}
		N = N->next; 	//排序一轮,指针向后偏移
	}

	printf("排序成功\n");
}

链表逆序(递归)

复制代码
//链表的反转(递归实现)
NodePtr list_reverse_recursion(NodePtr head)
{
	//head为第一个结点
	//判断逻辑
	if(NULL == head || head->next ==NULL)
	{
		return head; 		//递归出口
	}

	//如果L不是最后一个节点,先找到最后一个节点
	NodePtr N = list_reverse_recursion(head->next);

	//下一个结点指针域指向自己
	head->next->next = head;

	//当前结点指针域置空

	head->next = NULL;

	//将最后一个结点地址向前传递
	return N;
}

链表去重

复制代码
//链表去重
void list_delete_repeat(NodePtr L)
{
	//判断逻辑
	if(NULL == L || L->next ==NULL)
	{
		printf("去重失败\n");
		return;
	}

	NodePtr p = L;
	while(p != NULL && p->next !=NULL)
	{
		if(p->data == p->next->data)
		{
			NodePtr temp = p->next;
			p->next = p->next->next;
			free(temp);

			//表长变化
			L->len--;
		}
		else
		{
			p = p->next;
		}
	}

	printf("去重成功\n");

}

功能测试

(ps:使用顺序表完成学生信息管理系统见上一篇文章)

相关推荐
蛋蛋的就会顺顺的5 小时前
hot100——矩阵
java·数据结构·算法·leetcode·力扣
学代码的CJY6 小时前
从代码出发理解时间复杂度与空间复杂度
数据结构·算法
字节跳动的猫7 小时前
LikeShop 积分体系全链路改造:获取规则、订单抵扣与积分商品兑换二开
运维·数据结构
上位机妹子8 小时前
C 语言 数组删除指定元素(快慢指针法)
c语言·数据结构·算法
C++ 老炮儿的技术栈10 小时前
有符号变量与无符号变量的区别
服务器·开发语言·前端·数据结构·c++·算法·c
keyipatience11 小时前
跳表详细解析
开发语言·数据结构·c++·算法·跳表
小小、码农12 小时前
〖Linux文件系统〗:彻底打通文件 IO 全链路
linux·开发语言·数据结构·c++·系统
INGNIGHT13 小时前
1897 · 会议室 3(扫描线)
数据结构·算法
All for pursuit.13 小时前
【贪心-2】253.会议室 II
数据结构·c++·算法·leetcode
Logic10117 小时前
C语言/数据结构字符串题解:按字符类型重排(数字→字母→符号)——三趟扫描稳定分区
c语言·数据结构·字符串·时间复杂度·计数排序·算法题·ascii