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

相关推荐
BK贝壳9 小时前
bool-hybrid-array 落盘我只认 .bha:用 Create_BHA / Ask_BHA 做布尔数组序列化
数据结构·python·numpy·1024程序员节
?abc!12 小时前
(数组)581. 最短无序连续子数组
数据结构·算法·leetcode
爱读书的小胖16 小时前
LeetCode 55 跳跃游戏 C 语言解题分析
c语言·数据结构·算法·leetcode·1024程序员节
舰长11516 小时前
将百万数据插入到 Redis,有哪些实现方案?
数据结构·redis·开源
若亦_17 小时前
数据结构>>优先级队列(堆)
java·数据结构
bksczm18 小时前
Redis数据结构之hash
数据结构·redis·哈希算法·1024程序员节
星夜离尘5621 小时前
MATLAB 因果采样保持:用历史匹配和数据年龄防止未来信息泄漏
数据结构·算法·matlab
思麟呀21 小时前
BTree的原理与 C++ 完整实现
c语言·数据结构·c++·算法·1024程序员节
黄俊懿21 小时前
【架构师从入门到进阶】第七章:缓存和存储的优化思路——第一节:缓存概述
数据结构·数据库·分布式·缓存·架构·系统架构·1024程序员节
晒太羊的猫1 天前
hot100 堆
数据结构