• 数据结构广义表实验


    一、问题描述:

    1、题目内容:识别广义表的“头”或“尾”的演示

    写一个程序,建立广义表的存储结构,演示在此存储结构上实现的广义表求头/求尾操作序列的结果。

    2、基本要求

    (1)设一个广义表允许分多行输入,其中可以任意地输入空格符,原子是不限长的仅字母或数字组成的串。

    (2)广义表采用如教材中结点的存储结构,试按表头和表尾的分解方法编写建立广义表存储结构的算法。

    (3)对已建立存储结构的广义表施行操作,操作序列为一个仅由“t“或”h”组成的串,它可以是空串(此时印出整个广义表),自左至右施行各操作,再以符号形式显示结果。

    代码:

      1 //panda
      2 //2013-4-24
      3 
      4 typedef char ElemType;
      5 
      6 //定义结点
      7 struct GLNode
      8 {
      9     bool tag;//标志域
     10     union 
     11     {
     12         ElemType data;
     13         GLNode* sublist;
     14     };
     15     GLNode* next;//指向后续结点指针域
     16 };
     17 
     18 class GList
     19 {
     20 //private:
     21 public:
     22     GLNode* head;
     23     //int length,depth;难以维护
     24 
     25     //输入字符串的左右括号数量
     26     int ifinputover;  //左括号+1,右括号-1
     27     //debug
     28     int i;
     29 public:
     30     GList();
     31     ~GList();
     32 public:
     33     int GetLength(GLNode* gl);
     34     int GetDepth(GLNode* gl);
     35     void CreateGListByInput(GLNode*& gl);////// 
     36     void ClearGList();//清除广义表
     37     void PrintGList(GLNode* gl);//输入广义表
     38     GLNode* PrintHeadNode(GLNode* head);//h操作
     39     GLNode* PrintTailNode(GLNode* tail);//t操作
     40 };
     41 //panda
     42 //2013-4-24
     43 
     44 
     45 #include"GList.h"
     46 #include<iostream>
     47 using namespace std;
     48 
     49 //
     50 //构造函数
     51 //
     52 GList::GList()
     53 {
     54     head=NULL;
     55     //length=depth=0;
     56     ifinputover=0;
     57     //debug
     58     i=0;
     59 };
     60 //
     61 //析构函数
     62 //
     63 GList::~GList()
     64 {
     65     ClearGList();
     66 };
     67 //
     68 //通过输入构建广义表
     69 //ok     ///以#结束输入///       真正的广义表指针是gl->sublist
     70 //广义表的头指针需要处理head=gl->sublist;
     71 void GList::CreateGListByInput(GLNode*& gl)
     72 {
     73     //debug
     74     //int i=0;//
     75     ++i;//每调用一次加1  表示是第几次调用
     76 
     77     char ch;
     78     //读入一个字符,这里可能是‘(’,字符
     79     cin>>ch;
     80     //建立结点,并构造子表
     81     if (ch=='(')
     82     {
     83         ++ifinputover;//左括号数量+1
     84         gl=new GLNode();
     85         gl->tag=true;//结点为子表
     86         CreateGListByInput(gl->sublist);
     87     }else if (ch==')')//这里遇到),则表明为空表
     88     {
     89         --ifinputover;//右括号+1
     90         //子表的结束
     91         gl=new GLNode();
     92         gl->tag=false;
     93         gl->data=NULL;
     94         gl->next=NULL;
     95         //debug
     96         --i;
     97         return;
     98     }else//不是子表,输入数据/////////////    )?
     99     {
    100         gl=new GLNode();
    101         gl->tag=false;
    102         gl->data=ch;
    103     }
    104 
    105     if (ifinputover)//没结束输入 
    106     {
    107         //此处输入的字符可能为')',','
    108         cin>>ch;
    109     }else  //输入完毕
    110     {
    111         gl->next=NULL;
    112         --i;
    113         return ;
    114     }
    115 
    116     //若为,则递归构造后续表
    117     if (ch==',')
    118     {
    119         CreateGListByInput(gl->next);
    120     }else if (ch==')')
    121     {
    122         --ifinputover;
    123         gl->next=NULL;
    124         //debug
    125         //--i;
    126         //return;
    127     }
    128     //debug
    129     --i;//回到调用前的数值
    130 };
    131 //
    132 //获得广义表深度
    133 //
    134 int GList::GetDepth(GLNode* gl)
    135 {
    136     //return depth;
    137     int max=0;
    138     while (gl!=NULL)
    139     {
    140         if (gl->tag=true)
    141         {
    142             int dep=GetDepth(gl->sublist);
    143             if (dep>max)
    144             {
    145                 max=dep;
    146             }
    147         }
    148         gl=gl->next;
    149     }
    150     return max+1;
    151 };
    152 //
    153 //获得广义表的长度
    154 //
    155 int GList::GetLength(GLNode* gl)
    156 {
    157     //return length;
    158     if (gl!=NULL)
    159     {
    160         return 1+GetLength(gl->next);
    161     }else
    162     {
    163         return 0;
    164     }
    165 };
    166 //
    167 //清空广义表
    168 //
    169 void GList::ClearGList()
    170 {
    171 
    172 };
    173 //
    174 //打印广义表
    175 //ok
    176 void GList::PrintGList(GLNode* gl)
    177 {
    178     if (gl->tag==true)
    179     {
    180         cout<<'(';
    181         //输入子表
    182         if (gl->sublist==NULL)
    183         {
    184             //output nothinig
    185         }else
    186         {
    187             PrintGList(gl->sublist);
    188         }
    189         cout<<')';
    190     }else//输入数据结点
    191     {
    192         cout<<gl->data;
    193     }
    194     if (gl->next!=NULL)
    195     {
    196         cout<<',';
    197         PrintGList(gl->next);
    198     }
    199 };
    200 //
    201 //h操作
    202 //ok
    203 GLNode* GList::PrintHeadNode(GLNode* head)
    204 {
    205     if (head==NULL)
    206     {
    207         return NULL;
    208     }
    209     //deal glist
    210     if (head->tag==true)
    211     {
    212         if (head->sublist->tag==true)
    213         {
    214             if(head->sublist->next!=NULL)
    215             {
    216                 head->sublist->next=NULL;
    217             }else
    218             {
    219                 head=head->sublist;
    220             }
    221         }
    222 
    223     }else if (head->tag==false)
    224     {
    225         head->next=NULL;
    226     }
    227 
    228     //output glist
    229     PrintGList(head);
    230     cout<<',';
    231 
    232     if (head->tag==true)
    233     {
    234         if (head->sublist->tag==false&&head->next==NULL)
    235         {
    236             return head;
    237         }
    238         return head->sublist;
    239     }else if (head->tag==false)
    240     {
    241         return NULL;
    242     }
    243 };
    244 //
    245 //t操作
    246 //ok
    247 GLNode* GList::PrintTailNode(GLNode* tail)
    248 {
    249     if (tail==NULL)
    250     {
    251         return NULL;
    252     }
    253     //deal glist
    254     if (tail->tag==true)
    255     {
    256         if (tail->sublist->tag==true)
    257         {
    258             if (tail->sublist->next!=NULL)
    259             {
    260                 //前移一个结点
    261                 tail->sublist=tail->sublist->next;
    262             }else
    263             {
    264                 tail=tail->sublist;
    265             }
    266         }else if (tail->sublist->tag==false)
    267         {
    268             tail->sublist=tail->sublist->next;
    269         }
    270 
    271     }else if (tail->tag==false)
    272     {
    273         tail=tail->next;
    274     }
    275 
    276     //output glist
    277     PrintGList(tail);
    278     cout<<',';
    279 
    280 
    281     if (tail->tag==true)
    282     {
    283         if (tail->sublist->tag==true&&tail->sublist->next==NULL)
    284         {
    285             return tail;
    286         }else if (tail->sublist->tag==true&&tail->sublist->next!=NULL)
    287         {
    288             //tail->sublist
    289             return tail;
    290         }
    291         return tail->sublist;
    292     }else if (tail->tag==false)
    293     {
    294         return NULL;
    295     }
    296 };
    297 /////////////////////////////////
    298 //递归函数,只能一步一步的调试了
    299 
    300 #include"GList.h"
    301 #include<iostream>
    302 using namespace std;
    303 
    304 void InputString(char *ch,int size)
    305 {
    306     cin.ignore(1);
    307     char temp;
    308     int i=0;
    309     while (temp=getchar())
    310     {
    311         if (temp=='
    ')
    312         {
    313             ch[i]='';
    314             return;
    315         }
    316         if (i<size)
    317         {
    318             ch[i++]=temp;
    319         }else
    320         {
    321             return;
    322         }
    323     }
    324 };
    325 
    326 int main()
    327 {
    328     GList glist;
    329     cout<<"input the GList:";
    330     glist.CreateGListByInput(glist.head);
    331     cout<<"PrintGList:";
    332     glist.PrintGList(glist.head);
    333     cout<<endl<<"请输入对广义表的操作序列(回车结束输入):";
    334     GLNode* temp=glist.head;
    335     char ch[50];
    336     InputString(ch,50);
    337     //operate glist
    338     char tempch;
    339     for (int i = 0; i < 50; i++)
    340     {
    341         tempch=ch[i];
    342         if (tempch=='h'||tempch=='H')
    343         {
    344             temp=glist.PrintHeadNode(temp);
    345         }else if (tempch=='t'||tempch=='T')
    346         {
    347             temp=glist.PrintTailNode(temp);
    348         }else if (tempch=='')
    349         {
    350             break;
    351         }else
    352         {
    353             cout<<"input error.";
    354             break;
    355         }
    356     }
    357 
    358     system("pause");
    359     return 0;
    360 }
  • 相关阅读:
    Binary Stirling Numbers
    Count the Buildings ( s1 )
    P3375 【模板】KMP字符串匹配
    POJ2151Check the difficulty of problems
    fbx 模型转换 export
    Linux --windows vs
    phyreengine 3.12.0 安装遇到的问题
    A trip through the graphics pipeline 2011 Part 10(翻译)
    服务端 unity
    nsight 使用问题
  • 原文地址:https://www.cnblogs.com/pandang/p/4849208.html
Copyright © 2020-2023  润新知