【数据结构与算法】链表(上)

记录自己所学,无详细讲解

无头单链表实现

1.项目目录文件

2.头文件 Slist.h

复制代码
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
struct Slist
{
	int data;
	struct Slist* next;
};
typedef struct Slist Slist;
//初始化
void SlistInit(Slist** phead);
//新建一个节点
Slist* Buynode(int n);
//尾插
void SlistPushback(Slist** phead, int n);
//头插
void SlistPushfront(Slist** phead, int n);
//尾删
void SlistPopback(Slist** phead);
//头删
void SlistPopfront(Slist** phead);
//查询是否存在
Slist* IsFind(Slist** phead, int n);
// 修改某个节点
void SlistModify(Slist* pos, int n);
// 删除某个节点
void SlistDel(Slist**phead, Slist* pos);
//某个节点前插入
void SlistInsertfront(Slist** phead, Slist* pos, int n);
//某个节点后插入
void SlistInsertback(Slist** phead, Slist* pos, int n);
//销毁单链表
void SlistDestory(Slist** phead);
//打印
void SlistPrint(Slist** phead);

3.函数定义源文件 Slist.c

复制代码
#include "Slist.h"
void SlistInit(Slist** phead)
{
	*phead = NULL;
   //(*phead)->next = NULL;
}
Slist* Buynode(int n)
{
	Slist* newnode = (Slist*)malloc(sizeof(Slist));
	assert(newnode);
	newnode->next = NULL;
	newnode->data = n;
	return newnode;
}
void SlistPushback(Slist** phead, int n)
{
	Slist* newnode = Buynode(n);
	if (*phead == NULL)
	{
		*phead = Buynode(n);
		printf("%d尾插成功\n", (*phead)->data);
	}
	else
	{
		Slist* cur = *phead;
		while (cur->next!=NULL)
		{
			cur = cur->next;
		}
		cur->next = newnode;
		printf("%d尾插成功\n", (newnode)->data);
	}
}
void SlistPushfront(Slist** phead, int n)
{
	Slist* newnode = Buynode(n);
	if (*phead == NULL)
	{
		*phead = newnode;
		printf("%d头插成功\n", (*phead)->data);
	}
	else
	{
		newnode->next = *phead;
		*phead = newnode;
		printf("%d头插成功\n", (*phead)->data);

	}
}
void SlistPopback(Slist** phead)
{
	assert(*phead);
	Slist* cur = *phead;
	if ((*phead)->next == NULL)
	{
		printf("%d尾删成功\n",(*phead)->data);
		free(*phead);
		*phead = NULL;
	}
	else
	{
		while ((cur->next)->next != NULL)
		{
			cur = cur->next;
		}
		printf("%d尾删成功\n", (cur->next)->data);
		free(cur->next);
		cur->next = NULL;
	}
}
void SlistPopfront(Slist** phead)
{
	assert(*phead);
	printf("%d头删成功\n", (*phead)->data);
	Slist* cur = *phead;
	*phead = (*phead)->next;
	free(cur);
	cur = NULL;
}
Slist* IsFind(Slist** phead,int n)
{
	assert(*phead);
	Slist* cur = *phead;
	while (cur != NULL)
	{
		if (cur->data == n)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}
void SlistModify(Slist* pos, int n)
{
	if (pos == NULL)
	{
		printf("修改失败,未找到节点\n");
	}
	else
	{
		pos->data = n;
		printf("修改成功\n");
	}
}
void SlistDel(Slist** phead,Slist* pos)
{
	assert(*phead);
	if (pos == NULL)
	{
		printf("删除失败,未找到节点\n");
	}
	else if (*phead == pos)
	{
		Slist* cur = *phead;
		*phead = (*phead)->next;
		free(cur);
		cur = NULL;
		printf("删除节点成功\n");
	}
	else
	{
		Slist* cur = *phead;
		while (cur->next!= pos)
		{
			cur = cur->next;
		}
		cur->next = pos->next;
		free(pos);
		pos = NULL;
		printf("删除节点成功\n");
	}
}
void SlistInsertfront(Slist** phead, Slist* pos, int n)
{
	assert(*phead);
	Slist* newnode = Buynode(n);
	Slist* cur = *phead;
	if (pos == NULL)
	{
		printf("插入失败,未找到节点\n");
	}
	else if (cur->next == NULL)
	{
		newnode->next = cur;
		*phead = newnode;
		printf("插入成功\n");
	}
	else if (cur == pos)
	{
		*phead = newnode;
		newnode->next = cur;
		printf("插入成功\n");
	}
	else
	{
		while (cur->next != pos)
		{
			cur = cur->next;
		}
		cur->next = newnode;
		newnode->next = pos;
		printf("插入成功\n");
	}
}
void SlistInsertback(Slist** phead, Slist* pos,int n)
{
	assert(*phead);
	Slist* newnode = Buynode(n);
	Slist* cur = *phead;
	if (pos == NULL)
	{
		printf("插入失败,未找到节点\n");
	}
	else
	{
		while (cur != pos)
		{
			cur = cur->next;
		}
		Slist* ccur = cur->next;
		cur->next = newnode;
		newnode->next = ccur;
		printf("插入成功\n");
	}
}
void SlistDestory(Slist** phead)
{
	Slist* cur = *phead;
	Slist* ccur = cur;
	while (cur != NULL)
	{
		ccur = cur;
		cur = cur->next;
		free(ccur);
		ccur = NULL;
	}
	*phead = NULL;
}
void SlistPrint(Slist** phead)
{
	assert(*phead);
	Slist* cur = *phead;
	while (cur != NULL)
	{
		printf("%3d", cur->data);
		cur = cur->next;
	}
}

4.函数调用测试源文件test.c

复制代码
#include "Slist.h"
int main()
{
	Slist * list;
	SlistInit(&list);
	SlistPushback(&list, 5);
	SlistPushback(&list, 4);
	SlistPushback(&list, 3);
	SlistPushback(&list, 2);
	SlistPushback(&list, 1);
	SlistPushfront(&list,6);
	SlistPushfront(&list,7);
	//SlistPopback(&list);
	//SlistPopback(&list);
	//SlistPopfront(&list);
	//SlistDel(&list,IsFind(&list, 1));
	//SlistModify(IsFind(&list, 10), 9);
	SlistInsertfront(&list, IsFind(&list, 7), 8);
	SlistInsertback(&list, IsFind(&list, 8), 10);
	//SlistPrint(&list);
	SlistDestory(&list);
	SlistPrint(&list);
}
相关推荐
Mem0rin1 分钟前
二分查找:左右边界
数据结构·算法
艾莉丝努力练剑5 分钟前
【QT:解决问题】Qt5Core.dll:无法定位程序输入点
java·开发语言·qt·学习·面试
流浪00113 分钟前
Python 基础语法(一):常量、变量、输入输出与运算符
开发语言·python
光影少年17 分钟前
react离线缓存、图片缓存方案
开发语言·前端·javascript·react native·react.js·缓存·前端框架
SomeB1oody21 分钟前
【RustyML入门】3.7. 循环层
开发语言·后端·机器学习·rust·教程
lazily-c22 分钟前
数据结构模板
数据结构
言乐63 小时前
Python游戏水平测试辅助系统
开发语言·python·游戏·django·pygame
祖力558 小时前
数据结构的基本概念与单向链表(链表数据类型构造、创建、头插、尾插、头删、尾删)
数据结构·链表
大明者省10 小时前
WSL2 Ubuntu22.04 GPU训练环境配置指南
人工智能·算法·计算机视觉
WWJA王文举10 小时前
I²C通信完整流程详解:START、地址、ACK、数据、Repeated START和STOP一次讲透
c语言·开发语言