关于C语言数据结构—单链表
--本文章只适用于了解单链表的逻辑结构
一、单链表的定义
单链表是一种链式存取的数据结构,链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
二、单链表基本结构
1.单链表图示
2.单链表的声明与结构体
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
typedef int SLTDateType; //自定义数据类型
typedef struct SListNode
{
SLTDateType data; //节点存储数据
struct SListNode* next; //单链表节点的指针域
}SListNode;
// 动态申请一个节点
SListNode* BuySListNode(SLTDateType x);
// 单链表打印
void SListPrint(SListNode* plist);
// 单链表尾插
void SListPushBack(SListNode** pplist, SLTDateType x);
//因为要动用头节点指针,所以传递指针地址,后续二级指针收到头指针地址。
// 单链表的尾删
void SListPopBack(SListNode** pplist);
// 单链表的头插
void SListPushFront(SListNode** pplist, SLTDateType x);
// 单链表头删
void SListPopFront(SListNode** pplist);
// 单链表查找
SListNode* SListFind(SListNode* plist, SLTDateType x);
// 单链表在pos位置之后插入x
void SListInsertAfter(SListNode* pos, SLTDateType x);
// 单链表删除pos位置之后的值
void SListEraseAfter(SListNode* pos);
// 在pos的前面插入
SListNode* SLTInsert(SListNode** pphead, SListNode* pos, SLTDateType x);
// 删除pos位置
void SLTErase(SListNode** pphead, SListNode* pos);
//销毁单链表
void SLTDestroy(SListNode** pphead);
3.单链表的定义
(1)动态申请一个节点
SListNode* BuySListNode(SLTDateType x)
{
SListNode* node = (SListNode*)malloc(sizeof(SListNode)); //动态开辟一个大小为SlistNode的新空间,空间类型为(SListNode*)
node->data = x;
node->next = NULL;
return node;
}
(2)单链表打印
void SListPrint(SListNode* plist)
{
SListNode* cur = plist; //定义一个循环
while (cur)
{
printf("%d->", cur->data);
cur = cur->next;
}
printf("NULL\n");
}
(3)单链表尾插
void SListPushBack(SListNode** pplist, SLTDateType x)
{
SListNode* newnode = BuySListNode(x);
if (*pplist == NULL) //如果头指针为空,说明无链表为空
{
*pplist = newnode;
}
else
{
SListNode* tail = *pplist;
while (tail->next != NULL)
{
tail = tail->next;
}
tail->next = newnode;
}
}
(4)单链表尾删
void SListPopBack(SListNode** pplist)
{
if ((*pplist)->next == NULL || (*pplist)==NULL)//当只有一个节点或者无节点时
{
free(*pplist);
(*pplist) = NULL;
}
else
{
SListNode* prex = NULL;
SListNode* tail = *pplist;
while (tail->next != NULL)
{
prex = tail;
tail = tail->next;
}
free(tail);
prex->next = NULL;
}
}
(6)单链表头插
void SListPushFront(SListNode** pplist, SLTDateType x)
{
assert(*pplist);
SListNode* newnode = BuySListNode(x);
if (*pplist == NULL)
{
*pplist = newnode;
}
else
{
newnode->next = *pplist;
*pplist = newnode;
}
}
(7)单链表头删
void SListPopFront(SListNode** pplist)
{
assert(*pplist);
if (*pplist == NULL)
{
return;
}
else if ((*pplist)->next == NULL)
{
free(*pplist);
*pplist = NULL;
}
else
{
SListNode* next = (*pplist)->next;
free(*pplist);
*pplist = next;
}
}
(8)单链表寻找
SListNode* SListFind(SListNode* plist, SLTDateType x)
{
SListNode* cur = plist;
while (cur)
{
if (cur->data == x)
return cur;
cur = cur->next;
}
return NULL;
}
(9)单链表插入(在pos位置的后方插入)
void SListInsertAfter(SListNode* pos, SLTDateType x)
{
SListNode* next = pos->next;
SListNode* newnode = BuySListNode(x);
pos->next = newnode;
newnode->next = pos->next;
}
(10)单链表删除pos位置后方的值
void SListEraseAfter(SListNode* pos)
{
assert(pos);
SListNode* next = pos->next;
if (next != NULL)
{
SListNode* nextnext = next->next;
free(next);
pos->next = nextnext;
}
}
(11)单链表插入(在pos位置的前面插入)
SListNode* SLTInsert(SListNode** pphead, SListNode* pos, SLTDateType x)
{
assert(pphead);
assert(pos);
assert(*pphead);
if (*pphead == pos)
{
SListPushFront(pphead, x);
}
else
{
SListNode* prev = *pphead;
while (prev->next != pos)
{
prev = prev->next;
}
SListNode* newnode = BuySListNode(x);
prev->next = newnode;
newnode->next = pos;
}
}
(12)删除pos位置
void SLTErase(SListNode** pphead, SListNode* pos)
{
assert(pphead);
assert(*pphead);
assert(pos);
if (*pphead == pos)
{
SListPopFront(pphead);
}
else
{
SListNode *prev = *pphead;
while (prev->next != pos)
{
prev = prev->next;
}
prev->next = pos->next;
free(pos);
pos = NULL;
}
}
(13)销毁单链表
void SLTDestroy(SListNode** pphead)
{
if (*pphead == NULL)
{
return;
}
SListNode* cur = *pphead;
while (cur)
{
SListNode* next = cur->next;
free(cur);
cur = next;
}
*pphead = NULL;
}
总结
单链表的实现需要掌握指针的使用和动态内存分配等技术,对于提高编程能力具有重要意义。 在实际编程中,单链表常常用于解决需要动态变化长度和频繁插入和删除节点的问题,具有广泛的应用场景。 通过深入理解单链表的实现原理,可以更好地理解其他数据结构和算法,并能够更加高效地解决实际问题。 因此,学习和实现单链表对于程序员的职业发展具有积极的促进作用。
本文章为第一次作品,如有问题,欢迎在评论区赐教谢谢