第九周項目4----廣義表算法庫

/*問題及代碼 
 *Copyright(c)2015,煙臺大學計算機學院 
 *All right reserved. 
 *文件名稱:廣義表算法庫 .cpp 
 *作者:鄒曉琳 *完成日期;2016年10月27日 
 *版本號;v1.0 
 *廣義算法庫採用程序的多文件組織形式 
 
 
 
 *輸入描述:廣義表 
 *程序輸出:廣義表的深度和長度 

*/  

#include <stdio.h>  
#include "glist.h"  
int main()  
{  
    GLNode *g;  
    char *s="(b,(b,a,(#),d),((a,b),c((#))))";  
    g = CreateGL(s);  
    DispGL(g);  
    printf("廣義表長度:%d\n", GLLength(g));  
    printf("廣義表深度:%d\n", GLDepth(g));  
    return 0;  
}  
#include <stdio.h>  
#include <malloc.h>  
#include "glist.h"  
int GLLength(GLNode *g)     //求廣義表g的長度  
{  
    int n=0;  
    GLNode *g1;  
    g1=g->val.sublist;      //g指向廣義表的第一個元素  
    while (g1!=NULL)  
    {  
        n++;                //累加元素個數  
        g1=g1->link;  
    }  
    return n;  
}  
  
int GLDepth(GLNode *g)      //求廣義表g的深度  
{  
    GLNode *g1;  
    int max=0,dep;  
    if (g->tag==0)          //爲原子時返回0  
        return 0;  
    g1=g->val.sublist;      //g1指向第一個元素  
    if (g1==NULL)           //爲空表時返回1  
        return 1;  
    while (g1!=NULL)        //遍歷表中的每一個元素  
    {  
        if (g1->tag==1)     //元素爲子表的情況  
        {  
            dep=GLDepth(g1);    //遞歸調用求出子表的深度  
            if (dep>max)    //max爲同一層所求過的子表中深度的最大值  
                max=dep;  
        }  
        g1=g1->link;            //使g1指向下一個元素  
    }  
    return(max+1);          //返回表的深度  
}  
  
GLNode *CreateGL(char *&s)      //返回由括號表示法表示s的廣義錶鏈式存儲結構  
{  
    GLNode *g;  
    char ch=*s++;                       //取一個字符  
    if (ch!='\0')                      //串未結束判斷  
    {  
        g=(GLNode *)malloc(sizeof(GLNode));//創建一個新節點  
        if (ch=='(')                    //當前字符爲左括號時  
        {  
            g->tag=1;                   //新節點作爲表頭節點  
            g->val.sublist=CreateGL(s); //遞歸構造子表並鏈到表頭節點  
        }  
        else if (ch==')')  
            g=NULL;                     //遇到')'字符,g置爲空  
        else if (ch=='#')               //遇到'#'字符,表示爲空表  
            g=NULL;  
        else                            //爲原子字符  
        {  
            g->tag=0;                   //新節點作爲原子節點  
            g->val.data=ch;  
        }  
    }  
    else                                 //串結束,g置爲空  
        g=NULL;  
    ch=*s++;                            //取下一個字符  
    if (g!=NULL)                        //串未結束,繼續構造兄弟節點  
    {  
        if (ch==',')                    //當前字符爲','  
            g->link=CreateGL(s);        //遞歸構造兄弟節點  
        else                            //沒有兄弟了,將兄弟指針置爲NULL  
            g->link=NULL;  
    }  
  
    return g;                           //返回廣義表g  
}  
  
void DispGL(GLNode *g)                  //輸出廣義表g  
{  
    if (g!=NULL)                        //表不爲空判斷  
    {  
        //先處理g的元素  
        if (g->tag==0)                  //g的元素爲原子時  
            printf("%c", g->val.data);  //輸出原子值  
        else                            //g的元素爲子表時  
        {  
            printf("(");                //輸出'('  
            if (g->val.sublist==NULL)   //爲空表時  
                printf("#");  
            else                        //爲非空子表時  
                DispGL(g->val.sublist); //遞歸輸出子表  
            printf(")");                //輸出')'  
        }  
        if (g->link!=NULL)  
        {  
            printf(",");  
            DispGL(g->link);            //遞歸輸出後續表的內容  
        }  
    }  
}  
#ifndef GLIST_H_INCLUDED  
#define GLIST_H_INCLUDED  
  
typedef char ElemType;  
typedef struct lnode  
{  
    int tag;                    //節點類型標識  
    union  
    {  
        ElemType data;          //原子值  
        struct lnode *sublist;  //指向子表的指針  
    } val;  
    struct lnode *link;         //指向下一個元素  
} GLNode;                       //廣義表節點類型定義  
  
int GLLength(GLNode *g);        //求廣義表g的長度  
int GLDepth(GLNode *g);     //求廣義表g的深度  
GLNode *CreateGL(char *&s);     //返回由括號表示法表示s的廣義錶鏈式存儲結構  
void DispGL(GLNode *g);                 //輸出廣義表g  
  
#endif // GLIST_H_INCLUDED  

運算結果:

知識點總結:


廣義表的基本運算


學習心得:


還是得多練啊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章