8 廣義表的建立與基本操作

2021-08-10 22:18:53 字數 3567 閱讀 3029

採用」頭尾法」儲存廣義表,實現以下廣義表的操作:

1.status createglist( glist &l, char *s ) // 根據字串 s 表示的廣義表內容建立廣義表資料結構;

2.glist gethead( glist l) // 取表頭運算

3.glist gettail( glist l) // 取表尾運算

4.void destroyglist( glist &l) // 銷毀廣義表 l

5.void printglist( glist l) // 顯示廣義表 l 內容

程式執行時,首先輸入乙個廣義表,表中的原子是小寫字母。隨後可以交替輸入取表頭或取表尾指令(分別用 1 和 2 表示),取的結果替代當前廣義表,並釋放相應的資源(需將釋放資源資訊輸出)。當廣義表是空或是原子時,程式停止執行。

例:(下面的黑體為輸入)

((a,()),c,d)

generic list: ((a,()),c,d)

1 destroy tail

free list node

generic list: (a,())

2 free head node

free list node

generic list: (())

1 destroy tail

free list node

generic list: ()

測試用例1:

輸入:

(a,(b,(c,d)),e,f)

2 1

2 1

1 輸出:

generic list: (a,(b,(c,d)),e,f)

free head node

free list node

generic list: ((b,(c,d)),e,f)

destroy tail

free list node

generic list: (b,(c,d))

free head node

free list node

generic list: ((c,d))

destroy tail

free list node

generic list: (c,d)

destroy tail

free list node

generic list: c

測試用例2:

輸入:

(a,(b,(c,(d,())),e))

2 1

2 1

2 1

2 1

輸出:

generic list: (a,(b,(c,(d,())),e))

free head node

free list node

generic list: ((b,(c,(d,())),e))

destroy tail

free list node

generic list: (b,(c,(d,())),e)

free head node

free list node

generic list: ((c,(d,())),e)

destroy tail

free list node

generic list: (c,(d,()))

free head node

free list node

generic list: ((d,()))

destroy tail

free list node

generic list: (d,())

free head node

free list node

generic list: (())

destroy tail

free list node

generic list: ()

測試用例3:

輸入:

((a,s,(w,e)),q,c)

1 2

2 2

輸出:

generic list: ((a,s,(w,e)),q,c)

destroy tail

free list node

generic list: (a,s,(w,e))

free head node

free list node

generic list: (s,(w,e))

free head node

free list node

generic list: ((w,e))

free head node

free list node

generic list: ()

解析:

1.因為要再次輸出,所以先用陣列儲存。

2.取表頭操作

建立兩個指標p1、p2,分別指頭和指尾

取表頭即為p1移動到第乙個」(「後,p2移動到當前最大括號的第乙個」,」前,例原始(a(b,c),d(e,),f),取表頭即為p1移動到(a(b,c),d(e,),f),p2移動到(a(b,c),d(e,),f)然後從p1到p2遍歷輸出即可

3.取表尾操作

建立兩個指標p1、p2,分別指頭和指尾

取表尾即為p1從第乙個」(「移動到當前最大括號的最後乙個」,」同時」,」變為」(「,如果p1等於p2,輸出」()」,例原始(a,(b,c),e),取表尾即為p1移動到(a,(b,c),e)同時變符號即為(a,(b,c)(e),然後從p1到p2遍歷輸出即可

難點:判斷」(「,」)」,」,」符號等級,可先令depth=-1凡是遇到」(「就depth++,遇到」)」就depth–即可。在遍歷搜尋時判斷一下當前depth的等級即可,而我們要用的等級為depth==0,即當前最大括號的那個。

#include

#include

char str[200];

int point_1=0, point_2;

void gethead()

if (str[i] == ')')

continue;

}if (str[i] == ','&&depth == 0)

}for (int i = point_1;i<=point_2; i++)

printf("%c", str[i]);

printf("\n");

}void gettail()

if (str[i] == '(')

depth++;

if (str[i] == ')')

depth--;

if (str[i] == ','&&depth == 0)

}if (flag == 1)

for (int i = point_1; i <= point_2; i++)

printf("%c", str[i]);

printf("\n");

}int main()

return

0;}

廣義表的建立與基本操作(10分)

成績 10 開啟時間 2019年11月8日 星期五 18 00 折扣 0.8 折扣時間 2019年11月28日 星期四 23 55 允許遲交 是 關閉時間 2019年12月8日 星期日 23 55 採用 頭尾法儲存廣義表,實現以下廣義表的操作 1 status createglist glist l...

廣義表操作 建立廣義表,判斷廣義表是否相等

建立廣義表 演算法思路 從字串行中分離出左部,右部,依次為左部和右部建立儲存 char s 61 設字串行長度不超過60 eg a,b c d,e,f g a i b int sever int a,int b i while k 0 s i i b return i eg a,b c d,e,f ...

廣義表的建立與列印

廣義表的建立與列印 本文取自 資料結構與演算法 c語言版 第三版 出版社是清華大學出版社。本博文作為學習資料整理。源 是vc 6.0上可執行程式,我挪到了vs2010中執行。在vs2010中新建c win32 控制台應用程式專案,建立結果截圖 1.廣義表的建立 廣義表的儲存結構示意圖 示例 c x,...