【数据结构】(带头结点)单链表

1. 链表

1.1概念

链表是一种在逻辑上连续,物理存储结构上非连续、非顺序的存储结构。数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

1.2优点

按需申请和释放空间。

1.3类型

带/不带头结点单向链表、双向链表、循环链表

2.带头结点单链表

因为不带头结点的单链表在头部处理起来有时比较麻烦,而太头结点的加入可以使单链表的处理更简便。

2.1存储结构

typedef struct ListNode
{
	ElemType data;       //数据域
	struct ListNode *next; //指针域
}ListNode;//结点定义

typedef ListNode* SList;//指向链表的指针

2.2接口函数

void SListInit(SList *phead);//初始化
void Push_Back(SList *phead, ElemType x);//尾插
void Push_Front(SList *phead, ElemType x);//头插
void Find_Pos(SList *phead, int pos);//按位置查找
void Find_Val(SList *phead, ElemType val);//按值查找
int Insert_Pos(SList *phead, ElemType x, int pos);//按位置插入
void Del_Pos(SList *phead, int pos);//按位置删除
void Show_List(SList phead);//打印链表
int Length(SList phead);//求链表长度
void Clear(SList *phead);//清空链表
void Destroy_List(SList *phead);//销毁链表

2.3关键操作

2.3.1初始化

(ps:不带头结点单链表不需要初始化,因为结点是动态申请的,初始时还没有结点,不带头结点时空链表的创建:

ListNode* phead=NULL;//空链表

void SListInit(SList *phead)
{
	*phead = (ListNode*)malloc(sizeof(ListNode));//申请头结点
	(*phead)->next = NULL;
}

2.3.2尾插

void Push_Back(SList *phead, ElemType x)
{
	ListNode *p = *phead;
	ListNode *s = (ListNode*)malloc(sizeof(ListNode));//申请新结点
	s->data = x;
	s->next = NULL;

	while (p->next != NULL)
	{
		p = p->next;
	}
	p->next = s;
}

2.3.3头插

void Push_Front(SList *phead, ElemType x)
{
	ListNode *s = (ListNode *)malloc(sizeof(ListNode));//申请新结点
	s->data = x;
	s->next = (*phead)->next;
	(*phead)->next = s;
}

2.3.4打印单链表

void Show_List(SList phead)
{
	ListNode *p = phead->next;
	if (phead->next == NULL)//头结点的next为空
	{
		printf("此链表为空!\n");

	}
	else
	{
		while (p != NULL)
		{
			printf("%d->", p->data);
			p = p->next;
		}
		printf("Over.\n");
	}
}

2.3.5单链表的清空

void Clear(SList *phead)
{
	ListNode *p = (*phead)->next;
	ListNode *s = NULL;
	while ((*phead)->next = NULL, p != NULL)
	{
		s = p;
		p = p->next;
		free(s);//释放当前结点
	}
}

2.3.6销毁

void Destroy_List(SList *phead)
{
	Clear(phead);
	*phead = NULL;
}

3.关键点

(1)各接口函数内部要修改链表的话,要传递地址,否则传值即可。

Push_Back(&list, item);//传地址
void Push_Back(SList *phead, ElemType x);

printf("链表长度为:%d\n", Length(list));//传值
int Length(SList phead);

(2)typedef ListNode* SList; 为指向链表的指针,SList实际上是**ListNode二级指针。

4.源代码(自取)

👉带头结点单链表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值