数据结构C语言版-广义表的头尾链表存储表示(共11页).doc
《数据结构C语言版-广义表的头尾链表存储表示(共11页).doc》由会员分享,可在线阅读,更多相关《数据结构C语言版-广义表的头尾链表存储表示(共11页).doc(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上数据结构C语言版 广义表的头尾链表存储表示.txtcopy(复制)别人的个性签名,不叫抄袭,不叫没主见,只不过是感觉对了。遇到过的事一样罢了。/*数据结构C语言版 广义表的头尾链表存储表示P109编译环境:Dev-C+ 4.9.9.2日期:2011年2月13日*/#include #include #include #include typedef char AtomType;/ 定义原子类型为字符型 typedef enumATOM,/ ATOM=0:原子LIST/ LIST=1:子表 ElemTag; / 广义表的头尾链表存储表示typedef struct GL
2、NodeElemTag tag;/ 公共部分,用于区分原子结点和表结点 union/ 原子结点和表结点的联合部分 AtomType atom; / atom是原子结点的值域, AtomType由用户定义 structstruct GLNode *hp,*tp;ptr; / ptr是表结点的指针域,prt.hp和ptr.tp分别指向表头和表尾 a; *GList, GLNode;/ 广义表类型 / 创建空的广义表Lint InitGList(GList *L) *L = NULL;return 1;/ 销毁广义表Lvoid DestroyGList(GList *L) GList q1,q2;i
3、f(*L)if(*L)-tag = ATOM)free(*L);/ 删除原子结点 *L = NULL;else/ 是表结点,则应该删除表头和表尾结点 q1 = (*L)-a.ptr.hp;q2 = (*L)-a.ptr.tp;free(*L);*L = NULL;/ 递归删除表头和表尾结点DestroyGList(&q1);DestroyGList(&q2);/ 算法5.6 P115/ 采用头尾链表存储结构,由广义表L复制得到广义表T。 int CopyGList(GList *T,GList L)if(!L)/ 为空,复制空表 *T = NULL;else*T = (GList)malloc
4、(sizeof(GLNode); / 建表结点 if(!*T)exit(0);(*T)-tag = L-tag;if(L-tag = ATOM)(*T)-a.atom = L-a.atom;/ 复制单原子 else/ 是表结点,则依次复制表头和表尾/ 复制广义表L-ptr.hp的一个副本T-ptr.hp CopyGList(&(*T)-a.ptr.hp), L-a.ptr.hp);/ 复制广义表L-ptr.tp的一个副本T-ptr.tp CopyGList(&(*T)-a.ptr.tp), L-a.ptr.tp);return 1;/ 返回广义表的长度,即元素个数int GListLength
5、(GList L)int len = 0;if(!L)return 0;if(L-tag = ATOM)return 1;while(L)L = L-a.ptr.tp;/根据表尾来判断len+;return len;/ 算法5.5 P114/ 采用头尾链表存储结构,求广义表L的深度。int GListDepth(GList L)int max, dep;GList pp;if(!L)return 1;/ 空表深度为1if(L-tag = ATOM)return 0;/ 原子深度为0for(max = 0, pp = L; pp; pp = pp-a.ptr.tp)/ 递归求以pp-a.ptr.
6、hp为头指针的子表深度 dep = GListDepth(pp-a.ptr.hp);if(dep max)max = dep;return max+1;/ 非空表的深度是各元素的深度的最大值加1 / 判定广义表是否为空int GListEmpty(GList L)if(!L)return 1;elsereturn 0;/ 取广义表L的头GList GetHead(GList L)GList h,p;if(!L)printf(空表无表头!n);exit(0);p = L-a.ptr.tp;/保存表尾L-a.ptr.tp = NULL;CopyGList(&h,L);L-a.ptr.tp = p;
7、/归还表尾return h;/ 取广义表L的尾GList GetTail(GList L)GList t;if(!L)printf(空表无表尾!n);exit(0);CopyGList(&t, L-a.ptr.tp);return t;/ 插入元素e作为广义表L的第一元素(表头,也可能是子表) int InsertFirst_GL(GList *L,GList e)GList p = (GList)malloc(sizeof(GLNode);if(!p)exit(0);p-tag = LIST;p-a.ptr.hp = e;p-a.ptr.tp = *L;*L = p;return 1;/ 删
8、除广义表L的第一元素,并用e返回其值int DeleteFirst_GL(GList *L,GList *e) GList p;*e = (*L)-a.ptr.hp;/ 用*e返回表头p = *L;*L = (*L)-a.ptr.tp;/ 将表尾当成表Lfree(p);/ 删除表头return 1;/ 利用递归算法遍历广义表L void Traverse_GL(GList L,void(*v)(AtomType)if(L) / L不空 if(L-tag = ATOM) / L为单原子 v(L-a.atom);else/ L为广义表 Traverse_GL(L-a.ptr.hp,v);Trave
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 语言版 广义 头尾 存储 表示 11
限制150内