线性表

顺序储存结构(Sequential List)

1
2
3
4
5
6
7
8
9
10
11
typedef struct{
ElemType *elem//基地址
int length;//当前长度
int listsize;//当前容量
}Sqlist;
typedef int Status;
Status InitList_Sq(Sqlist &L)
Status ListInsert(Sqlist &L, int i, ElemType e); //O(n)
Status ListDelete_Sq(Sqlist &L, int i, ElemType e); //O(n)
Status Locate_Sq(Sqlist L, ElemType e, Status (*compare)(ElemType, ElemType));
Status MergeList_Sq(Sqlist L1, Sqlist L2, Sqlist &L3);
  • 优点:逻辑相邻,物理相邻,可任意存取,空间紧凑
  • 缺点:插入删除,需要移动大量元素,需要预先分配位置,空间利用不充分

链式储存结构

1
2
3
4
5
6
7
8
9
10
11
12
typedef struct LNode{
ElemType date;
struct LNode *next;
}LNode, *Linklist;

LNode *p;//(*p)表示p指向的结点 (*p).data i.e. p->date p是一个指针
p=(LNode *)malloc(sizeof(LNode));
free(p);
Status GetElem_L(Linklist L, int i, ElemType &c); //L是头指针
Status ListInsert(Linklist &L, int i, ElemType e); //O(n)
Status ListDelete_Sq(Linklist &L, int i, ElemType e); //O(n)
Status CreateList_L(Linklist &L, int n);// 逆位序输入

循环链表

1
2
3
4
5
temp=B->next;
A->next=A->next;
A->next=temp->next;
A=B;
free(temp);

尾指针rear指向末尾 ,在带头节点的循环链表中rear->next->next表示开始节点$a_1$

双向链表

1
2
3
4
5
6
7
typedef struct DuLNode{
ElemType data;
struct DuLNode *prior, *next;
} DuLNode, *DuLinkList;
Status ListDelete_DuL(DuLinkList &L, int i, ElemType &e)
Status ListDelete_DuL(DuLinkList &L, int i, ElemType &e)
Status ListInsert_DuL(DuLinkList &L, int i, ElemType &e)

应用举例

一元多项式的表示及相加$P_n(x)=P_0+P_1x+P_2x^2+\dots+P_n x^n$

$P=(P_0,P_1,P_2,\dots,P_n)$ 但是对于$S(x)=1+3x^{1000}+2x^{2000}$的多项式浪费空间

$P_n(x)=P_1x^{e_1}+P_2x^{e_2}+\dots+P_nx^{e_n}$

所以用数据域含有两个数据项的线性表表示$((P_1,e_1),(P_2,e_2),\dots,(P_n,e_n))$