【单链表】无头单项不循环(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】

相关推荐
XuanRanDev28 分钟前
【每日一题】LeetCode - 三数之和
数据结构·算法·leetcode·1024程序员节
代码猪猪傻瓜coding29 分钟前
力扣1 两数之和
数据结构·算法·leetcode
南宫生2 小时前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法
weixin_432702263 小时前
代码随想录算法训练营第五十五天|图论理论基础
数据结构·python·算法·深度优先·图论
passer__jw7673 小时前
【LeetCode】【算法】283. 移动零
数据结构·算法·leetcode
爱吃生蚝的于勒4 小时前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
羊小猪~~4 小时前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio
脉牛杂德5 小时前
多项式加法——C语言
数据结构·c++·算法
一直学习永不止步5 小时前
LeetCode题练习与总结:赎金信--383
java·数据结构·算法·leetcode·字符串·哈希表·计数
wheeldown13 小时前
【数据结构】选择排序
数据结构·算法·排序算法