数据结构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:使用顺序表完成学生信息管理系统见上一篇文章)

相关推荐
蹉跎x1 小时前
力扣1358. 包含所有三种字符的子字符串数目
数据结构·算法·leetcode·职场和发展
坊钰2 小时前
【Java 数据结构】移除链表元素
java·开发语言·数据结构·学习·链表
阿七想学习2 小时前
数据结构《排序》
java·数据结构·学习·算法·排序算法
越甲八千3 小时前
总结一下数据结构 树 的种类
数据结构
eternal__day3 小时前
数据结构(哈希表(中)纯概念版)
java·数据结构·算法·哈希算法·推荐算法
OTWOL4 小时前
两道数组有关的OJ练习题
c语言·开发语言·数据结构·c++·算法
不惑_4 小时前
List 集合安全操作指南:避免 ConcurrentModificationException 与提升性能
数据结构·安全·list
带多刺的玫瑰4 小时前
Leecode刷题C语言之切蛋糕的最小总开销①
java·数据结构·算法
qystca5 小时前
洛谷 P11242 碧树 C语言
数据结构·算法
冠位观测者5 小时前
【Leetcode 热题 100】124. 二叉树中的最大路径和
数据结构·算法·leetcode