【链表】C语言链表

@C语言链表

前言:最近在学习链表相关的东西。

在工作中,发现无论是操作系统或者数据存储相关时,都会涉及链表这种数据结构的使用,对双向循环链表、单链表学习基础上,接触其它博主发布的对链表的使用,做一个小小的学习汇总,如下。
1,删除链表某个元素
删除元素时,容易在对链表节点的操作出现错误,看了多个博主写的链表删除代码,我觉得下面这种效率高且较于理解。
#include <stdio.h>
#include <malloc.h>
typedef int SLTDateType;
typedef struct SlistNode
{
SLTDateType data;
struct SlistNode* next;
}SLTNode;

void SListPrint(SLTNode** phead)
{
//此处不能加assert()函数,如果链表为空,会报异常
SLTNode* cur = *phead;
if (cur == NULL)
{
printf(“phead is NULL”);
}
while (cur)
{
printf("data:%d ", cur->data);
cur = cur->next;
}

printf("\n");

}
//插入第一个节点
SLTNode* BuyListNode(SLTDateType x)
{
SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
newnode->data = x;
newnode->next = NULL;
return newnode;
}

void SListPushBack(SLTNode** phead, SLTDateType x)
{
SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
newnode->data = x;
newnode->next = NULL;
if (*phead == NULL)
{
phead = newnode;
}
else
{
SLTNode
cur = *phead;
while (cur->next)
{
cur = cur->next;
}
cur->next = newnode;
}

}

struct SLTNode * deleteList_value(struct SLTNode head, SLTDateType i)
{
SLTNode
dummyHead =(SLTNode*) malloc(sizeof(SLTNode));
dummyHead->next=head;
SLTNode* temp = dummyHead;//后续dummyHead跟随head链表的改变改变
//head为原链表,dummyHead为head加空头后的链表,temp则是改变加空头后链表的装载指向。
while (temp->next != NULL) {

	if (temp->next->data == i)
		temp->next = temp->next->next;
	else
		temp = temp->next;
}
return dummyHead->next;

}
void main()
{
SLTNode *phead=BuyListNode(5);
//SListPushBack(&phead, 10);
SListPrint(&phead);
phead=deleteList_value(phead, 5);
//phead = deleteList_value(phead, 5);
SListPrint(&phead);

}
2.反转链表
(1)改变链表中节点指向
struct SLTNode* inverseSLTNode(struct SLTNode* head)
{
SLTNode* cur = (SLTNode*)malloc(sizeof(SLTNode));
cur = head;
SLTNode prev= NULL;
while (cur->next != NULL) {
SLTNode
next = cur->next;
cur->next = prev;
prev = cur;
cur = next;//后面指向前面,需要新增节点改变方向
}
return prev;
}
(2)新增节点,头插方式,改变指针指向
struct SLTNode* inverseSLTNode(struct SLTNode* head)
{
SLTNode* cur = (SLTNode*)malloc(sizeof(SLTNode));
cur = head;
SLTNode* newhead = NULL;
while (cur) {
SLTNode* next = cur->next;
cur->next = newhead;//使cur的指向反向
newhead = cur;//将newhead的指向改为cur的指向
cur = next;//指向下一个元素
}
return newhead;
}
3.返回链表的中间节点
(1)数组法
待更新
(2)单指针法
待更新
(3)快慢指针
//返回中间节点及到链表末尾的节点
SLTNode* middleNode(SLTNode* head) {
SLTNode* slow = head;
SLTNode* fast = head;
while((fast !=NULL) && (fast->next !=NULL)) {
slow = slow->next;
fast = fast->next->next;
}
//slow->next = NULL;//如果只返回中间节点的值,这里可以把中间节点指向置空
return slow;
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值