美文网首页
[数据结构]广义表的建立与基本操作 解题报告

[数据结构]广义表的建立与基本操作 解题报告

作者: vouv | 来源:发表于2017-03-26 14:28 被阅读0次

    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;
    }
    

    相关文章

      网友评论

          本文标题:[数据结构]广义表的建立与基本操作 解题报告

          本文链接:https://www.haomeiwen.com/subject/vmqkottx.html