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

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

test5

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

test6

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

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

test8

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

test9

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

Test.c总代码

#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头文件&函数声明

头文件

#pragma once
#include
#include
#include

函数声明

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

SList.h总代码

#pragma once
#include
#include
#include

//创建单链表
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 

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

pos前面插入  

//在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);
	}
}

【单链表】无头单项不循环(2)_第1张图片【单链表】无头单项不循环(2)_第2张图片

pos后面插入

//在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;
	//头和尾都不用处理。
}

【单链表】无头单项不循环(2)_第3张图片【单链表】无头单项不循环(2)_第4张图片

pos后面删除

//删除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;
}

【单链表】无头单项不循环(2)_第5张图片

pos删除

//删除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;
	}
}

【单链表】无头单项不循环(2)_第6张图片【单链表】无头单项不循环(2)_第7张图片 

空间释放

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

SList.c总代码

#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
	}
}

【单链表】无头单项不循环(2)_第8张图片 

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

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

联系---------→【邮箱:[email protected]

你可能感兴趣的:(初阶数据结构,链表,数据结构)