【C语言】单链表的增查

单链表的基本操作

初始化

void SListInit(SListNode **ppFirst)
{
 assert(ppFirst != NULL);
 *ppFirst = NULL;
}

从头部插入

首先需要开辟空间,因为在以后的操作中还需要动态开辟空间故把开辟空间独立封装为一个函数。

开辟空间函数
static SListNode* CreatNode(DataType data)
{
 SListNode *newnode = (SListNode*)malloc(sizeof(SListNode));
 newnode->data = data;
 newnode->next = NULL;
 return newnode;
}
头插函数

动态开辟一个新的空间,使newnode->next 指向原来的头节点,ppFirst指向newnode

void SListPushFront(SListNode** ppFirst, DataType data)
{
 assert(ppFirst);
 SListNode *newnode = CreatNode(data);
 newnode->next = *ppFirst;
 *ppFirst = newnode;
}

从尾部插入

分两种情况
1)链表为空链表:直接添加一个新节点在后面即可。
2)链表中有节点:循环找到尾节点,然后在尾节点后面插入一个新节点即可。

void SListPushBack(SListNode **ppFirst, DataType data)
{
 SListNode *newnode = CreatNode(data);
 assert(ppFirst);
 if (*ppFirst == NULL)
 {
  *ppFirst = newnode;
 }
 SListNode *cur = *ppFirst;
 for (cur; cur->next != NULL; cur = cur->next)
 {
  ;
 }
 cur->next = newnode;
}

从尾部删除

首先创建两个指针,一个指向当前位置,一个指向当前位置的下一个位置,循环下一个位置的下一个位置 判断他是否为尾节点。然后将尾节点删除,尾节点的前一个节点的地址域(Next->next)置于空。

void SListPopBack(SListNode **ppFirst)
{
 SListNode *cur = *ppFirst;
 SListNode *Next = cur->next;
 while (Next->next != NULL)
 {
  Next = Next->next;
  cur = cur->next;
 }
 free(Next);
  cur->next = NULL;
}

从头部删除

将头节点暂存(防止找不到源头节点),然后让链表的起始位置指向第二个节点,最后删除掉头节点。

void SListPopFront(SListNode **ppFirst)
{
 SListNode *cur = *ppFirst;
 ppFirst = cur->next;
 free(cur);
}

从中间插入

首先开辟一个新空间,然后使插入位置的前一个节点的next指向新节点,然后新节点的next指向插入位置的节点即可。

void SListInsert(SListNode **ppFirst, SListNode *pos, DataType data)
{
 SListNode *cur = *ppFirst;
 SListNode *newnode = CreatNode(data);
 for (cur; cur->next != pos; cur = cur->next){ ; }
 cur->next = newnode;
 newnode->next = pos;
}

删除任意位置的节点

循环找到要删除的节点,然后删除它,将删除位置的前一个节点next指向要删除的后一个节点

void SListErase(SListNode **ppFirst, SListNode *pos)
{
 SListNode *cur = *ppFirst;
 for (cur; cur->next != pos; cur = cur->next){ ; }
 cur->next = pos->next;
 free(pos);
}

按值删除,只删遇到的第一个

循环找到要删除的数据的位置,然后删除它,将删除位置的前一个节点next指向要删除的后一个节点

void SListRemove(SListNode **ppFirst, DataType data)
{
 SListNode *cur = *ppFirst;
 SListNode *Next = cur->next;
 SListNode *del = NULL;
 while (Next->data != data)
	 {
  		Next = Next->next;
 		 cur = cur->next;
 	}
 del = Next->next; 
 Next->next = del->next;
 free(del);
 return;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值