void main() { char p[80]; GList l,m; HString t; /* 与main5-51.c不同 */ InitString(&t); /* 增加此句 */ InitGList(&l); InitGList(&m); printf("空广义表l的深度=%d l是否空?%d(1:是 0:否)\n",GListDepth(l),GListEmpty(l)); printf("请输入广义表l(书写形式:空表:(),单原子:a,其它:(a,(b),b)):\n"); gets(p); StrAssign(&t,p); CreateGList(&l,t); printf("广义表l的长度=%d\n",GListLength(l)); printf("广义表l的深度=%d l是否空?%d(1:是 0:否)\n",GListDepth(l),GListEmpty(l)); printf("遍历广义表l:\n"); Traverse_GL(l,visit); printf("\n复制广义表m=l\n"); CopyGList(&m,l); printf("广义表m的长度=%d\n",GListLength(m)); printf("广义表m的深度=%d\n",GListDepth(m)); printf("遍历广义表m:\n"); Traverse_GL(m,visit); DestroyGList(&m); m=GetHead(l); printf("\nm是l的表头,遍历广义表m:\n"); Traverse_GL(m,visit); DestroyGList(&m); m=GetTail(l); printf("\nm是l的表尾,遍历广义表m:\n"); Traverse_GL(m,visit); InsertFirst_GL(&m,l); printf("\n插入l为m的表头,遍历广义表m:\n"); Traverse_GL(m,visit); printf("\n删除m的表头,遍历广义表m:\n"); DestroyGList(&l); DeleteFirst_GL(&m,&l); Traverse_GL(m,visit); printf("\n"); DestroyGList(&m); }
void main() { char p[80]; SString t; GList l,m; InitGList(&l); InitGList(&m); printf("空广义表l的深度=%d l是否空?%d(1:是 0:否)\n",GListDepth(l),GListEmpty(l)); printf("请输入广义表l(书写形式:空表:(),单原子:(a),其它:(a,(b),c)):\n"); gets(p); StrAssign(t,p); CreateGList(&l,t); printf("广义表l的长度=%d\n",GListLength(l)); printf("广义表l的深度=%d l是否空?%d(1:是 0:否)\n",GListDepth(l),GListEmpty(l)); printf("遍历广义表l:\n"); Traverse_GL(l,visit); printf("\n复制广义表m=l\n"); CopyGList(&m,l); printf("广义表m的长度=%d\n",GListLength(m)); printf("广义表m的深度=%d\n",GListDepth(m)); printf("遍历广义表m:\n"); Traverse_GL(m,visit); DestroyGList(&m); m=GetHead(l); printf("\nm是l的表头元素,遍历m:\n"); Traverse_GL(m,visit); DestroyGList(&m); m=GetTail(l); printf("\nm是由l的表尾形成的广义表,遍历广义表m:\n"); Traverse_GL(m,visit); InsertFirst_GL(&m,l); printf("\n插入广义表l为m的表头,遍历广义表m:\n"); Traverse_GL(m,visit); printf("\n删除m的表头,遍历广义表m:\n"); DestroyGList(&l); DeleteFirst_GL(&m,&l); Traverse_GL(m,visit); printf("\n"); DestroyGList(&m); }
int GListDepth(GList L) { // 采用头尾链表存储结构,求广义表L的深度。算法5.5 int max,dep; GList pp; if(!L) return 1; // 空表深度为1 if(L->tag==ATOM) return 0; // 原子深度为0 for(max=0,pp=L;pp;pp=pp->ptr.tp) { dep=GListDepth(pp->ptr.hp); // 求以pp->a.ptr.hp为头指针的子表深度 if(dep>max) max=dep; } return max+1; // 非空表的深度是各元素的深度的最大值加1 }
int GListDepth(GList1 L) { int max = 0, dep; GList1 p; if (L->tag == LIST && !L->hp) { return 1; } else if (L->tag == ATOM) { return 0; } else { for (p = L->hp; p; p = p->tp) { dep = GListDepth(p); if (dep > max) max = dep; } } return max + 1; }