【单链表】无头单项不循环(2)

目录

Test.c主函数

test5

test6

test7

test8

test9

Test.c总代码

SList.h头文件&函数声明

头文件

函数声明

SList.h总代码

SList.c函数实现

查询SLFind

pos前面插入

pos后面插入

pos后面删除

pos删除

空间释放

SList.c总代码


今天链表。

Test.c主函数

cs 复制代码
#include"SList.h"
cs 复制代码
int main()
{
	SLNode* phead = NULL;//结构体指针变量存放结构体的地址 头节点
	test5(&phead);//测试查找
	test6(&phead);//测试在pos前面插入
	test7(&phead);//测试在pos后面插入
	test8(&phead);//测试删除pos后面的元素
	test9(&phead);//测试删除pos的元素
	return 0;
}

test5

cs 复制代码
void test5(SLNode** pphead)//测试查找
{
	SLNode*ret=SLFind(*pphead, 77);
	if (ret != NULL)
	{
		printf("找到了:%d\n", ret->val);
	}
	else
	{
		printf("没找到\n");
	}
}

test6

cs 复制代码
void test6(SLNode** pphead)//测试在pos前面位置插入的元素
{
	SLNode* ret = SLFind(*pphead, 77);
	SLInsert(pphead, ret, 34);
	SLNode* pos = SLFind(*pphead, 34);
	SLInsert(pphead, pos,  78);
	SLPrint(*pphead);
}

test7

cs 复制代码
void test7(SLNode** pphead)//测试在pos后面位置插入的元素
{
	SLNode* ret = SLFind(*pphead, 77);
	SLInsertAfter(pphead, ret, 99);
	SLPrint(*pphead);
}

test8

cs 复制代码
void test8(SLNode** pphead)//测试删除pos后面的元素
{
	SLNode* ret = SLFind(*pphead, 77);
	SLEraseAfter(pphead, ret);//99
	SLPrint(*pphead);
}

test9

cs 复制代码
void test9(SLNode** pphead)//测试删除pos的元素
{
	SLNode* ret = SLFind(*pphead, 78);
	SLErase(pphead, ret);
	SLPrint(*pphead);
}

Test.c总代码

cs 复制代码
#include"SList.h"
void test1(SLNode** pphead)//测试尾插
{
	SLPushBack(pphead, 10);
	SLPushBack(pphead, 20);
	SLPushBack(pphead, 30);
	SLPushBack(pphead, 40);
	SLPrint(*pphead);
}

void test2(SLNode** pphead)//测试头插
{
	SLPushFront(pphead, 77);
	SLPushFront(pphead, 66);
	SLPushFront(pphead, 55);
	SLPushFront(pphead, 33);
	SLPrint(*pphead);
}

//

void test3(SLNode** pphead)//测试头删
{
	SLPopFront(pphead);
	SLPopFront(pphead);
	SLPopFront(pphead);
	SLPrint(*pphead);
}

void test4(SLNode** pphead)//测试尾删
{
	SLPopBack(pphead);
	SLPopBack(pphead);
	SLPrint(*pphead);
}

void test5(SLNode** pphead)//测试查找
{
	SLNode*ret=SLFind(*pphead, 77);
	if (ret != NULL)
	{
		printf("找到了:%d\n", ret->val);
	}
	else
	{
		printf("没找到\n");
	}
}

void test6(SLNode** pphead)//测试在pos前面位置插入的元素
{
	SLNode* ret = SLFind(*pphead, 77);
	SLInsert(pphead, ret, 34);
	SLNode* pos = SLFind(*pphead, 34);
	SLInsert(pphead, pos,  78);
	SLPrint(*pphead);
}


void test7(SLNode** pphead)//测试在pos后面位置插入的元素
{
	SLNode* ret = SLFind(*pphead, 77);
	SLInsertAfter(pphead, ret, 99);
	SLPrint(*pphead);
}


void test8(SLNode** pphead)//测试删除pos后面的元素
{
	SLNode* ret = SLFind(*pphead, 77);
	SLEraseAfter(pphead, ret);//99
	SLPrint(*pphead);
}

void test9(SLNode** pphead)//测试删除pos的元素
{
	SLNode* ret = SLFind(*pphead, 78);
	SLErase(pphead, ret);
	SLPrint(*pphead);
}

int main()
{
	SLNode* phead = NULL;//结构体指针变量存放结构体的地址 头节点
	test1(&phead);//测试尾插
	test2(&phead);//测试头插
	test3(&phead);//测试尾删
    test4(&phead);//测试头删
	test5(&phead);//测试查找
	test6(&phead);//测试在pos前面插入
	test7(&phead);//测试在pos后面插入
	test8(&phead);//测试删除pos后面的元素
	test9(&phead);//测试删除pos的元素
	return 0;
}

SList.h头文件&函数声明

头文件

cs 复制代码
#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>

函数声明

  • 单链表元素查询
cs 复制代码
//找到某个数值在单链表
SLNode* SLFind(SLNode* phead, SLNDataType x);
  • 在pos前面位置插入元素
cs 复制代码
//在pos的前面插入
void SLInsert(SLNode** pphead, SLNode*pos,SLNDataType x);
  • 在pos后面插入元素
cs 复制代码
//在pos的后面插入
void SLInsertAfter(SLNode** pphead, SLNode* pos, SLNDataType x);
  • 删除pos后面的位置的元素
cs 复制代码
//删除pos的后面位置
void SLEraseAfter(SLNode** pphead, SLNode* pos);
  • 删除pos位置的元素
cs 复制代码
//删除pos位置
void SLErase(SLNode** pphead, SLNode* pos);
  • 空间释放
cs 复制代码
//空间释放
void SLDestroy(SLNode** pphead);

SList.h总代码

cs 复制代码
#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>

//创建单链表
typedef int SLNDataType;//单链表节点数据类型

typedef struct SListNode//创建节点
{
	SLNDataType val;
	struct SListNode* next;
}SLNode;

//打印数据
void SLPrint(SLNode* phead);

//尾插
void SLPushBack(SLNode** pphead, SLNDataType x);

//头插
void SLPushFront(SLNode** pphead, SLNDataType x);

//头删
void SLPopFront(SLNode** pphead);

//尾删
void SLPopBack(SLNode** pphead);

//找到某个数值在单链表
SLNode* SLFind(SLNode* phead, SLNDataType x);

//在pos的前面插入
void SLInsert(SLNode** pphead, SLNode*pos,SLNDataType x);

//在pos的后面插入
void SLInsertAfter(SLNode** pphead, SLNode* pos, SLNDataType x);

//删除pos的后面位置
void SLEraseAfter(SLNode** pphead, SLNode* pos);

//删除pos位置
void SLErase(SLNode** pphead, SLNode* pos);

//空间释放
void SLDestroy(SLNode** pphead);

SList.c函数实现

查询SLFind

cs 复制代码
//在单链表中查找某个数字
//找到了返回这个链表的地址
//没找到返回NULL
SLNode* SLFind(SLNode* phead, SLNDataType x)
{
	SLNode* cur = phead;
	while(cur)
	{
		if (cur->val == x)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}

pos前面插入

cs 复制代码
//在pos的前面插入
void SLInsert(SLNode** pphead, SLNode*pos,SLNDataType x)
{
	//严格限定单链表里面必须有一个有效节点
	assert(pphead);//应该没有人喝醉酒了吧
	assert(*pphead);
	assert(pos);
	SLNode* newnode = CreateNode(x);
	SLNode* cur = *pphead;
	SLNode* prve = NULL;
	//适合中间和尾
	if (prve)
	{
		while (cur != pos)
		{
			prve = cur;
			cur = cur->next;
		}
		prve->next = newnode;
		newnode->next = cur;
	}
	else
	{
		//头插
		SLPushFront(pphead, x);
	}
}

pos后面插入

cs 复制代码
//在pos的后面插入
void SLInsertAfter(SLNode** pphead, SLNode* pos, SLNDataType x)
{
	//严格限定单链表里面必须有一个有效节点
	assert(pphead);//应该没有人喝醉酒了吧
	assert(*pphead);
	assert(pos);
	SLNode* newnode = CreateNode(x);
	newnode->next = pos->next;
	pos->next = newnode;
	//头和尾都不用处理。
}

pos后面删除

cs 复制代码
//删除pos的后面位置
void SLEraseAfter(SLNode** pphead, SLNode* pos)
{
	//pos在最后一个不可
	assert(pos->next);
	assert(pos);
	SLNode* tmp = pos->next;
	pos->next = pos->next->next;
	free(tmp);
	tmp = NULL;
}

pos删除

cs 复制代码
//删除pos位置
void SLErase(SLNode** pphead, SLNode* pos)
{
	assert(pos);
	SLNode* cur = *pphead;
	SLNode* prve = NULL;
	if (prve)
	{
		while (cur != pos)
		{
			prve = cur;
			cur = cur->next;
		}
		prve->next = cur->next;
		free(pos);
		pos = NULL;
	}
	else
	{
		*pphead = pos->next;
		free(pos);
		pos = NULL;
	}
}

空间释放

cs 复制代码
//空间释放
void SLDestroy(SLNode** pphead)
{
	assert(*pphead);
	SLNode* cur = *pphead;
	while (cur)
	{
		SLNode* tmp = cur->next;
		free(cur);
		cur = tmp;//cur=cur->next
	}
}

SList.c总代码

cs 复制代码
#include"SList.h"
void SLPrint(SLNode* phead)
{
	assert(phead);
	SLNode* tail = phead;
	printf("phead->");
	while (tail->next != NULL)
	{
		printf("%d->", tail->val);
		tail = tail->next;
	}
	printf("NULL");
	printf("\n");
}


//创建链表的节点---结构体
SLNode* CreateNode(SLNDataType x)
{
	SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));
	if (newnode == NULL)
	{
		perror("malloc");
		return;
	}
	newnode->val = x;
	newnode->next = NULL;
	return newnode;
}

//测试尾插
void SLPushBack(SLNode** pphead, SLNDataType x)
{
	//assert(*pphead);
	SLNode* newnode = CreateNode(x);
	//无节点
	if (*pphead == NULL)
	{
		*pphead = newnode;
	}
	//多个节点
	else
	{
		SLNode* tail = *pphead;
		while (tail->next != NULL)
		{
			tail = tail->next;
		}
		tail->next = newnode;
	}

}


//头插
void SLPushFront(SLNode** pphead, SLNDataType x)
{
	//assert(*pphead);
	SLNode* newnode = CreateNode(x);
    newnode->next = *pphead;
    *pphead = newnode;
}


//---删除就涉及空间的释放---断言(删过头)
//头删
void SLPopFront(SLNode** pphead)
{
	assert(*pphead);
	SLNode* tail = *pphead;
	*pphead = (*pphead)->next;
	free(tail);
	tail = NULL;
}


//尾删
void SLPopBack(SLNode** pphead)
{
	assert(*pphead);
	//一个节点
	if ((*pphead)->next == NULL)
	{
		free(*pphead);
		*pphead = NULL;
	}
	else
	{
		SLNode* tail = *pphead;
		SLNode* prve = NULL;//虽然这里prve置为NULL和tail都是一样,但是在OJ题目当中会出错
		while (tail->next != NULL)
		{
			prve = tail;
			tail = tail->next;
		}
		prve->next = NULL;
		free(tail);
		tail = NULL;
	}
}



//在单链表中查找某个数字
//找到了返回这个链表的地址
//没找到返回NULL
SLNode* SLFind(SLNode* phead, SLNDataType x)
{
	SLNode* cur = phead;
	while(cur)
	{
		if (cur->val == x)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}




//在pos的前面插入
void SLInsert(SLNode** pphead, SLNode*pos,SLNDataType x)
{
	//严格限定单链表里面必须有一个有效节点
	assert(pphead);//应该没有人喝醉酒了吧
	assert(*pphead);
	assert(pos);
	SLNode* newnode = CreateNode(x);
	SLNode* cur = *pphead;
	SLNode* prve = NULL;
	//适合中间和尾
	if (prve)
	{
		while (cur != pos)
		{
			prve = cur;
			cur = cur->next;
		}
		prve->next = newnode;
		newnode->next = cur;
	}
	else
	{
		//头插
		SLPushFront(pphead, x);
	}
}



//在pos的后面插入
void SLInsertAfter(SLNode** pphead, SLNode* pos, SLNDataType x)
{
	//严格限定单链表里面必须有一个有效节点
	assert(pphead);//应该没有人喝醉酒了吧
	assert(*pphead);
	assert(pos);
	SLNode* newnode = CreateNode(x);
	newnode->next = pos->next;
	pos->next = newnode;
	//头和尾都不用处理。
}



//删除pos的后面位置
void SLEraseAfter(SLNode** pphead, SLNode* pos)
{
	//pos在最后一个不可
	assert(pos->next);
	assert(pos);
	SLNode* tmp = pos->next;
	pos->next = pos->next->next;
	free(tmp);
	tmp = NULL;
}


//删除pos位置
void SLErase(SLNode** pphead, SLNode* pos)
{
	assert(pos);
	SLNode* cur = *pphead;
	SLNode* prve = NULL;
	if (prve)
	{
		while (cur != pos)
		{
			prve = cur;
			cur = cur->next;
		}
		prve->next = cur->next;
		free(pos);
		pos = NULL;
	}
	else
	{
		*pphead = pos->next;
		free(pos);
		pos = NULL;
	}
}



//空间释放
void SLDestroy(SLNode** pphead)
{
	assert(*pphead);
	SLNode* cur = *pphead;
	while (cur)
	{
		SLNode* tmp = cur->next;
		free(cur);
		cur = tmp;//cur=cur->next
	}
}

最近改bug改的想砸电脑,保持冷静。下篇博客我们将继续链表其他类型。好好学习,天天向上。

代码---------→【唐棣棣 (TSQXG) - Gitee.com】

联系---------→【邮箱:2784139418@qq.com】

相关推荐
lojox6 小时前
C++ 手写 STL list(双向循环链表)原理剖析与实现
c++·链表·list
inrichtt15 小时前
第八课时:SPI总线揭秘:四线全双工通信的奥
c语言·数据结构·stm32·单片机·嵌入式硬件
HPtiger15 小时前
数据结构——选择排序
数据结构·算法·排序算法
丑梨数据16 小时前
信创环境里跑文档工具:格式兼容与本地合规的几个坑
数据结构·人工智能·算法·决策树·排序算法
烂蜻蜓16 小时前
Pandas入门教程(四):Series数据结构——创建、索引与常用方法
数据结构·pandas
CS创新实验室1 天前
一棵树怎么做到“自平衡还不太费力“?——红黑树的旋转与染色
数据结构·算法·红黑树·408·计算机考研
Logic1011 天前
C语言/数据结构位运算题解:异或XOR找出被挑选一次的果子编号——只出现一次的数字
c语言·数据结构·算法·数组·位运算·时间复杂度·空间复杂度
从小白到软工1 天前
4-3 项目-学生成绩管理系统(上)
c语言·开发语言·数据结构·经验分享·ai编程
悠仁さん1 天前
非类型模板参数的特化与偏特化
java·数据结构·算法
haluhalu.1 天前
深入理解 AI Agent(1.2):Harness 工程——模型之外的竞争力
前端·数据结构·人工智能·python·langchain·个人开发