广义表存储结构与算法设计分析
- 格式:doc
- 大小:62.00 KB
- 文档页数:6
个⼈对数据结构的理解和总结 在很多编程⼈员的潜意识⾥总是觉得数据结构知识似乎没什么⽤,因为⼯作中似乎从来都没有涉及到数据结构的什么内容。
我对这样的认识只能报以呵呵~ 也难怪,其实有这些想法的同⾏在⼯作中的⼤部分都是如此⾛过来的:掌握⼏种常⽤Web框架,⽐如SSH,然后不停的堆砌已有的API做⼀些对数据库的增删改查之类的简单代码设计,最后反正功能是实现了,是否设计⽆误,效率⼜优,就⼏乎没有⼈去管了。
也是,这样的⼯作也基本涉及不到有⽤到数据结构知识去解决问题的地⽅。
其实,有这样想法⼈算不上真正的软件开发者,或者层次还不深,因为数据结构是软件开发中最基础最重要的理论基础。
1. 为什么数据结构很重要⾸先为什么要开发各种各样的软件,⽬的只有⼀个:就是利⽤计算机来为⼈们处理各种数据并以⼀定的形式展现出来供⽤户使⽤。
随着计算机的应⽤范围的不断扩⼤,计算机所需要处理的数据越来越复杂,并且规模越来越⼤,计算机所处理的数据已不再是单纯的数值数据,⽽更多的是⾮数值数据。
另⼀⽅⾯,现实中需要处理的数据并不是杂乱⽆章的,它们⼀定有内在的各种联系,但这需要算法设计⼈员去总结、归纳、建模、然后抽象出⼀个具体的模型来表⽰—,我们将这个模型成为数据的逻辑结构。
然后聪明的设计师再围绕这个创建的逻辑结构总结设计出⼀套处理⽅法,这样,数据有了,模型有了,算法有了,在理论上问题就可以解决了。
剩下的就应该交给计算机去做了,但以上都是基于逻辑上的设计,计算机才不懂这些。
所以接下来还需要对应的存储结构来将要处理的数据先存储到计算机中,再将那些处理逻辑(算法)⽤相应的代码实现,计算机才能对数据进⾏有效的处理。
2. 什么是数据结构数据结构:即⼈们抽象出来的描述现实世界实体的数学模型(⾮数值计算)及其上的操作(运算),在计算机上的表⽰和实现。
数据结构就是指按⼀定的逻辑结构组成的⼀批数据,使⽤某种存储结构将这批数据存储于计算机中,并在这些数据上定义了⼀个运算集合。
广义表的存储结构广义表是一种表示数据结构的层次形式。
广义表的数据结构具有弹性,可以用来表示任意复杂度的对象,广泛应用于计算机科学中,在许多普通的程序设计语言中,这是一种重要的数据类型。
简而言之,它可以表示更复杂的结构,例如树形结构和图形结构。
广义表是一种递归结构,它由多个元素构成。
一个广义表的元素可以是一个基本的值,也可以是一个广义表,表示下一级的数据结构。
基本元素可以是任何数据类型,而广义表的元素可以是任意复杂度的数据结构。
因此,广义表用来表示任意复杂度的数据结构有着十分强大的表示能力,成为一种强大的数据结构表示方式。
当处理广义表的存储问题时,需要考虑到其数据的特点,只有当特点被有效考虑到时,储存和操作广义表才能更有效地实现。
为了实现更有效的存储,一般有三种方式可以考虑:链式储存、双亲表示法和结点表示法。
链式储存是一种比较简单的方式,把广义表的每个元素都以链表的形式存储下来,这种方式可以方便地查找元素,操作形式也比较简单,但是因为引入了指针,而且每个结点只有一个指针,所以存储空间利用率低,不够高效。
双亲表示法是利用普通表表示广义表的一种方式,它把广义表的每个元素都储存在一个有限的表格中,每个元素的表格包括元素的值、子节点的位置、双亲节点的位置等,以此来表示广义表的结构关系。
双亲表示法的优点是其存储效率高,把每个元素的值和其结构关系存储在一张表中,存储空间利用率比较高,但是它的查找和操作效率比较低,需要大量的遍历操作。
结点表示法是另一种表示广义表的方式,它把广义表的每个元素都储存在一个节点中,每一个节点中包含元素的值,以及指向该元素的子节点和双亲节点的指针,因此可以表示出广义表的层次结构。
结点表示法既可以查找结点和操作结点,又能存储元素的值和结构关系,所以其存储空间利用率较高,查找和操作也比较快,比较灵活。
总之,当处理广义表的存储问题时,可以通过链式储存、双亲表示法和结点表示法来实现更有效的存储,其中结点表示法比较灵活,在存储空间利用率上要优于其他方法。
广义表1 题目编写一个程序,实现广义表的各种运算,并在此基础上设计一个程序完成如下功能:建立广义表g=“(b,(b,a),((a,b),c))”的链式存储结构。
输出广义表g的长度。
输出广义表g的深度。
2 目标熟悉广义表的定义及其基本操作的实现3 设计思想链式存储的广义表,结点包含数据区,指针,以及一个标记头结点的整型数。
广义表的表示结构为:(a,b),其中a、b可以是字符或广义表。
因此,可以用递归算法来实现对它的定义与操作。
4 算法描述(1)创建广义表:逐个输入表示广义表的字符串,以‘(’为起始标志建立结点并标记为头结点,递归调用此操作建立广义表;若读入‘)’则将最后结点的指针置空;读入非结束字符,赋值到结点数据区,并赋值指针形链式结构,两个结点之间打印‘,’。
(2)求广义表长度:广义表基本组成元素(a,b)若a、b不是广义表则(a,b)深度为一。
广义表的深度等于表头结点的数量,从表头结点遍历广义表,对每一个广义表结点应用该函数,若tag==1(结点是表头)则返回计数器加一,否则返回0。
(3)输出广义表:从表头开始,测试结点指针,若指针指向结点的标记位为1,则先打印‘(’再输出其数据值,并调用该操作输出下一个结点;函数返回时,测试指针指向结点的标记位,若为1,则先打印‘)’,再调用该函数输出下一个结点数据;每次输出数据值以后测试该结点是否为子广义表的最后一个结点,不是则输出‘,’,否则返回。
5 程序结构图6 源程序#include<iostream.h>#include<malloc.h>#include <stdio.h>typedef struct lnode{int tag;union{char atom;struct lnode *p;}ptr;struct lnode *q;}Lnode;Lnode *CreatGL(){ // 创建一个广义表,表中元素为字符Lnode *h;char ch;ch=getchar();if(ch){h=(Lnode*)malloc(sizeof(Lnode)); //为表分配内存空间if(ch=='('){h->tag=1;h->ptr.p=CreatGL(); //用递归的方法实现创建广义表的操作}else if(ch==')')h=NULL;else{h->tag=0;h->ptr.atom=ch;}}else h=NULL;ch=getchar();if(h!=NULL)if(ch==',')h->q=CreatGL();elseh->q=NULL;return h;}int GLLength(Lnode *g){ // 求广义表的长度int n=0;g=g->ptr.p;while(g){n++;g=g->q;}return n;}int GLDepth(Lnode *g){ // 求广义表的深度int max=0,dep;if(g->tag==0)return 0;g=g->ptr.p;if(g==NULL)return 1;while(g){if(g->tag==1){dep=GLDepth(g);if(dep>max)max=dep;}g=g->q;}return (max+1);}void DispGL(Lnode *g){ // 输出广义表if(g){if(g->tag==1){cout<<"(";if(g->ptr.p==NULL)cout<<" ";elseDispGL(g->ptr.p);}elsecout<<g->ptr.atom;if(g->tag==1)cout<<")";if(g->q){cout<<",";DispGL(g->q);}}else cout<<"广义表不存在"<<endl; }#include <stdio.h>#include <stdlib.h>#include<iostream.h>#include"glist.h"int main(){char choice;Lnode *glist;cout<<"键入广义表:"<<endl;glist=CreatGL();system("cls");printf("请选择(输入0退出)\n1 输出广义表内容\n2 输出广义表长度\n3 输出广义表深度\n");cout<<endl<<"选择:";cin>>choice;while(choice!='0'){system("cls");printf("请选择(输入0退出)\n1 输出广义表内容\n2 输出广义表长度\n3 输出广义表深度\n");switch (choice){case '1':DispGL(glist);cout<<endl;break;case '2':cout<<"广义表的长度为: "<<GLLength(glist) <<endl;break;case '3':cout<<"广义表深度为:"<<GLDepth(glist)<<endl;break;case '0':return 0;}cout<<endl<<"选择:";cin>>choice;}。
《数据结构与算法》第五章数组和广义表本章介绍的数组与广义表可视为线性表的推广,其特点是数据元素仍然是一个表。
本章讨论多维数组的逻辑结构和存储结构、特殊矩阵、矩阵的压缩存储、广义表的逻辑结构和存储结构等。
5.1 多维数组5.1.1 数组的逻辑结构数组是我们很熟悉的一种数据结构,它可以看作线性表的推广。
数组作为一种数据结构其特点是结构中的元素本身可以是具有某种结构的数据,但属于同一数据类型,比如:一维数组可以看作一个线性表,二维数组可以看作“数据元素是一维数组”的一维数组,三维数组可以看作“数据元素是二维数组”的一维数组,依此类推。
图5.1是一个m行n列的二维数组。
5.1.2 数组的内存映象现在来讨论数组在计算机中的存储表示。
通常,数组在内存被映象为向量,即用向量作为数组的一种存储结构,这是因为内存的地址空间是一维的,数组的行列固定后,通过一个映象函数,则可根据数组元素的下标得到它的存储地址。
对于一维数组按下标顺序分配即可。
对多维数组分配时,要把它的元素映象存储在一维存储器中,一般有两种存储方式:一是以行为主序(或先行后列)的顺序存放,如BASIC、PASCAL、COBOL、C等程序设计语言中用的是以行为主的顺序分配,即一行分配完了接着分配下一行。
另一种是以列为主序(先列后行)的顺序存放,如FORTRAN语言中,用的是以列为主序的分配顺序,即一列一列地分配。
以行为主序的分配规律是:最右边的下标先变化,即最右下标从小到大,循环一遍后,右边第二个下标再变,…,从右向左,最后是左下标。
以列为主序分配的规律恰好相反:最左边的下标先变化,即最左下标从小到大,循环一遍后,左边第二个下标再变,…,从左向右,最后是右下标。
例如一个2×3二维数组,逻辑结构可以用图5.2表示。
以行为主序的内存映象如图5.3(a)所示。
分配顺序为:a11 ,a12 ,a13 ,a21 ,a22,a23 ; 以列为主序的分配顺序为:a11 ,a21 ,a12 ,a22,a13 ,a23 ; 它的内存映象如图5.3(b)所示。
广义表的应用课程设计一、课程目标知识目标:1. 理解广义表的定义和基本概念;2. 学会使用广义表表示复杂的线性结构;3. 掌握广义表的基本操作,如创建、插入、删除、查找等;4. 能够运用广义表解决实际问题。
技能目标:1. 能够运用广义表的基本操作,实现线性结构的存储和运算;2. 能够分析实际问题,选择合适的广义表结构进行建模;3. 能够编写简单的程序,利用广义表解决具体问题;4. 培养学生的逻辑思维能力和编程实践能力。
情感态度价值观目标:1. 培养学生对数据结构和算法的兴趣,激发学习热情;2. 培养学生的团队协作意识和解决问题的能力;3. 培养学生面对复杂问题,勇于尝试、积极探究的精神;4. 增强学生的自信心和成就感,鼓励他们发挥创新精神。
课程性质:本课程为计算机科学领域的数据结构与算法课程,旨在帮助学生掌握广义表这一数据结构,并运用其解决实际问题。
学生特点:学生具备一定的编程基础,对数据结构有一定了解,但可能对广义表的认识较为陌生。
教学要求:结合学生特点,注重理论与实践相结合,通过实例讲解、课堂互动、上机实践等环节,使学生掌握广义表的应用。
同时,关注学生的情感态度,激发学习兴趣,培养其解决问题的能力和团队协作精神。
在教学过程中,将课程目标分解为具体的学习成果,以便于教学设计和评估。
二、教学内容1. 广义表的定义与基本概念:- 线性表、广义表的概念与区别;- 广义表的元素、表头、表尾及表长等基本概念。
2. 广义表的存储结构:- 顺序存储结构;- 链式存储结构。
3. 广义表的基本操作:- 创建广义表;- 插入、删除、查找等操作;- 广义表的遍历。
4. 广义表的应用:- 利用广义表解决实际问题,如多项式的表示与运算;- 广义表在数据压缩中的应用;- 广义表在计算机图形学中的应用。
5. 教学案例与上机实践:- 结合实际案例,分析广义表的应用场景;- 上机实践,编写程序实现广义表的基本操作;- 团队协作,共同探讨广义表在解决复杂问题中的应用。
三元多项式的广义表存储结构
三元多项式的广义表存储结构是一种数据结构,用于表示三元多项式的系数、
指数和各项的次数。
它能够有效地存储和操作多项式,并提供快速的检索、插入和删除操作。
广义表是一种扩展了线性表的数据结构,可以表示复杂的结构和关系。
在三元
多项式的广义表存储结构中,可以使用表头指针和指针域来指示多项式中的每一项。
对于三元多项式来说,广义表存储结构可以通过链式存储实现。
每个节点包含
三个域:系数、指数和指向下一项的指针。
使用链表的方式存储可以灵活地处理多项式中的每一项,并且不会浪费存储空间。
在广义表存储结构中,可以使用头指针来指向多项式的第一个节点,通过节点
的指针域可以依次访问多项式中的每一项。
每个节点存储了项的系数和指数,以及指向下一项的指针。
通过使用广义表存储结构,可以方便地进行多项式的加法、减法、乘法和求导
等运算。
在多项式的加法运算中,可以遍历两个多项式的节点,逐个比较指数,并将相同指数的项进行合并。
在乘法运算中,可以将一个多项式中的每一项与另一个多项式中的每一项相乘,并将得到的结果合并。
总之,三元多项式的广义表存储结构是一种有效存储和操作多项式的数据结构。
它提供了灵活的存储方式,可以方便地进行多项式的各种运算。
通过使用广义表存储结构,可以方便地表示和处理三元多项式,满足多项式相关问题的需求。
《数据结构》学习指导说明:本指导以《数据结构》(C语言版)(严蔚敏等编著,清华大学出版社1997年出版,国家级优秀教材特等奖)和《数据结构题集》(严蔚敏等编著,清华大学出版社1999年出版)为教学主要参考书。
一、绪论1、学习目的:明确数据结构课程在本专业知识结构中的地位,作用。
课程的特点,教学的要求,方法。
明确数据结构所研究的问题以及有关基本概念。
初步掌握抽象数据类型的表示与实现,初步明确算法分析的作用与分析的重点,初步掌握算法分析的方法。
2、学习重点:数据的逻辑结构、存储结构及其算法,数据结构的有关概念,抽象数据类型及其表示与实现,算法,算法设计的要求,算法的时间复杂度和算法的空间复杂度。
3、学习难点:数据结构的有关概念,抽象数据类型的表示与实现;算法的时间复杂度分析。
4、课程内容与基本要求(一) 数据结构的引入(1) 三个世界:现实世界,信息世界,机器世界。
数据结构要解决的就是实现从现实世界到信息世界,再由信息世界到机器世界的转换,从而实现用计算机来解决问题的目的。
(2) 非数值问题(结合三个世界讲):控制,管理,数据处理(3) 数值问题:数值计算(4)数据结构:从学科角度讲,数据结构是一门研究非数值计算的程序设计问题中计算机操作对象以及他们之间的关系和操作等等的学科。
(二) 课程的地位,性质,作用。
(1) 地位: 计算机专业的核心课程之一。
(2) 性质: 算法理论基础和软件设计的技术基础课。
(3) 作用: 程序设计的基础,编译程序,操作系统,数据库系统及软件系统和应用程序的基础(三) 数据结构的产生和发展(四) 课程的特点,学习的要求教材:《数据结构》(C语言版)严蔚敏等编著北京清华大学出版社1997年参考书:《数据结构》许卓群等编著北京高等教育出版社1987年数据结构实用教程》(C/C++描述)徐孝凯北京清华大学出版社1999年《数据结构题集》严蔚敏等编著北京清华大学出版社1999年《数据结构导学》苏光奎等编著北京清华大学出版社20XX年《数据结构》(C语言篇)-习题与解析李春葆编著北京清华大学出版社20XX年《数据结构》实验指导书唐开山自编讲义20XX年(五) 基本概念和术语数据数据元素数据对象(4)数据结构:按某种逻辑关系组织起来的一批数据,按一定的存储表示方式把它存储到计算机的存储器中,并在这些数据上定义了一个运算的集合,叫做一个数据结构。
广义表存储结构与算法设计分析(论文)薛金凤(内蒙古师范大学青年政治学院)摘要:给出了存储广义表两种不同存储结构的具体类型定义及其C 语言描述,对两种不同存储结构下广义表的几种基本操作算法——求广义表的长度、深度、表长和表尾等算法进行了分析设计,并给出相应算法的C 语言描述和时间复杂度分析,为数据结构相关章节的教学起到一定的指导作用。
关键词:广义表;抽象数据类型;C 语言;时间复杂度广义表在《数据结构》课程的实际讲授中,一般作为由线性结构向非线性结构进行过渡的部分,大多数参考文献对于该部分内容都只给出简单的介绍,而并未给出具体的算法实现;但仔细分析广义表的逻辑结构特点,发现数据结构中的绝大多数逻辑结构都可以归纳为广义表结构,广义表在数据结构中应该占据相当重要的位置,如果让广义表统领大多数的数据存储结构,有利于增强学生的总结概括能力,对《数据结构》课程相关章节的教学也起到推波助澜的作用。
本文将介绍广义表所采用的两种不同存储结构,及其C 语言描述的类型定义,分析求解广义表的长度、深度、表头及表尾等操作应基于的存储结构,给出具体的操作算法及其C 语言描述,并对各个算法进行时间复杂度分析。
1 广义表的定义广义表是线性表的推广,也称列表,广泛应用于人工智能等领域的表处理LISP 语言中。
广义表一般记作LS=(12,.......n a a a ),其中n 为表长,i a 可以是单个元素,也可以是广义表。
层次性事广义表的主要特点之一。
单元素结点(原子结点)没有子结点;表结点或者问空表结点,或者拥有子结点;表结点和它的子结点分布在广义表的不同层次上。
广义表划分结点层次的规则:头结点定义为第一层结点;属于第k 层次子表结点的结点定义为第k+1层次结点,k=1,2,…定义1 广义表第一层次中元素结点的个数称为广义表的长度。
11收稿日期:2012年6月12作者简介:薛金凤,内蒙古包头人,即将毕业于内蒙古师范大学青年政治学院。
定义2 广义表中结点的最大层次称为广义表的深度。
定义3 在广义表LS=(12,.......n a a a )中,首元素1a 称为广义表的表头,而其余元素构成的表(12,.......n a a a )称为广义表的表尾。
广义表的抽象数据类型(Abstract Data Type 简记ADT )描述中包括广义表的数据对象D ({}1,2,...,;0;e ,i i i e i n n e AtomSet Glist AtomSet ==≥∈∈或为某个数据对象)和数据关系R({}11e ,,,2i i i i e e e D i n --<>∈≤≤)同时定义了若干广义表的基本操作,包括:广义表的初始化、建立、销毁、复制、判空、求广义表长度、求广义表深度、求广义表表头、求广义表表尾、向广义表表头插入元素、删除广义表表头元素以及遍历广义表等操作。
2 广义表的存储表示为实现广义表的基本操作,首先需要考虑其存储结构。
由于广义表中的元素即可能是单元素又可能是子表,难以用顺序结构来表示,因而通常采用链式存储结构进行存储。
可以采用两种不同的存储方案:一是原子结点与表结点同构;二是原子结点与表结点异构。
2.1 原子结点与表结点同构的存储表示 原子结点与表结点同构,指的是无论原子结点还是表结点均由3个域构成(又称广义表的孩子兄弟表示法)。
设定tag 域为0表示该结点为原子结点,此时另外两个域分别存储结点的元素值和指向其后继结点起始地址的指针;tag 域为1表示该结点为表结点,此时另外两个域分别为指向表头的指针和指向后继结点起始地址的指针。
采用同构存储结构时,广义表的定义类型可用C 语言描述如下:Typedef enum {ATOM,LIST}Elem Tag;Typedef struct GLNode{Elem Tagtag ;//区别两种结点的标志域Union{Atom Typeatom;//原子结点值域Struct GLNode *hp;//指向表头的指针}Struct GLNode *tp;//指向后继结点的指针}* Glist_1;2.2原子结点与表结点异构的存储表示原子结点与表结点异构,指的是原子结点仅由tag和atom2个域组成,而表结点则由tag、hp和tp3个域构成(又称广义表的头尾表示法)同样设定tag域为0时表示该结点为原子结点,此时atom域用于存储结点的元素值;tag域为1表示该结点为表结点,此时另外两个域分别为指向表头和指向表尾的指针。
采用异构存储结构时,广义表的定义类型可用C语言描述如下:Typedef enum{ATOM,LIST}ElemTag;Typedef struct GLNode {Elem Tagtag;//区别两种结点的标志域Union{AtomType atom ;//原子结点值域Struct{struct GLNode *hp;//指向表头的指针Struct GLNode *tp;//指向表尾的指针}ptr;}* Glist_2;3广义表相关操作的算法分析与设计广义表抽象数据类型描述的基本操作中,初始化、建立、销毁、复制以及判空等前5个操作为最简操作,其算法对于采用哪种存储结构没有特殊要求;后面7种操作则针对不同的存储结构,其算法设计方法均有一定的不同。
下面着重给出求广义表长度、深度、表头和表尾等操作的算法设计分析。
3.1求广义表长度的算法求广义表的长度即统计广义表第一层次中元素结点的个数。
该操作的初始条件为广义表已存在,操作结果即返回求得的广义表长度(元素个数)。
由原子结点与表结点同构的存储结构可以看出:无论原子结点还是表结点的tp域,均为指向该结点后继结点起始地址的指针,因此,可通过在该存储上,从广义表的hp指针链接的结点个数,从而求得广义表的长度。
其操作算法可用C语言描述如下(设广义表L已建立,其类型为Glist_1);Int Glist Lengh(Glist_1 L){int count=1;Glist_1 p=L→hp;While (p→tp)//p所指结点后继非空{p=p→tp;count + +;}//指针后移并计数retuncount;}3.2求广义表深度的算法广义表的深度指的是广义表中结点的最大层次,等于所有子表中表的最大深度加1,若一个广义表为空或仅由原子结点组成,则深度为1.该操作的初始条件为广义表已存在,操作结果返回求得的广义表的深度。
可以通过计数指针在不同层次结点中的移动情况计算出广义表的深度。
该操作可采用两种存储结构中的任意一种。
设采用同构的存储结构Glist_1,则求广义表深度的递归算法可用C语言描述如下(设广义表L已建立):Int GlistDepth(Glist_1L){intcount,depth;For(depth=0;L→hp;L= L→hp →tp)//L非空If(L→hp →tag)//L的表头为子表结点{count =GlistDepth(L→hp);If(count>depth)depth=count;}Returndepth+1;}3.3求广义表表头的算法广义表表头即广义表中的首元素,求表头操作的初始条件为广义表已存在,操作结果返回广义表的表头结点。
由两种存储结构均可以肯出:结点的hp域为指向该结点的表头结点起始地址的指针,因此,采用两种存储结构中的任何一种均可通过广义表表头结点的hp指针求得广义表的表头(异构存储结构时当广义表非空)。
设广义表L已基于结点同构的存储结构Glist_1创建并生成,其操作算法可用C语言描述如下:Glist_1 GetHead(Glist_1L){return(L→hp);}若广义表L已基于结点异构的存储结构Glist_2创建并生成,则其操作算法可用C语言描述如下:Glist_2 GetHead(Glist_2L){if(L= = NULL)Ruturn(NULL);//采用异构存储结构时广义表头指针为空则返回空指针ElseReturn(L→ptr.hp);}3.4求广义表表尾的算法广义表表尾是由广义表中自第二个元素之后的其余元素构成的子表,求表尾操作的初始条件为广义表已存在,操作结果求得广义表的表尾。
由原子结点与表结点异构的存储结构可以看出:广义表非空时,其表头结点的tp域即为指向广义表表尾子表的指针,因此,可通过广义表表头结点的tp域求得广义表的表尾。
其操作算法可用C语言描述如下(设广义表L已建立,其类型为Glist_2):Glist_2 Get Tail(Glist_2L){if(L= = NULL)Return(NULL);//采用异构存储结构时广义表头指针为空则返回空指针ElseReturn( L→ptr.tp);}3.5算法时间复杂度分析求广义表长度的算法函数Glist Lengh 中包含一个while循环,循环体基本语句p=p→tp;和count + +;的执行次数取决于广义表中结点的个数n(看作问题的规模),当广义表深度为1时,n即为广义表的长度,从而循环体基本语句的执行次数最大为n 次,因而算法的时间发杂度为线性阶,即T(n)=O(n)。
求广义表深度的算法函数GlistDepth 中包含一个for循环,算法的基本操作为循环体中的语句,循环体的执行次数跟广义表的结点数n(视作问题的规模)成正比,GlistDepth(p→hp)递归调用的次数则跟广义表的深度depth成正比,因此,算法的时间复杂度为T(n)=O(n+m)。
求广义表表头的两个不同存储结构上的算法函数GetHead中,均只包含一条基本语句,因而算法的时间复杂度为常数阶,即T(n)=O(1)。
3.6结论前述各基本算法的C语言描述均已通过完整的上机测试。
由原子结点与表结点同构的孩子兄弟表示法可以看出:存储结构Glist_1中,无论原子结点还是表结点的tp域均为指向该结点后继结点起始地址的指针,因此,该存储结构较适用于求解区分广义表表头和表尾等的相关操作。
参考文献:[1]张复兴、孙甲霞.广义表在数据结构中的位置[J].河南科技学院学报(自然科学版).2006,34(4):103-104.[2]严蔚敏,吴伟民.数据结构[M].北京:清华大学出版社,2006,109-112.。