8. 广义表的建立与基本操作

来源:互联网 发布:2k帕森斯脸型数据 编辑:程序博客网 时间:2024/05/27 21:48

采用”头尾法”存储广义表,实现以下广义表的操作:
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,即当前最大括号的那个。