1.問題及代碼
自建算法庫
代碼:
1.頭文件:glist.h,包含定義廣義表數據結構的代碼、宏定義、要實現算法的函數的聲明;
#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
2.源文件:glist.cpp,包含實現各種算法的函數的定義
#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); //遞歸輸出後續表的內容
}
}
}
3.在同一項目(project)中建立一個源文件(如main.cpp),編制main函數,完成相關的測試工作。 例:
#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;
}
2.運行結果
3.知識總結
廣義算法庫及其運用
4.學習心得