采用"头尾法存储广义表,实现以下广义表的操作:
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
输出(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
输出(2)
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
输出(3)
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: ()
代码
#include <stdio.h>
#include <string.h>
char list[500];
int tag1, tag2, designator, pri;
void PrintGlist() {
for (int i = tag1; i <= tag2; i++)
printf("%c", list[i]);
printf("\n");
}
void GetHead() {
printf("destroy tail\nfree list node\ngeneric list: ");
pri = -1;
for (int i = tag1; list[i] != '\0'; i++) {
switch (list[i]) {
case '(':
pri++;
if (!pri)
tag1 = i + 1;
break;
case ')':
pri--;
if (!pri) {
tag2 = i;
goto j;
}
break;
case ',':
if (!pri) {
tag2 = i - 1;
goto j;
}
break;
default:
break;
}
}
j:
PrintGlist();
}
void GetTail() {
printf("free head node\nfree list node\ngeneric list: ");
pri = -1;
int emp = 0;
for (int i = tag1; list[i] != '\0'; i++) {
if (i == tag2) {
emp = 1;
break;
}
switch (list[i]) {
case '(':
pri++;
break;
case ')':
pri--;
break;
case ',':
if (!pri) {
list[i] = '(';
tag1 = i;
goto k;
}
default:
break;
}
}
k:
if (emp) {
printf("()\n");
return;
}
PrintGlist();
}
int main() {
scanf("%s", list);
printf("generic list: %s\n", list);
tag1 = 0;
tag2 = strlen(list) - 1;
while (~scanf("%d", &designator)) {
switch (designator) {
case 1:
GetHead();
break;
case 2:
GetTail();
break;
}
}
return 0;
}