1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| #include <stdio.h> #include <stdlib.h> typedef struct GLNode { int tag;//标志域 union { char atom;//原子结点的值域 struct { struct GLNode * hp,*tp; } ptr; //子表结点的指针域,hp 指向表头;tp 指向表尾 }; }*Glist,GNode; Glist creatGlist(Glist C) { //广义表 C C=(Glist)malloc(sizeof(GNode)); C->tag=1; //表头原子‘a’ C->ptr.hp=(Glist)malloc(sizeof(GNode)); C->ptr.hp->tag=0; C->ptr.hp->atom='a'; //表尾子表(b,c,d),是一个整体 C->ptr.tp=(Glist)malloc(sizeof(GNode)); C->ptr.tp->tag=1; C->ptr.tp->ptr.hp=(Glist)malloc(sizeof(GNode)); C->ptr.tp->ptr.tp=NULL; //开始存放下一个数据元素(b,c,d),表头为‘b’,表尾为(c,d) C->ptr.tp->ptr.hp->tag=1; C->ptr.tp->ptr.hp->ptr.hp=(Glist)malloc(sizeof(GNode)); C->ptr.tp->ptr.hp->ptr.hp->tag=0; C->ptr.tp->ptr.hp->ptr.hp->atom='b'; C->ptr.tp->ptr.hp->ptr.tp=(Glist)malloc(sizeof(GNode)); //存放子表(c,d),表头为 c,表尾为 d C->ptr.tp->ptr.hp->ptr.tp->tag=1; C->ptr.tp->ptr.hp->ptr.tp->ptr.hp=(Glist)malloc(sizeof(GNode)); C->ptr.tp->ptr.hp->ptr.tp->ptr.hp->tag=0; C->ptr.tp->ptr.hp->ptr.tp->ptr.hp->atom='c'; C->ptr.tp->ptr.hp->ptr.tp->ptr.tp=(Glist)malloc(sizeof(GNode)); //存放表尾 d C->ptr.tp->ptr.hp->ptr.tp->ptr.tp->tag=1; C->ptr.tp->ptr.hp->ptr.tp->ptr.tp->ptr.hp=(Glist)malloc(sizeof(GNode)); C->ptr.tp->ptr.hp->ptr.tp->ptr.tp->ptr.hp->tag=0; C->ptr.tp->ptr.hp->ptr.tp->ptr.tp->ptr.hp->atom='d'; C->ptr.tp->ptr.hp->ptr.tp->ptr.tp->ptr.tp=NULL; return C; } int GlistDepth(Glist C) { //如果表 C 为空表时,直接返回长度 1; if (!C) { return 1; } //如果表 C 为原子时,直接返回 0; if (C->tag==0) { return 0; } int max=0;//设置表 C 的初始长度为 0; for (Glist pp=C; pp; pp=pp->ptr.tp) { int dep=GlistDepth(pp->ptr.hp); if (dep>max) { max=dep;//每次找到表中遍历到深度最大的表,并用 max 记录 } } //程序运行至此处,表明广义表不是空表,由于原子返回的是 0,而实际长度是 1,所以,此处要+1; return max+1; } int main(int argc, const char * argv[]) { Glist C=creatGlist(C); printf("广义表的深度为:%d",GlistDepth(C)); return 0; }
|