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

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

无头单链表实现

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);
}
相关推荐
Code哈哈笑1 分钟前
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
java·开发语言·学习
程序猿进阶5 分钟前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot
qq_433618447 分钟前
shell 编程(二)
开发语言·bash·shell
闻缺陷则喜何志丹10 分钟前
【C++动态规划 图论】3243. 新增道路查询后的最短距离 I|1567
c++·算法·动态规划·力扣·图论·最短路·路径
charlie11451419121 分钟前
C++ STL CookBook
开发语言·c++·stl·c++20
袁袁袁袁满21 分钟前
100天精通Python(爬虫篇)——第113天:‌爬虫基础模块之urllib详细教程大全
开发语言·爬虫·python·网络爬虫·爬虫实战·urllib·urllib模块教程
ELI_He99928 分钟前
PHP中替换某个包或某个类
开发语言·php
Lenyiin28 分钟前
01.02、判定是否互为字符重排
算法·leetcode
小林熬夜学编程32 分钟前
【Linux网络编程】第十四弹---构建功能丰富的HTTP服务器:从状态码处理到服务函数扩展
linux·运维·服务器·c语言·网络·c++·http
m0_7482361135 分钟前
Calcite Web 项目常见问题解决方案
开发语言·前端·rust