2.3线性表的链式表示
顺序表的优缺点:
优点:可随机存储,存储密度高
缺点:要求大片连续空间,且改变容量不方便
2.3.1 单链表的基本概念
单链表:用链式存储实现了线性结构。一个结点存储一个数据元素,各结点间的前后关系用一个指针表示。
优点:不要求大片连续空间,改变容量方便。
缺点:不可随机存取,要耗费一定空间存放指针。
//用代码定义一个单链表
struct LNode{ //LNode是结点
ElemType data; //data为数据域 定义单链表结点类型
struct LNode *next; //*next是指针域 指针指向下一个结点
}
struct LNode *p = (struct LNode *)malloc(sizeof(struct LNode));
//增加一个新的结点:在内存中申请一个结点所需空间,并用指针n指向这个结点
typedef关键字——数据类型重命名
typedef <数据类型> <别名>
typedef struct LNode LNode; //这样使用就可以直接哟弄个LNode 不需要前面加一长串
typedef struct LNode *LinkList;
要表示一个单链表时,只需要表明一个头指针L,指向单链表的第一个结点
LNode *L; //声明一个指向单链表第一个结点的指针
或
LinkList L; //声明一个指向单链表第一个结点的指针 代码可读性更强
不带头结点的单链表
typedef struct LNode{ //定义单链表结点类型
ElemType data; //每个节点存放一个数据元素
struct LNode *next; //指针指向下一个节点
}LNode, *LinkList;
//初始化一个空的单链表
bool InitList(LinkList &L){
L = NULL; //空表,暂时还没有任何结点 防止脏数据
return true;
}
void test(){
LinkList L; //声明一个指向单链表的头指针
//初始化一个空表
InitList(L);
...
}
//判断单链表是否为空
bool Empty(LinkList L){
return (L==NULL)
}
带头结点的单链表
typedef struct LNode{
ElemType data;
struct LNode *next; //指针指向下一结点
}LNode, *LinkList;
// 初始化一个单链表(带头结点)
bool InitList(LinkList &L){
L = (LNode *)malloc(sizeof(LNode)); //分配一个头结点
if (L == NULL) //内存不足,分配失败
return false;
L->next = NULL; //头结点之后暂时还没有结点
return true;
}
void test(){
LinkList L; //声明一个指向单链表的头指针
//初始化一个空表
InitList(L);
...
}
//判断单链表是否为空
bool Empty(LinkList L){
if (L->next == NULL)
return true;
else
return false;
}
不带头结点,写代码更麻烦 对第一个数据结点和后续数据结点的 处理需要用不同的代码逻辑 对空表和非空表的处理需要用不同的 代码逻辑
带头结点,写代码更方便
2.3.2_1单链表的插入删除
ListI