手撕单链表

目录

链表的概念和结构

单链表的实现

申请新结点

打印

尾插

头插

尾删

头删

​编辑

查找

在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;
}
相关推荐
mjhcsp9 小时前
C++ 后缀树(Suffix Tree):原理、实现与应用全解析
java·开发语言·c++·suffix-tree·后缀树
mjhcsp9 小时前
C++ 有限状态自动机(FSM):原理、实现与应用全解析
开发语言·c++·有限状态自动机
2301_797312269 小时前
学习java37天
开发语言·python
xifangge20259 小时前
PHP 接口跨域调试完整解决方案附源码(从 0 到定位问题)
开发语言·php
go_bai9 小时前
Linux-网络基础
linux·开发语言·网络·笔记·学习方法·笔记总结
2301_800256119 小时前
B+树:数据库的基石 R树:空间数据的索引专家 四叉树:空间划分的网格大师
数据结构·数据库·b树·机器学习·postgresql·r-tree
好大哥呀10 小时前
C++ IDE
开发语言·c++·ide
码农幻想梦10 小时前
第九章 高级数据结构
数据结构
AlenTech10 小时前
206. 反转链表 - 力扣(LeetCode)
数据结构·leetcode·链表