手撕单链表

目录

链表的概念和结构

单链表的实现

申请新结点

打印

尾插

头插

尾删

头删

​编辑

查找

在pos位置前插入元素

在pos位置后插入元素

删除pos位置的元素

删除pos位置之后的位置的元素​编辑

完整代码

SListNode.h

SListNode.c


链表的概念和结构

链表是一种物理存储上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的

链式结构逻辑连续,物理不一定连续

单链表的实现

无头 单向 非循环链表

申请新结点

打印

尾插

头插

尾删

头删

查找

在pos位置前插入元素

​​​​

在pos位置后插入元素

删除pos位置的元素

删除pos位置之后的位置的元素

完整代码

SListNode.h

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef int SLTDataType;

typedef struct SListNode
{
	SLTDataType data;
	struct SListNode* next;
}SLTNode;

SLTNode* BuySListNode(SLTDataType x);     //申请一个结点

void SListNodePrint(SLTNode* plist);      //打印

void SListPushBack(SLTNode** pplist, SLTDataType x);    //尾插

void SListPushfront(SLTNode** pplist, SLTDataType x);    //头插

void SListPopBack(SLTNode** pplist);    //尾删

void SListPopfront(SLTNode** pplist);    //头删

SLTNode* SListFind(SLTNode* plist, SLTDataType x);        //查找

void SListInsert(SLTNode** pplist, SLTNode* pos, SLTDataType x);    //在pos位置前插入元素

void SListInsertAfter(SLTNode* pos, SLTDataType x);   //在pos位置后插入元素

void SListErase(SLTNode** pplist, SLTNode* pos);     //删除pos位置前的元素

void SListEraseAfter(SLTNode* pos);          //删除pos位置之后的位置的元素

SListNode.c

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1

#include "SListNode.h"

SLTNode* BuySListNode(SLTDataType x)            //申请一个新结点
{
	SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
	if (newnode == NULL)
	{
		perror("malloc failed");
		exit(-1);
	}
	newnode->data = x;
	newnode->next = NULL;
	return newnode;
}

void SListNodePrint(SLTNode* plist)      //打印
{
	SLTNode* cur = plist;
	while (cur)
	{
		printf(" %d ->", cur->data);
		cur = cur->next;
	}
	printf("NULL");
	printf("\n");
}

void SListPushBack(SLTNode** pplist, SLTDataType x)    //尾插
{
	assert(pplist);
	SLTNode* newnode = BuySListNode(x);
	if (*pplist == NULL)
	{
		*pplist = newnode;
	}
	else
	{
		SLTNode* tail = *pplist;
		while (tail->next != NULL)
		{
			tail = tail->next;
		}
		tail->next = newnode;
	}
}

void SListPushfront(SLTNode** pplist, SLTDataType x)    //头插
{
	assert(pplist);
	SLTNode* newnode = BuySListNode(x);
	newnode->next = *pplist;
	*pplist = newnode;
	
}

void SListPopBack(SLTNode** pplist)    //尾删
{
	assert(pplist);

	assert(*pplist);//空链表
	//一个结点
	if ((*pplist)->next == NULL)
	{
		free(*pplist);
		*pplist = NULL;
	}
	//一个以上结点
	else
	{
		SLTNode* tail = *pplist;
		while (tail->next->next != NULL)
		{
			tail = tail->next;
		}
		free(tail->next);
		tail->next = NULL;
	}
}

void SListPopfront(SLTNode** pplist)    //头删
{
	assert(pplist);
	assert(*pplist);
	SLTNode* cur = *pplist;
	*pplist = (*pplist)->next;
	free(cur);
}

SLTNode* SListFind(SLTNode* plist, SLTDataType x)        //查找
{
	SLTNode* cur = plist;
	while (cur)
	{
		if (cur->data == x)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}

void SListInsert(SLTNode** pplist, SLTNode* pos, SLTDataType x)    //在pos位置前插入元素
{
	assert(pplist);
	assert(pos);
	if (*pplist == pos)
	{
		SListPopfront(pplist, x);
	}
	else
	{
		SLTNode* cur = *pplist;
		while (cur->next != pos)
		{
			cur = cur->next;
		}
		SLTNode* newnode = BuySListNode(x);
		newnode->next = cur->next;
		cur->next = newnode;
	}
}

void SListInsertAfter(SLTNode* pos, SLTDataType x)   //在pos位置后插入元素
{
	assert(pos);
	SLTNode* newnode = BuySListNode(x);
	newnode->next = pos->next;
	pos->next = newnode;
}

void SListErase(SLTNode** pplist, SLTNode* pos)     //删除pos位置的元素
{
	assert(pplist);
	assert(pos);
	if (*pplist == pos)
	{
		SListPopfront(pplist);
	}
	else
	{
		SLTNode* cur = *pplist;
		while (cur->next->next = pos)
		{
			cur = cur->next;
		}
		cur->next = pos->next;
		free(pos);
		pos = NULL;
	}
}

void SListEraseAfter(SLTNode* pos)          //删除pos位置之后的位置的元素
{
	assert(pos);
	assert(pos->next);

	SLTNode* cur = pos->next;
	pos->next = cur->next;
	free(cur);
	cur = NULL;
}
相关推荐
醇醛酸醚酮酯21 分钟前
Qt项目锻炼——TODO清单(二)
开发语言·数据库·qt
jioulongzi26 分钟前
记录一次莫名奇妙的跨域502(badgateway)错误
开发语言·python
向阳@向远方1 小时前
第二章 简单程序设计
开发语言·c++·算法
JeffersonZU1 小时前
Linux/Unix进程概念及基本操作(PID、内存布局、虚拟内存、环境变量、fork、exit、wait、exec、system)
linux·c语言·unix·gnu
Mr_Xuhhh1 小时前
信号与槽的总结
java·开发语言·数据库·c++·qt·系统架构
纳兰青华2 小时前
bean注入的过程中,Property of ‘java.util.ArrayList‘ type cannot be injected by ‘List‘
java·开发语言·spring·list
好开心啊没烦恼2 小时前
Python 数据分析:DataFrame,生成,用字典创建 DataFrame ,键值对数量不一样怎么办?
开发语言·python·数据挖掘·数据分析
liulilittle2 小时前
VGW 虚拟网关用户手册 (PPP PRIVATE NETWORK 基础设施)
开发语言·网络·c++·网关·智能路由器·路由器·通信
Devil枫2 小时前
Kotlin高级特性深度解析
android·开发语言·kotlin
ChinaDragonDreamer2 小时前
Kotlin:2.1.20 的新特性
android·开发语言·kotlin