勤时当勉励 岁月不待人
C/C++ 游戏开发
Hello,米娜桑们,这里是君兮_,我们接着之前讲过的顺序表来继续介绍初阶数据结构的内容,今天给大家带来的是有关链表的基本知识和各种接口功能的实现的第二部分。
好了,废话不多说,开始今天的学习吧!—
#pragma once
#include
#include
#include
typedef int SLTDataType;
typedef struct SListNode
{
SLTDataType Data;
struct SListNode * next;
}SLTNode;
//打印链表
void SLTPrint(SLTNode* phead);
//初始化链表
SLTNode* BuySListNode(SLTDataType x);
void SLTPushBack(SLTNode** pphead, SLTDataType x);
void SLTPushFront(SLTNode** pphead, SLTDataType x);
void SLTPopBack(SLTNode** pphead);
void SLTPopFront(SLTNode** pphead);
// 找某个数
SLTNode* SLTFind(SLTNode* phead, SLTDataType x);
// 在pos之前插入x
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x);
// 在pos以后插入x
void SLTInsertAfter(SLTNode* pos, SLTDataType x);
// 删除pos位置
void SLTErase(SLTNode** pphead, SLTNode* pos);
// 删除pos的后一个位置
void SLTEraseAfter(SLTNode* pos);
//修改pos位置的值
void SLTModify(SLTNode**pphead, SLTNode* pos, SLTDataType x);
// 单链表的销毁
void SListDestroy(SLTNode** pphead);
//找某个节点是否存在
SLTNode* SLTFind(SLTNode* phead, SLTDataType x)
{
SLTNode* cur = phead;
while (cur)
{
if (cur->Data == x)
return cur;
cur = cur->next;
}
printf("该节点不存在\n");
return NULL;
}
//修改某个节点的值
void SLTModify(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{
pos->Data = x;
}
void TestSList2()
{
int n = 0;
int x = 0;
printf("请输入需要定义的链表的长度:\n");
scanf("%d", &n);
printf("请输入需要放入链表中的元素,中间用空格隔开\n");
SLTNode* plist = NULL;
int val = 0;
for (size_t i = 0; i < n; i++)
{
scanf("%d", &val);
SLTPushBack(&plist, val);
}
SLTPrint(plist);
//SLTFind(plist, 5);
printf("请输入要修改的值\n");
scanf("%d", &x);
SLTNode* pos = SLTFind(plist, x);
if (pos)
{
int m;
printf("请输入要把该节点修改成什么值:\n");
scanf("%d", &m);
SLTModify(&plist, pos, m);
}
SLTPrint(plist);
}
// 在pos之前插入x
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{
SLTNode* cur = *pphead;
SLTNode* newnode = BuySListNode(x);
//如果没有节点时就得头插
assert(pphead);
assert(pos);
if (pos == *pphead)
{
SLTPushFront(pphead, x);
}
else {
while (cur->next)
{
if (cur->next->Data == pos->Data)
{
cur->next = newnode;
newnode->next = pos;
}
cur = cur->next;
}
}
}
// 在pos以后插入x
void SLTInsertAfter(SLTNode* pos, SLTDataType x)
{
SLTNode* cur = BuySListNode(x);
cur->next = pos->next;
pos->next = cur;
}
// 删除pos位置
void SLTErase(SLTNode** pphead, SLTNode* pos)
{
SLTNode* cur = *pphead;
assert(pos);
assert(pphead);
if (pos == *pphead)
{
SLTPopFront(pphead);
}
else
{
while (cur)
{
if (cur->next == pos)
{
cur->next = pos->next;
free(pos);
}
cur = cur->next;
}
}
}
// 删除pos的后一个位置
void SLTEraseAfter(SLTNode* pos)
{
assert(pos);
//检查是否是尾节点
assert(pos->next);
pos->next = pos->next->next;
free(pos->next);
pos->next = NULL;
}
// 单链表的销毁
void SListDestroy(SLTNode** pphead)
{
assert(pphead);
SLTNode* cur = *pphead;
while (cur)
{
SLTNode* next = cur->next;
free(cur);
cur = next;
}
*pphead = NULL;
}
由于篇幅有限,今天的内容到这里就结束了,本篇我们把剩下没讲的接口讲完了,之后会再带大家做几道oj题让大家更加熟悉链表的实际应用。相信如果你能一直跟着坚持下去那么你链表这一块的初阶知识就一定没什么问题啦!切记要自己上手敲敲代码哦!
好了,如果你有任何疑问欢迎在评论区或者私信我提出,大家下次再见啦!
新人博主创作不易,如果感觉文章内容对你有所帮助的话不妨三连一下这个新人博主再走呗。你们的支持就是我更新的动力!!!
**(可莉请求你们三连支持一下博主!!!点击下方评论点赞收藏帮帮可莉吧)**