C語言 表、棧和隊(duì)列詳解及實(shí)例代碼
C語言 表、棧和隊(duì)列詳解
表ADT
形如A1,A2,A3…An的表,這個(gè)表的大小為n,而大小為0的表稱為空表,非空表中,Ai+1后繼Ai,Ai-1前驅(qū)Ai,表ADT的相關(guān)操有PrintList打印表中的元素;CreateEmpty創(chuàng)建一個(gè)空表;Find返回關(guān)鍵字首次出現(xiàn)的位置;Insert和Delete從表的某個(gè)位置插入和刪除某個(gè)關(guān)鍵字。
對(duì)表的所有操作都可以通過使用數(shù)組來實(shí)現(xiàn),但在這里使用鏈表的方式來實(shí)現(xiàn)。鏈表(linked list)由一系列不必在內(nèi)存中相連的結(jié)構(gòu)組成,每個(gè)結(jié)構(gòu)均含有元素和指向包含該元素后繼元的結(jié)構(gòu)的指針。鏈表的結(jié)構(gòu)有很多種,單向鏈表、雙向鏈表、循環(huán)鏈表、有無表頭的鏈表,這里以有表頭結(jié)點(diǎn)的單向鏈表為例,其余幾種的實(shí)現(xiàn)思路相同。
首先定義鏈表的結(jié)構(gòu):
struct Node { ElementType Element; Node *Next; };
表ADT的主要操作:
Node *CreateEmpty() { Node *header = new Node; Header->Element = 0; Header->Next = NULL; return header; } void PrintList(Node *List) { Node *p = List->Next; While (p) { std::cout << p->Element << “ “; } } Node *Find(Node *List, ElementType X) { Node *p = List->Next; while(p && p->Element != X) { p = p->Next; } return p; } void Insert(Node *List, ElementType X) { Node *p = List; while(p->Next) { p = p->Next; } p->Next = new Node; p = p->Next; p->Next = NULL; p->Element = X; } void Delete(Node *List, ElementType X) { Node *p = List->Next; Node *d = p->Next; while(d->Element != X) { p = p->Next; d = p->Next; } p->Next = d->Next; delete d; }
以上是基本的幾個(gè)操作,可以看到,操作中沒有對(duì)鏈表是否為空進(jìn)行檢測(cè),在刪除操作中存在隱患。
棧ADT
棧(stack)是限制插入和刪除只能在一個(gè)位置上進(jìn)行的表,該位置是表的末端,叫做棧的頂(top)。對(duì)棧的基本操作有Push(進(jìn)棧)和Pop(出棧),前者相當(dāng)于插入,后者相當(dāng)于刪除最后插入的元素。
棧的實(shí)現(xiàn)可以是指針,或者使用數(shù)組,數(shù)組的實(shí)現(xiàn)在筆者前面的已經(jīng)介紹過了,今次使用單鏈表的方式實(shí)現(xiàn)。
首先,棧的結(jié)構(gòu)定義:
struct Stack { ElementType Element; Stack *Next; };
棧ADT的主要操作:
Stack *CreateStack() { Stack *S = new Stack; S->Next = NULL; return S; } void Push(Stack *S, ElementType X) { Stack *p = new Stack; p->Next = S; S->Element = X; S = p; } ElementType Pop(Stack *S) { Stack *p = S; if(S->Next) { S = S->Next; delete p; } return S->Element; }
隊(duì)列ADT
像棧一樣,隊(duì)列也是一種表,然而,使用隊(duì)列時(shí)插入在一端進(jìn)行而刪除則在另一端進(jìn)行。隊(duì)列的基本操作時(shí)Enqueue(入隊(duì))和Dequeue(出隊(duì)),入隊(duì)是指在表的末端rear插入一個(gè)元素,而出隊(duì)是刪除(或者返回)在表的開頭front的元素。
如同棧的情形一樣,棧的實(shí)現(xiàn)可以用指針和數(shù)組的方式,數(shù)組的方式筆者同樣在之前做過介紹,今次使用單鏈表的方式實(shí)現(xiàn)。
首先,定義隊(duì)列的結(jié)構(gòu):
struct Queue { ElementType Element; Queue *Next; };
隊(duì)列ADT的主要操作:
Queue *CreateQueue() { Queue *p = new Queue; p->Next = NULL; return p; } void Enqueue(Queue *rear, ElementType X) { Queue *p = new Queue; p->Element = X; rear->Next = p; rear = p; } ElementType Dequeue(Queue *front) { Queue *p = front; ElementType e = front->Element; front = front->Next; delete p; return e; }
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
上一篇:C++詳解默認(rèn)參數(shù)的構(gòu)造函數(shù)及簡單實(shí)例代碼
欄 目:C語言
本文標(biāo)題:C語言 表、棧和隊(duì)列詳解及實(shí)例代碼
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/1764.html
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)式函數(shù)庫
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)數(shù)怎么表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排序法函數(shù)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10delphi制作wav文件的方法