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

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

无头单链表实现

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);
}
相关推荐
宅小海16 分钟前
scala String
大数据·开发语言·scala
qq_3273427318 分钟前
Java实现离线身份证号码OCR识别
java·开发语言
锅包肉的九珍19 分钟前
Scala的Array数组
开发语言·后端·scala
心仪悦悦22 分钟前
Scala的Array(2)
开发语言·后端·scala
yqcoder1 小时前
reactflow 中 useNodesState 模块作用
开发语言·前端·javascript
Swift社区1 小时前
LeetCode - #139 单词拆分
算法·leetcode·职场和发展
baivfhpwxf20231 小时前
C# 5000 转16进制 字节(激光器串口通讯生成指定格式命令)
开发语言·c#
许嵩661 小时前
IC脚本之perl
开发语言·perl
长亭外的少年1 小时前
Kotlin 编译失败问题及解决方案:从守护进程到 Gradle 配置
android·开发语言·kotlin
直裾1 小时前
Scala全文单词统计
开发语言·c#·scala