采用”头尾法存储广义表,实现以下广义表的操作:
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 |
以文本方式显示
|
以文本方式显示
|
1秒 | 64M | 0 |
测试用例 2 |
以文本方式显示
|
以文本方式显示
|
1秒 | 64M | 0 |
测试用例 3 |
以文本方式显示
|
以文本方式显示
|
1秒 | 64M | 0 |
#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; //跳出for
}
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;
}