指针对c语言链表修改,C语言实现单链表基础操作--增删查改

typedef int DataType;

typedef struct ListNode

{

DataType data;

ListNode* next;

}ListNode;

注:

1.以下函数都是针对无环单链表

2.若可能修改到原链表头结点,都要传二级指针

函数如下:

ListNode* BuyNode(DataType x);//开辟新节点

void PushBack(ListNode** list, DataType data); //尾插

void PopBack(ListNode** list); //尾删

void PushFront(ListNode** list, DataType data);//头插

void PopFront(ListNode** list); //头删

void Insert(ListNode** pplist, ListNode* pos, DataType data);//定点插入

void Erase(ListNode** pplist, ListNode* pos);//定点删除

void PrintList(ListNode* list); //打印

ListNode* Find(ListNode* plist, DataType data);//查找

void DestoryList(ListNode** pplist); //释放单链表(若有环,先解环)

1.开辟新节点

ListNode* BuyNode(DataType x)

{

ListNode* p = (ListNode*)malloc(sizeof(ListNode));

p -> data = x;

p -> next = NULL;

return p;

}

2.尾插

void PushBack(ListNode** pplist, DataType data)

{

//1.空 2.非空

assert(pplist);

if (*pplist == NULL)

{

*pplist = BuyNode(data);

}

else

{

ListNode* tail = *pplist;

while(tail -> next)

{

tail = tail -> next;

}

tail -> next = BuyNode(data);

}

}

3.尾删

void PopBack(ListNode** pplist)

{

//1.空 2.1个 3.多个

assert(pplist);

if (*pplist == NULL)

{

return;

}

else if ((*pplist) -> next == NULL)

{

free(*pplist);

*pplist = NULL;

}

else

{

ListNode* tail = *pplist;

ListNode* prev = NULL;

while (tail -> next)

{

prev = tail;

tail = tail -> next;

}

free(tail);

prev -> next = NULL;

}

}

4.头插

void PushFront(ListNode** pplist, DataType data)

{

//1.空 2.非空

assert(pplist);

if (*pplist == NULL)

{

*pplist = BuyNode(data);

}

else

{

ListNode* p = BuyNode(data);

p -> next = *pplist;

*pplist = p;

}

}

5.头删

void PopFront(ListNode** pplist)

{

//1.空 2.1个 3.多个

assert(pplist);

if (*pplist == NULL)

{

return;

}

else if ((*pplist)-> next == NULL)

{

free(*pplist);

*pplist = NULL;

}

else

{

ListNode* p = (*pplist) -> next;

free(*pplist);

*pplist = p;

}

}

6.定点插入

void Insert(ListNode** pplist, ListNode* pos, DataType data)

{

assert(pplist);

assert(pos);

if (pos == *pplist)

{

PushFront(pplist, data);

}

else

{

ListNode* prev = *pplist;

while ((prev->next) != pos)

{

prev = prev -> next;

}

prev -> next = BuyNode(data);

(prev -> next) -> next = pos;

}

}

7.定点删除

void Erase(ListNode** pplist, ListNode* pos)

{

assert(pplist);

assert(pos);

if (pos == *pplist)

{

PopFront(pplist);

}

else if (pos -> next == NULL)

{

PopBack(pplist);

}

else

{

ListNode* prev = *pplist;

while ((prev -> next) != pos)

{

prev = prev -> next;

}

prev -> next = pos -> next;

free(pos);

}

}

8.打印

void PrintList_r(ListNode* plist)

{

if (plist == NULL)

{

return;

}

PrintList_r (plist -> next);

printf("%d->", plist -> data);

}

9.查找

ListNode* Find(ListNode* plist, DataType data)

{

ListNode* cur = plist;

while (cur)

{

if (cur -> data == data)

{

return cur;

}

cur = cur -> next;

}

return NULL;

}

10.释放

void DestoryList(ListNode** pplist)

{

assert(pplist);

ListNode* cur = *pplist;

while(cur)

{

ListNode* next = cur->next;

free(cur);

cur = next;

}

*pplist = NULL;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值