hello~~,我是~小鹿,对你有帮助可以收藏随时找到这里哦
【C语言版数据结构】单链表接口函数代码
首先需要知道的是:单链表的每一个结点都由两部分组成,数据以及指针,每个结点中的指针存放的是下一个结点的地址。
typedef int SLTDataType;//类型名重定义,方便改存入数据类型
//单链表的基本结构
typedef struct SListNode
{
SLTDataType data;//单链表结点中的数据
struct SListNode* next;//单链表结点中存放的指针
}SLTNode;
开辟新的结点 BuyListNode
SLTNode* BuyListNode(SLTDataType x)
{
SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));//开辟空间
if (newnode == NULL)//检查是否扩容成功
{
printf("malloc fail\n");
exit(-1);
}
newnode->data = x;//将数据x放入结点
newnode->next = NULL;
return newnode;
}
打印函数 SListPrint
void SListPrint(SLTNode* phead)
{
SLTNode* cur = phead;
while (cur != NULL)
{
printf("%d -> ", cur->data);
cur = cur->next;
}
printf("NULL\n");
}
尾插 SListPushBack
注意传参时传过来的是地址,如果使用一级指针*phead接收,改变的是形参,无法改变实参,所以需要地址的地址接收才能改变实参
void SListPushBack(SLTNode** pphead, SLTDataType x)
{
assert(pphead);//断言
SLTNode* newnode = BuyListNode(x);//先开辟一个新的结点存放数据x
if (*pphead == NULL)//*pphead相当于传过来的plist
{
*pphead = newnode;
}
else
{
SLTNode* tail = *pphead;
while (tail->next != NULL)//找尾结点
{
tail = tail->next;
}
tail->next = newnode;
}
}
//尾插的使用
int main()
{
SLTNode* plist = NULL;
SListPushBack(&plist, 1);//验证尾插
SListPushBack(&plist, 2);
SListPushBack(&plist, 3);
SListPushBack(&plist, 4);
SListPrint(plist);//打印
}
运行结果
头插 SListPushFront
void SListPushFront(SLTNode** pphead, SLTDataType x)
{
assert(pphead);//断言
SLTNode* newnode = BuyListNode(x);
newnode->next = *pphead;
*pphead = newnode;
}
尾删 SListPopBack
void SListPopBack(SLTNode** pphead)
{
assert(pphead);//断言
if ((*pphead) -> next != NULL)//链表中有两个及以上结点时
{
SLTNode* tail = *pphead;
SLTNode* prev = NULL;//用于存放tail结点的前一个结点的地址
while (tail->next != NULL)
{
prev = tail;
tail = tail->next;
}
free(tail);//释放最后一个结点
tail=NULL;//置空
prev->next = NULL;//将已经尾删后的单链表的最后一个结点中存的地址置空
//另一种方法
//SLTNode* tail = *pphead;
//while (tail->next->next != NULL)
//{
// tail = tail->next;
//}
//free(tail->next);
//tail->next = NULL;
}
else//链表中只有一个结点时
{
free(*pphead);
*pphead = NULL;
}
}
头删 SListPopFrond
void SListPopFrond(SLTNode** pphead)
{
assert(pphead);//断言
SLTNode* next = (*pphead)->next;
free(*pphead);//释放
*pphead = next;
}
查找数据位置 SListFind
SLTNode* SListFind(SLTNode* phead, SLTDataType x)
{
assert(phead);//断言 确保不是空指针
SLTNode* pos = phead;
while (pos)
{
if (pos->data != x)//寻找数据位置
{
pos = pos->next;
}
else//找到了
{
return pos;
}
}
return NULL;//如果最后没有找到则返回NULL
}
在pos结点前面插入新结点 SListInsert
void SListInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{
assert(pphead);//断言
assert(pos);
SLTNode* newnode = BuyListNode(x);//开辟新结点放数据x
if (*pphead == pos)//头结点即要找的结点
{
newnode->next = *pphead;
*pphead = newnode;
}
else
{
SLTNode* posPrev = *pphead;
while (posPrev->next != pos)//寻找pos的前一个结点posPrev
{
posPrev = posPrev->next;
}
posPrev->next = newnode;
newnode->next = pos;
}
}
//SListInsert函数的使用 之后的SListInsertAfter,SListErase,SListEraseAfter同理
int main()
{
SLTNode* plist = NULL;
SListPushBack(&plist, 1);//尾插
SListPushBack(&plist, 2);
SListPushBack(&plist, 3);
SListPushBack(&plist, 4);
SLTNode* pos = SListFind(plist, 2);//查找对应数据的位置
if (pos)
{
SListInsert(&plist, pos, 30);//在数据2之前插入数据30
}
SListPrint(plist);//打印
}
运行结果
在pos位置后面插入新结点 SListInsertAfter
void SListInsertAfter(SLTNode* pos, SLTDataType x)
{
assert(pos);
SLTNode* newnode = BuyListNode(x);//开辟一个新的结点放数值x
newnode->next = pos->next;
//必须先将新结点中的指针指向原来pos后面的结点,否则将找不到原来pos后面结点的位置
pos->next = newnode;
}
删除pos位置的结点 SListErase
void SListErase(SLTNode** pphead,SLTNode* pos)
{
assert(pphead);//断言
assert(pos);
if (*pphead == pos)
{
//删除头结点
*pphead = pos->next;
free(pos);
pos = NULL;
//或者直接使用头删
//SLintPopFrond(pphead);
}
else
{
SLTNode* prev = *pphead;
while (prev->next != pos)
{
prev = prev->next;
}
prev->next = pos->next;
free(pos);
pos = NULL;
}
}
删除pos后面的结点 SListEraseAfter
void SListEraseAfter(SLTNode* pos)
{
assert(pos->next);
SLTNode* next = pos->next;
pos->next = next->next;
free(next);
next = NULL;
}
销毁链表 SListDestrony
void SListDestrony(SLTNode** pphead)
{
assert(pphead);
SLTNode* cur = *pphead;
while (cur)
{
SLTNode* next = cur->next;//提前保存下一个结点的指针,若没有则无法找到下一个结点的位置
free(cur);
cur = NULL;
}
}
本文详细介绍了C语言实现的单链表操作,包括开辟新节点、打印链表、尾插、头插、删除节点(尾删、头删)、查找数据位置、插入节点和销毁链表等接口函数的代码及使用示例。


1213

被折叠的 条评论
为什么被折叠?



