文章目录
1.链表的概念
概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。单链表的结构如下:
2.头文件
#include <stdio.h>
#include <stdlib.h>
3.单链表的创建
typedef struct SListNode
{
int data;//存储数据
SListNode* next;//指向下一个节点的指针
}SListNode;
typedef SListNode* List;
4.初始化单链表
// 动态申请一个节点
SListNode* InitList(List plist)
{
plist->next = NULL;//将头结点的next指针置空,并且头结点不存放数据
return plist;
}
5.插入
5.1头插
将一个新的数据节点插入到头结点之后,代码如下:
//头插
bool Insert_Front(List plist, int val)
{
SListNode* p = (SListNode*)malloc(sizeof(SListNode));//开辟新节点的存储空间
p->data = val;
//下面两行代码的顺序不可调换,否则头结点之后的所有数据都将丢失并造成内存泄露
p->next = plist->next;
plist->next = p;
return true;
}
5.2尾插
将一个新的数据节点插入到单链表的最后,代码如下:
//尾插
bool Insert_Back(List plist, int val)
{
SListNode* p = (SListNode*)malloc(sizeof(SListNode));//开辟新节点的存储空间
p->data = val;
//遍历单链表
SListNode* q;
for (q = plist;q->next != NULL;q = q->next);
p->next = q->next;
q->next = p;
return true;
}
6.查找
//查找
SListNode* Search(List plist, int val)
{
SListNode* p = (SListNode*)malloc(sizeof(SListNode));
//遍历链表
for (p = plist->next;p->next != NULL;p = p->next)
{
//判断数据是否相等,如果查找到则返回节点,否则要释放开辟的空间并返回空
if (p->data == val)
{
return p;
}
}
free(p);
return NULL;
}
7.删除
7.1头删
//头删
bool Delete_Front(List plist)
{
SListNode* p = plist->next;//存储头结点的下一个节点
plist->next = plist->next->next;//将头结点的下一个节点指向下个节点的下个节点
free(p);//释放原来头结点的下个节点
return true;
}
7.2尾删
//尾删
bool Delete_Back(List plist)
{
SListNode* q = NULL;
SListNode* p = plist;
while (p->next != NULL)
{
q = p;
p = p->next;
}
q->next = NULL;
free(p);
return true;
}
7.3删除数据
//删除数据
bool Delete(List plist, int val)
{
for (SListNode *p = plist->next;p->next != NULL;p = p->next)
{
if (p->next->data == val)
{
//使用覆盖删除,并释放对应数据的空间
SListNode* q = p->next;
p->next = p->next->next;
q->next = NULL;
free(q);
return true;
}
}
return false;
}
8.修改
bool SetVal(List pilist,int val,int newval)
{
for (SListNode *p = plist->next;p->next != NULL;p = p->next)
{
if (p->next->data == val)
{
p->next->data = newval;
return true;
}
}
return false;
}
9.功能性接口
9.1打印单链表数据
//输出数据
void Show(List plist)
{
for (SListNode* p = plist->next;p->next != NULL;p = p->next)
{
printf("%d ", p->data);
}
printf("\n");
}
9.2获取有效数据个数
//获取数据长度
int GetLength(List plist)
{
int count = 0;
for (SListNode* p = plist->next;p->next != NULL;p = p->next)
{
count++;
}
return count;
}
9.3销毁
//销毁内存,删除第一个节点的方法
void Destroy(List plist)
{
SListNode* p;
while (plist->next != NULL)
{
p = plist->next;
plist->next = p->next;
free(p);
}
}
9.4判空
//判空
bool IsEmpty(List plist)
{
if (plist->next == NULL)
{
return true;
}
return false;
}