文章目录
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二级指针。