因为链表中要进行首节点地址的传递,在增删查改时需要传递地址,而接收时则需要用二级指针接受。
例如尾删
void SListPushBack(SLTNode** pphead, SLTDataType x)
也可以使用c++的引用
void SListPushBack(SLTNode*& pphead, SLTDataType x)
单链表的头文件
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
typedef int SLTDataType;
struct SListNode
{
SLTDataType data;
struct SListNode* next;
};
typedef struct SListNode SLTNode;
//打印
void SListPrint(SLTNode* phead);
//尾插 头插
void SListPushBack(SLTNode** phead, SLTDataType x);
void SListPushFront(SLTNode** pphead, SLTDataType x);
//头删 尾删
void SListPopBack(SLTNode** pphead);
void SListPopFront(SLTNode** pphead);
//查找 修改
SLTNode* SListFind(SLTNode** pphead, SLTDataType x);
void SListInert(SLTNode** pphead, SLTNode* pos, SLTDataType x);
//任意位置的删除
void SListErase(SLTNode** pphead, SLTNode* pos);
//销毁链表
void SListDestroy(SLTNode** pphead);
#define _CRT_SECURE_NO_WARNINGS 1
#include"Sqlist.h"
void SListPrint(SLTNode* phead)
{
SLTNode* cur = phead;
while (cur != NULL)
{
printf("%d->", cur->data);
cur = cur->next;
}
printf("NULL\n");
}
//创建新的节点
SLTNode* BuySListNode(SLTDataType x)
{
SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
if (newnode == NULL)
{
printf("申请节点失败\n");
exit(-1);
}
newnode->data = x;
newnode->next = NULL;
return newnode;
}
//尾插
void SListPushBack(SLTNode** pphead, SLTDataType x)
{
SLTNode* newnode = BuySListNode(x);
if (*pphead == NULL)
{
*pphead = newnode;
}
else
{
/*找尾节点的指针*/
SLTNode* tail = *pphead;
while(tail->next != NULL)
{
tail = tail->next;
}
/*找到尾节点,链接新节点*/
tail->next = newnode;
}
}
//头插
void SListPushFront(SLTNode** pphead, SLTDataType x)
{
SLTNode* newnode = BuySListNode(x);
newnode->next = *pphead;
*pphead = newnode;
}
//尾删
void SListPopBack(SLTNode** pphead)
{
/*三种情况
1、空站
2、一个节点
3、一个以上的节点*/
if (*pphead == NULL)
{
return;
}
else if ((*pphead)->next == NULL)
{
free(*pphead);
*pphead = NULL;
}
else
{
SLTNode* prev = NULL;
SLTNode* tail = *pphead;
while (tail->next != NULL)
{
prev =tail;
tail = tail->next;
}
free(tail);
prev->next = NULL;
}
}
//头删
void SListPopFront(SLTNode** pphead)
{
SLTNode* next = (*pphead)->next;
free(*pphead);
*pphead = next;
}
SLTNode* SListFind(SLTNode** pphead, SLTDataType x)
{
SLTNode* cur = *pphead;
while (cur->data != x)
{
cur = cur->next;
}
if (cur != NULL)
{
return cur;
}
return NULL;
}
//任意位置的插入
void SListInert(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{
if (pos == *pphead)
{
SListPushFront(pphead, x);
}
else
{
SLTNode* newnode= BuySListNode(x);
SLTNode* prev = *pphead;
while (prev->next != pos)
{
prev = prev->next;
}
prev->next = newnode;
newnode->next = pos;
}
}
//任意位置的删除
void SListErase(SLTNode** pphead, SLTNode* pos)
{
if (pos == *pphead)
{
SListPopFront(pphead);
}
else
{
SLTNode* prev = *pphead;
while (prev->next != pos)
{
prev = prev->next;
}
prev->next = pos->next;
free(pos);
}
}
void SListDestroy(SLTNode** pphead)
{
SListPopBack(pphead);
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)