[数据结构]广义表的建立与基本操作 解题报告
2017-03-26 本文已影响0人
vouv
Problem Description
采用"头尾法”存储广义表,实现以下广义表的操作:
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: ()
测试输入
(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
AcCode
//
// main.cpp
// 广义表的建立与基本操作
//
// Created by jetviper on 2017/3/26.
// Copyright © 2017年 jetviper. All rights reserved.
//
#include <stdio.h>
#include<string.h>
void GetTail(char *str){
int List_lenth = strlen(str);
int deep = 0;
int endIndex;
for(int i = 1;i<List_lenth;i++){
if(deep>0){
if(str[i] == '('){
deep++;
continue;
}
else if(str[i] == ')'){
deep--;
continue;
}
else continue;
}
else {
if(str[i]=='('){
deep++;
continue;
}
else if(str[i] == ','){
endIndex = i;
break;
}
else if(i == List_lenth-1){
str[1] = ')';
str[2] = '\0';
return;
}
else continue;
}
}
for(int i = 1;i<=List_lenth-endIndex;i++){
str[i] = str[i+endIndex];
}
str[List_lenth - endIndex + 1] = '\0';
return;
}
void GetHead(char *str){
int List_lenth = strlen(str);
int deep = 0;
int endIndex;
char tmp[100];
int k =0;
for(int i = 1;i<List_lenth;i++){
if(deep>0){
if(str[i] == '('){
tmp[k] = str[i];
k++;
deep++;
continue;
}
else if(str[i] == ')'){
tmp[k] = str[i];
k++;
deep--;
continue;
}
else {
tmp[k] = str[i];
k++;
continue;
}
}
else {
if(str[i]=='('){
tmp[k] = str[i];
k++;
deep++;
continue;
}
else if(str[i] == ','){
break;
}
else if(i == List_lenth-1){
break;
}
else {
tmp[k] = str[i];
k++;
continue;
}}
}
for(int j=0;j<k;j++)str[j] = tmp[j];
str[k] = '\0';
return;
}
int main() {
char str[1000];
int choice;
scanf("%s",&str);
printf("generic list: %s\n",str);
while(1){
if(strcmp(str,"()")==0||str[1]=='\0')break;
scanf("%d",&choice);
switch(choice){
case 1:{
GetHead(str);
printf("destroy tail\nfree list node\ngeneric list: %s\n",str);
break;
}
case 2:{
GetTail(str);
printf("free head node\nfree list node\ngeneric list: %s\n",str);
break;
}
}
}
return 0;
}