线性表:一对一
顺序存储
- 顺序表示:用一组地址连续的存储单元依次存储线性表的数据元素
- 顺序存储是一种随机存取的存储结构:意思是可以直接通过下标来存入或取出元素而不必访问元素的上一个元素来获取元素位置(数组)
- 线性表的顺序存储结构特点:
- 优点:逻辑关系上相邻的两个元素在物理位置上也相邻。所以可以随机 存取表中的任一元素,他的存储位置可用一个简单直观的公式来表示。
- 缺点:插入或者删除需要大量删除元素。
链式存储
1. 单链表
-
存储元素的存储映像称为:节点(node)
- 数据域:存储数据
- 指针域:存储下一个或者上一个地址
- 最后一个元素没有直接后继,所以指针为空(NULL)
-
单链表
-
单链表可由头指针唯一确定,在C语言中可用结构指针描述
typedef struct LNode{ EleType data; struct LNode *next; }LNode, *LinkList;
-
头结点的指针域存储指向第一个节点的指针
-
结点a(i)是指数据域为a(i)的结点,而p结点是指:指针p指向的结点
-
-
单链表插入删除
-
插入
typedef struct linklist { struct linklist *next; ElemType data; }LNode, *LinkList; LinkList * nodeinsert(LinkList &l, int i; ElemType e){ LinkList *p = l; while(p && j < i - 1){ p = p -> next; // 指向插入位置上一结点 j++; } // 申请内存 LinkList *s = (LinkList *)malloc(sizeof(LNode)); s -> next = p -> next; s -> data = e; p -> next = s; }
假 设 p 和 q是 LinkList型的变_量,则执行p=( LinkList )malloc(sizeof(LNode))的作用是由系统生成
一 个 LNode型的结点,丨"1]时将该结点的起始位置赋给指针变量P;反之,执 行 fr e e ( q ) 的作
用是由系统回收一个LNode型的结点,回收后的空间可以备作再次生成结点时用。 -
-
特点:
-
数组的第零分量(a[0])可以看做是头结点,指针域a[0].cur看做是p->next
-
i = S[i]. cur的操作实为指针后移(类似于p=p -> next)
-
数组的第一个元素,即下标为0的元素的cur就是存放备用链表的第一个结点在数组中的下标;而数组的最后一个元素的cur则存放第一个有数值的元素的下标,相当于单链表的头结点作用,当整个链表为空时,则为0,表示无指向。
// 定位算法 int LocateElem. SL( SLinkList S, ElemType e) { //在静态单链线性表L 中査找第1个 值 为 e 的元素。 //若找到,则返回它在L 中的位序,否则返回0。 i = S[0].cur; # i指示表中第一个结点 while (i &&S[i].data | = e) i=S[i].cur; // 在表中顺链査找 return i; } // LocateElem, SL
-
2. 双向链表
// -------- 线性表的双向链表存储结构 ----------
typedef struct DuLNode {
ElemType data ;
struct DuLNode * priori
struct DuLNode * next;
}DuLNode, * DuLinkList;
3. 循环链表
特点:
表中最后一个结点的指针域指向头结点,构成环
循环链表和线性链表的操作基本一致,区别在于算法中循环条件不是P或者P->next是否为空,而是他们是否等于头指针
4. 带头结点的线性链表类型定义
typedef struct LNode{
ElemType data;
struct LNode *next;
}
5. 有序链表和线性链表的区别
- LocateElem的职能不同
- 需增加按有序关系进行插入的操作Orderlnsert
- 现说明如下:
Status LocateElem (LirJcList L, ElemType e, Position &q, int ( * compare) (ElemType, ElemType));
//若有序链表 L 中存在与 e 满足判定函数 compareO 取值为0 的元素,则 q 指示 L 中第一个
//值为 e 的结点的位置,并返回 TRUE ;否则 q 指示第一个与 e 满足判定函数 compareO 取
//值>0的元素的前驱的位置,并返回 FALSE
Status Order Insert (LinkList &L, ElemType e, int(* compare(ElemType, ElemType))|
//按有序判定函数 compare ()的约定,将值为 e 的结点插入到有序链表 L 的适当位置上