Status CopyGList(GList &T, GList L) { // 算法5.6 // 采用头尾链表存储结构,由广义表L复制得到广义表T。 if (!L) T = NULL; // 复制空表 else { if (!(T = (GList)malloc(sizeof(GLNode)))) // 建表结点 return ERROR; T->tag = L->tag; if (L->tag == ATOM) T->atom = L->atom; // 复制单原子 else { CopyGList(T->ptr.hp, L->ptr.hp); // 复制广义表T->ptr.hp的副本L->ptr.hp CopyGList(T->ptr.tp, L->ptr.tp); // 复制广义表T->ptr.tp的副本L->ptr.tp } // else } // else return OK; } // CopyGList
GList GetTail(GList L) { // 将广义表L的表尾生成为广义表,返回指向这个新广义表的指针 GList t; if(!L) // 空表无表尾 return NULL; CopyGList(t,L->ptr.tp); // 将L的表尾拷给t return t; }
GList GetHead(GList L) { // 生成广义表L的表头元素,返回指向这个元素的指针 GList h,p; if(!L) // 空表无表头 return NULL; p=L->ptr.hp; // p指向L的表头元素 CopyGList(h,p); // 将表头元素复制给h return h; }
void CopyGList(GList1 &T, GList1 L) { T = NULL; if (L) { T = (GList1)malloc(sizeof(GLNode1)); if (!T) exit(OVERFLOW); T->tag = L->tag; if (L->tag == ATOM) T->atom = L->atom; else CopyGList(T->hp, L->hp); if (L->tp == NULL) T->tp = L->tp; else CopyGList(T->tp, L->tp); } }
GList1 GetTail(GList1 L) { GList1 t; InitGList(t); if (L->hp) CopyGList(t->hp, L->hp->tp); return t; }
void CopyGList(GList &T,GList L) { // 采用头尾链表存储结构,由广义表L复制得到广义表T。算法5.6 if(!L) // 复制空表 T=NULL; else { T=(GList)malloc(sizeof(GLNode)); // 建表结点 if(!T) exit(OVERFLOW); T->tag=L->tag; if(L->tag==ATOM) T->atom=L->atom; // 复制单原子 else { CopyGList(T->ptr.hp,L->ptr.hp); // 递归复制子表 CopyGList(T->ptr.tp,L->ptr.tp); } } }
GList GetTail(GList L) { // 取广义表L的尾 GList t; if(!L) { printf("空表无表尾!\n"); exit(0); } CopyGList(t,L->ptr.tp); return t; }
GList1 GetHead(GList1 L) { GList1 h, p; if (!L->hp) return NULL; p = L->hp->tp; L->hp->tp = NULL; CopyGList(h, L->hp); L->hp->tp = p; return h; }
Status CopyGList(GList &T,GList L) { // 采用头尾链表存储结构,由广义表L复制得到广义表T。算法5.6 if(!L) // 复制空表 T=NULL; else { T=(GList)malloc(sizeof(GLNode)); // 建表结点 if(!T) exit(OVERFLOW); T->tag=L->tag; if(L->tag==ATOM) T->atom=L->atom; // 复制单原子 else { CopyGList(T->ptr.hp,L->ptr.hp); // 复制广义表L->ptr.hp的一个副本T->ptr.hp CopyGList(T->ptr.tp,L->ptr.tp); // 复制广义表L->ptr.tp的一个副本T->ptr.tp } } return OK; }
GList GetHead(GList L) { // 取广义表L的头 GList h,p; if(!L) { printf("空表无表头!\n"); exit(0); } p=L->ptr.tp; L->ptr.tp=NULL; CopyGList(h,L); L->ptr.tp=p; return h; }
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); }