對幾種線性表做一個總結
學完幾種線性表後發現自己常常會搞錯,原因還是沒有總結區分牢記。今天趁著有時間趕緊寫下來讓記憶更加牢固。
=========================================分界線======================================
一、順序表:
結構型別定義
typedef struct
{
char name[20];
int id;
} Book;
typedef struct
{
Book *base;
int length;
}
接下來當然是各種基本操作
1、取值操作:GetElem(SqList L, int i , Book &e) 注意需要判斷i是不是合理,然後將對應的元素儲存到e
2、查詢操作:LocateElem(Sqlist L, Book e) 查詢成功返回序號,這沒什麼好說的!
3、插入操作:ListInsert(Sqlist &L, int i, Book e) 這裡有幾點要注意:注意i是否合法 1<= i < length+1 ,注意表是否滿了,注意最後表長加一。
4、刪除操作:ListDelete( Sqlist &L , int i) 注意幾點:判斷i是否合法,最後記得表長減一。
===========================================分界線=======================================
二、連結串列
單鏈表結構型別定義
typedef struct Node
{
ElemType data;
struct Node *next;
} Node ,*Linklist;
//其實上面的 *LinkList 在不在這裡定義都無所謂,因為我們後面可以直接定義。
接下來當然是各種基本操作
1、初始化操作:InitList( Linklist &L) 生成新節點作為頭結點,next指向NULL;
2、取值操作: GetElem( Linklist L, int i,ElemType &e)這裡注意判斷 i 是否合法
3、查詢操作: *LocateElem( Linklist L, ElemType e) 注意查詢成功返回節點的地址,不存在返回Null
4、插入操作:ListInsert( LinkList &L, int i ,ElemType e)
5、刪除操作:ListDelete( Linklist &L,int i )同樣判斷 i 值合法性。
7、前插法操作:CreateList_H (LinkList &L , int n)
8、後插法操作:CreateList_R(LinkList &L , int n
迴圈連結串列
和單鏈表操作基本一致,差別在於判別指標p是否指向終點條件不同。單鏈表條件為p!= null或者 p->next != null 而迴圈條件是 p!= L 或者 p->next != L 。
雙向連結串列
typedef struct DNode
{
ElemType data;
struct Node *next;
struct Node *prior;
} DNode,*DLinkList;
基本操作
1、插入操作:ListInsert(DlinkList &L , int i, ElemType e)
2、刪除操作:LinkDelete(DLinklist & L,int i )
3、其他操作:只涉及一個方向的操作與 單鏈表類似不再多講。
==========================================分界線========================================
三、順序棧
結構型別定義
typedef struct
{
ElemType *base;
ElemType *top;
int stacksize;
}
base為棧底指標,始終指向棧底,top為棧頂指標(棧頂元素的上一個);當base=top時棧為空。stacksize 為棧可用的最大容量。進出元素只有top移動。
基本操作:
1、初始化操作: InitStack(SqStack &S ) 初始化stacksize , 分配陣列空間 , top=base 。
2、入棧操作: Push(SqStack &S ,ElemType e),判斷是否滿了,指標加一。
3、出棧操作:Pop(SqStack &S,ElemType &e),判斷是否空棧,指標減一。
4、去棧頂元素:GetTop(SqStack S),棧非空返回棧頂元素值,棧頂指標保持不變。
=========================================分界線==========================================
四、鏈棧
結構型別定義
typedef struct StackNode
{
ElemType data;
struct StackNode *next;
} StackNode,*LinkStack;
基本操作: 主要操作是在棧頂插入與刪除
1、初始化操作:InitStack(LinkStack & S)
2、入棧操作:Push(LinkStack &S , ElemType e)
3、出棧操作:Pop(LinkStack &S,ElemType &e) 注意要判斷是否為空,最後還要釋放空間。
4、取棧頂元素:GetTop(LinkStack L) 返回棧頂元素的值
====================================分界線============================================
五、迴圈佇列 ——(也稱為 佇列的順序表示 )
結構型別定義
typedef struct
{
ElemType *base;
int front;
int rear;
} SqQueue;
基本操作:
1、初始化操作:InitQueue(SqQueue & Q),分配好陣列的大小,base為基地址。頭指標與尾指標為0.
2、求佇列的長度:(SqQueue Q),(rear-front+MAXSIZE)%MAXSIZE ;
3、入隊操作: EnQueue(SqQueue &Q,ElemType e)判斷是否滿了
4、出隊操作:DeQueue(SqQueue &Q,ElemType &e),判斷是否為空
5、取隊頭元素:GetHead(SqQueue Q)
=======================================分界線==========================================
六、鏈隊
結構型別定義
typedef struct QNode
{
ElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
} LinkQueue;
基本操作:
1、初始化操作:InitQueue(LinkQueue &Q)
2、入隊操作:EnQueue(LinkQueue &Q,ElemType e)
3、出隊操作:DeQueue(LinkQueue &Q,ElemType &e)
4、取隊頭元素:GetHead(LinkQueue Q)
只是簡單的勾勒出學過的線性表的基本知識框架,詳細實現在前面那幾個部落格裡面可以看到。我想通過這個簡單的體系,可以聯絡到詳細的實現。書是越讀越薄嘛!厚積薄發也許是這個道理。繼續,加油!