#include<stdio.h>
#include<Windows.h>
#include<assert.h>
typedef int DataType;
typedef struct SListNode
{
DataType data;
struct SListNode *next;
}SListNode;
SListNode* BuySListNode(DataType x)//创建一个新的结点
{
SListNode *p = (SListNode*)malloc(sizeof(SListNode));
p->data = x;
p->next = NULL;
return p;
}
void SListPrint(SListNode* phead)//打印链表中的结点
{
assert(phead);
SListNode *p = phead;
while (p)
{
printf("%d->", p->data);
p = p->next;
}
printf("NULL\n");
}
void SListDestory(SListNode** pphead)//销毁链表
{
assert(pphead);
SListNode *p = NULL;
while (*pphead)
{
p = (*pphead)->next;
free(*pphead);
*pphead = p;
}
free(p);
free(*pphead);
p = NULL;
*pphead = NULL;
}
void SListPushBack(SListNode** pphead, DataType x)//尾插法
{
//1.建立一个新节点,判断*phead是否为空,是则将node作为p的首个节点,不是则遍历至最后一个节点,接在p->next处
assert(pphead);
SListNode *node = BuySListNode(x);
SListNode *p = *pphead;
if (p == NULL)
{
*pphead = node;
}
else
{
while (p->next != NULL)
{
p = p->next;
} p->next = node;
}
}
void SListPopBack(SListNode** pphead) //尾删法
{
//1判断链表是否为空
//2找到最后一个节点的位置并free
assert(pphead);
if (*pphead == NULL)//无节点
{
printf("slistnode is empty!");
return;
}
else if ((*pphead)->next == NULL)//一个节点
{
free(*pphead);
}
else//多个结点
{
SListNode *p = *pphead;
SListNode *prev = NULL;
while (p->next)
{
prev = p;
p = p->next;
}
prev->next = NULL;
free(p);
p = NULL;
}
}
void SListPushFront(SListNode** pphead, DataType x)
{
assert(pphead);
SListNode *p = BuySListNode(x);
if (*pphead == NULL)//若原链表为空
{
*pphead = p;
}
else
{
p->next = *pphead;
*pphead = p;
}
}
SListNode* SListFind(SListNode* phead, DataType x)//查找x所在的位置
{
assert(phead);
if (phead == NULL)
{
printf("slistnode is empty!");
return NULL;
}
else
{
SListNode *p = phead;
while (p->next)
{
if (p->data == x)
{
return p;
}
else
{
p = p->next;
}
}
printf("%d is not in this slistnode!",x);
return NULL;
}
}
void SListInsest(SListNode** pphead, SListNode* pos, DataType x)//任意位置插入
{
assert(pphead);
assert(pos);
SListNode *p = *pphead;
if (*pphead == pos)//如果插入位置是首地址
{
SListNode *u = BuySListNode(x);
u->next = *pphead;
*pphead = u;
}
else//插入位置非首地址
{
for (;p->next != pos;p = p->next)
{
;
}
SListNode *u = BuySListNode(x);
u->next = pos;
p->next = u;
}
}
void SListErase(SListNode** pphead, SListNode* pos)//任意位置删除
{
assert(pphead);
assert(pos);
if (*pphead = pos)//如果删除位置是首地址
{
*pphead = (*pphead)->next;
}
else if (pos->next == NULL)//尾地址
{
SListPopBack(pphead);
}
else//删除位置非首尾地址
{
SListNode *p = *pphead;
SListNode* next = pos->next;
while (p->next != pos)
{
p = p->next;
}
p->next = next;
}
}
链表 增删查改
猜你喜欢
转载自blog.csdn.net/ferlan/article/details/79617628
今日推荐
周排行