程序员成长之旅——单链表的基本操作

程序员成长之旅——单链表

什么是单链表

单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。

在这里插入图片描述
今天我来跟大家分享一下不带头的一个链表的实现。

C语言的实现

定义链表结构体

typedef int SLTDataType;
typedef struct SListNode
{
	SLTDataType _data;
	struct SListNode* _next;
}SListNode;

定义一个结构体,里面包含了一个指向链表的一个结构体指针变量

typedef struct SList
{
	SListNode* _head;
}SList;

要实现的端口

void SListInit(SList* plist);
void SListDestory(SList* plist);
SListNode* BuySListNode(SLTDataType x);
void SListPushFront(SList* plist, SLTDataType x);
void SListPopFront(SList* plist);
void SListPushBack(SList* plist, SLTDataType x);
void SListPopBack(SList* plist);
SListNode* SListFind(SList* plist, SLTDataType x);
// 在pos的后面进行插入
void SListInsertAfter(SListNode* pos, SLTDataType x);
//删除pos位置的结点
void SListEraseAfter(SListNode* pos);
void SListRemove(SList* plist, SLTDataType x);
void SListPrint(SList* plist);
void TestSList();

代码总览
SList.h

#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<malloc.h>

//单向 不带头 不循环

typedef int SLTDataType;
typedef struct SListNode
{
	SLTDataType _data;
	struct SListNode* _next;
}SListNode;

typedef struct SList
{
	SListNode* _head;
}SList;

void SListInit(SList* plist);
void SListDestory(SList* plist);
SListNode* BuySListNode(SLTDataType x);
void SListPushFront(SList* plist, SLTDataType x);
void SListPopFront(SList* plist);
void SListPushBack(SList* plist, SLTDataType x);
void SListPopBack(SList* plist);
SListNode* SListFind(SList* plist, SLTDataType x);
// 在pos的后面进行插入
void SListInsertAfter(SListNode* pos, SLTDataType x);
//删除pos位置的结点
void SListEraseAfter(SListNode* pos);
void SListRemove(SList* plist, SLTDataType x);
void SListPrint(SList* plist);
void TestSList();

SList.c

#include"SList.h"


void SListInit(SList* plist)
{
	assert(plist);
	plist->_head = NULL;
}
//构造结点
SListNode* BuySListNode(SLTDataType x)
{
	SListNode* pNewNode = (SListNode*)malloc(sizeof(SListNode));
	if (pNewNode == NULL)
	{
		printf("malloc error");
		exit(-1);
	}
	pNewNode->_data = x;
	pNewNode->_next = NULL;
	return pNewNode;
}
//头插
void SListPushFront(SList* plist, SLTDataType x)
{
	assert(plist);
	SListNode* pNewNode = NULL;
	pNewNode = BuySListNode(x);
	pNewNode->_next = plist->_head;
	plist->_head = pNewNode;
}
//头删
void SListPopFront(SList* plist)
{
	assert(plist);
	if (plist->_head == NULL)
	{
		return NULL;
	}
	SListNode* pHead = plist->_head->_next;
	free(plist->_head);
	plist->_head = NULL;
	plist->_head = pHead;
}
//尾插
void SListPushBack(SList* plist, SLTDataType x)
{
	assert(plist);
	SListNode* cur = NULL;
	SListNode* head = plist->_head;
	cur = BuySListNode(x);
	if (plist->_head == NULL)
	{
		plist->_head = cur;
	}
	else
	{
		while (head->_next)
		{
			head = head->_next;
		}
		head->_next = cur;
	}

}
//尾删
void SListPopBack(SList* plist)
{
	assert(plist);
	if (plist->_head == NULL || plist->_head->_next == NULL)
	{
		free(plist->_head);
		return NULL;
	}
	SListNode* cur = plist->_head;
	SListNode* prev = plist->_head->_next;
	while (prev->_next)
	{
		cur = cur->_next;
		prev = prev->_next;
	}
	free(prev);
	prev = NULL;
	cur->_next = NULL;
}
//查找
SListNode* SListFind(SList* plist, SLTDataType x)
{
	assert(plist);
	SListNode* cur = plist->_head;
	while (cur)
	{
		if (cur->_data == x)
		{
			return cur;
		}
		cur = cur->_next;
	}
	return cur;
}
// 在pos的后面进行插入
void SListInsertAfter(SListNode* pos, SLTDataType x)
{
	assert(pos);
	SListNode* pNew = BuySListNode(x);
	pNew->_next = pos->_next;
	pos->_next = pNew;
}
// 删除pos位置的结点
void SListEraseAfter(SListNode* pos)
{
	assert(pos && pos->_next);
	SListNode* cur = NULL;
	cur = pos->_next->_next;
	free(pos->_next);
	pos->_next = cur;
}
//移除
void SListRemove(SList* plist, SLTDataType x)
{
	assert(plist);
	SListNode* cur = plist->_head;
	SListNode* pNew = NULL;
	SListNode* prev = cur;
	while (cur)
	{
		if (cur->_data != x)
		{
			pNew = cur;
			cur = cur->_next;
		}
		else
		{
			if (cur == prev)
			{
				prev = prev->_next;
				free(cur);
				plist->_head = prev;
				cur = prev;
			}
			else
			{
				pNew->_next = cur->_next;
				free(cur);
				cur = pNew->_next;
			}
		}
	}
}
void SListPrint(SList* plist)
{
	assert(plist);
	SListNode* cur = plist->_head;
	while (cur)
	{
		printf("%d--->", cur->_data);
		cur = cur->_next;
	}
	printf("NULL\n");
}
void TestSList()
{
	SList plist;
	SListInit(&plist);
	SListPushFront(&plist, 8);
	SListPushFront(&plist, 5);
	SListPushBack(&plist, 2);
	SListPushBack(&plist, 5);
	SListInsertAfter(SListFind(&plist,8),7);
	SListEraseAfter(SListFind(&plist, 8));
	SListRemove(&plist, 5);
	SListPrint(&plist);
	SListDestory(&plist);
	SListPrint(&plist);
}
void SListDestory(SList* plist)
{
	assert(plist);
	SListNode* cur = plist->_head;
	while (cur)
	{
		plist->_head = cur->_next;
		free(cur);
		cur = NULL;
		cur = plist->_head;
	}
}

test.c

#include"SList.h"
int main()
{
	TestSList();
	system("pause");
	return 0;
}

在这里插入图片描述

扫描二维码关注公众号,回复: 8624872 查看本文章
发布了76 篇原创文章 · 获赞 16 · 访问量 4460

猜你喜欢

转载自blog.csdn.net/wuweiwuju___/article/details/97024200
今日推荐