採用」頭尾法」儲存廣義表,實現以下廣義表的操作:
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,...