廣義表的建立與列印

2021-07-10 13:18:00 字數 2185 閱讀 1061

廣義表的建立與列印

本文取自《資料結構與演算法》(c語言版)(第三版),出版社是清華大學出版社。

本博文作為學習資料整理。源**是vc++ 6.0上可執行程式,我挪到了vs2010中執行。

在vs2010中新建c++ win32 控制台應用程式專案,建立結果截圖:

1.廣義表的建立:

廣義表的儲存結構示意圖:示例:c(x, y, (a, b))

廣義表可以通過下面的遞迴方式進行定義。

基本項:(1)廣義表為空表,當s為空時;(2)廣義表為原子結點,當s為單字串時。

歸納項:假設subs為s去掉最外層括號對的串,記作「s1,s2,...,sn」,其中si(i=1,...,n)為非空字串。對每個si建立表結點,並令其hp域的指標為由si建立的子表的頭指標,除最後建立的表結點的尾指標為null外,其餘表結點的尾指標均指向在它之後建立的表結點。也就是說,因為si是乙個字串,首先要為這個字串建立乙個表結點,表結點的指標域指向si中的元素,它的tp域指向下一次建立的si+1,而sn的tp域為空。

因為在廣義表的定義中要用到subs串,因此需要乙個函式來求這個串。這裡採用函式getsubs(str,hstr)來實現。其中,hstr存放的是str中第1個","之前的子串,並且函式將str修改為刪除子串hstr和","之後的剩餘串。若串str中沒有",",則hstr即為str,而str修改為空串null。

2.廣義表的列印:

列印廣義表的演算法思想是:先列印乙個左括號"(",若遇到tag=atom,則列印該結點的值,如果此結點後面有後繼結點,則再列印乙個",";如果tag=list,說明是乙個子表,則遞迴呼叫函式,列印這個子表;列印完所有結點以後,最後列印乙個「)」。

源程式如下:generallist.cpp

// generallist.cpp : 定義控制台應用程式的入口點。

#include "stdafx.h"

#include #include #include typedef enum elemtag; //atom==0 原子, list==1 子表

struct glnode

; struct glnode *tp;

};typedef struct glnode glist;

//求取廣義表的子串subs

void getsubs(char str, char hstr)

} hstr[j]='\0';

if(str[i]==',')

i++;

while(str[i])

s[r]='\0';

strcpy(str,s);

}//建立廣義表

glist *glistcreate(char str)

g->tag = atom;

g->atom = *str;

g->tp = null;

} else

g->tag = list;

p=g;

str++;

strncpy(subs,str,len-2); //去掉最外面的()

subs[len-2]='\0';

while(len>0)

p->tag = list;

q->tp=p;

}} q->tp=null;

} return g;

}//列印廣義表

void glistprint(glist *g)

if(p&&!p->tag) //p為原子結點,並且沒有後續結點

else

}printf(")");

}int main()

ctrl+f5執行generallist.cpp的執行結果:如下截圖:

廣義表的建立

include include include define error 1 define over flow 0 define ok 1 define max str len 100 char hstr max str len char istr max str len typedef int s...

廣義表操作 建立廣義表,判斷廣義表是否相等

建立廣義表 演算法思路 從字串行中分離出左部,右部,依次為左部和右部建立儲存 char s 61 設字串行長度不超過60 eg a,b c d,e,f g a i b int sever int a,int b i while k 0 s i i b return i eg a,b c d,e,f ...

8 廣義表的建立與基本操作

採用 頭尾法 儲存廣義表,實現以下廣義表的操作 1 status createglist glist l,char s 根據字串 s 表示的廣義表內容建立廣義表資料結構 2 glist gethead glist l 取表頭運算 3 glist gettail glist l 取表尾運算 4 voi...