1. 程式人生 > >對幾種線性表做一個總結

對幾種線性表做一個總結

       學完幾種線性表後發現自己常常會搞錯,原因還是沒有總結區分牢記。今天趁著有時間趕緊寫下來讓記憶更加牢固。

 

=========================================分界線======================================

一、順序表:

                                                            結構型別定義

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)

 

只是簡單的勾勒出學過的線性表的基本知識框架,詳細實現在前面那幾個部落格裡面可以看到。我想通過這個簡單的體系,可以聯絡到詳細的實現。書是越讀越薄嘛!厚積薄發也許是這個道理。繼續,加油!