一、 什么是链表?
1.物理存储单元,非连续,非顺序的存储结构 ;
2.数据元素的逻辑顺序通过链表的指针链接次序实现;
3.链表由一系列的结点构成,结点可以在运行时动态生成;
4.每个结点由(1)存储数据元素的数据域;(2)存储下一个结点地址指的指针域
链表特点:线性表的链式存储表示的特点是用一组任意的存储单元存储线性表中的数据元素(存储单元可连续,可不连续)
链表的分类?8种不同的链表
1.带头结点/不带头结点
2.单向链表/双向链表
3.循环/非循环
- 不带头结点的单向非循环链表
- 带头结点的双向循环链表
线性表–链表增、删、查、改
链式结构的基本插入,删除,修改,改动结点的代码是最基本的
代码目录
0.包含头文件和结构体
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
typedef int SListDataType;
//定义的不是链表的结构体,而是链表中一个节点的结构体
typedef struct ListNode
{
SListDataType value; //保存的值
struct ListNode *next; //保存下一结点的地址
} Node;
typedef struct SList
{
Node *first;//Node *head;
} SList;
…
…
初始化/销毁链表
//初始化
void SListInit(SList *s)
{
assert(s != NULL);
s->first = NULL;
}
//销毁整个链表
void SListDestroy(SList *s)
{
Node *next;
for (Node* cur = s->first; cur != NULL; cur = next)
{
next = cur->next;
free(cur);
}
s->first = NULL;
}
1.头插、尾插、指定位置插
//头插
void SListPushFront(SList *s, SListDataType v)
{
Node *node = (Node *)malloc(sizeof(Node));
node->value = v;
node->next = s->first;
s->first