数据结构(C语言第2版)-----数组,广义表,树,图

任何一个算法的设计取决于选定的数据结构,而算法的实现依赖于采用的存储结构。

之前线性表的数据元素都是非结构的原子类型,元素的值是不可再分的。下面学习的这两个线性表是很特殊的,其中数据元素本身也可能是一种数据结构。

认识数组和广义表

数组可以看成是一种特殊的线性表,也就是线性表中的数据元素本身也是一个线性表,数组中的个元素具有统一的类型。其实说白了就是在脑海中想数组中的数据如何在内存中以什么形式的线性表来存储。在C语言中,一个二维数组可以定义为其分量类型为一维数组类型的一维数组类型。

数组一旦被建立,数组中的维度和维界就不再改变,即数组中的数据元素数目固定,并且数组中每个数据元素都和唯一的一组下标值对应。也就是数组的元素个数和数据元素之间的关系就不能发生变化,所以不会有元素的插入和删除等操作,其基本操作主要是数据元素的读取和更新。

由于内存空间是一维的结构,而数组元素之间的位置是有规律的,因此用一维连续存储单元存放数组的数据元素就有个次序约定问题。

广义表简称表,和之前数组是一类的,但是还有点区别,广义表中的不同元素可以有不同的结构,它是一种递归的数据结构。

广义表有三个重要的结论:

  • 层次性:里面的元素可以是子表,子表中的元素也可以是子表,是一个多层次结构

  • 共享性:可以其它表所共享。
  • 递归性:可以是其自身的子表。

这里面就是说在广义表里面的一个空间中在有一个结构体,里面保存数据的值。之前的内容主要是指针。总感觉广义表这些东西是内存中需要保存的,我们做程序的大体知道就OK,不需要说把里面的细节全部的会。

树和二叉树

之前了解的栈,队列,数组,广义表等都是线性结构,而树是一种非线性结构,但是一种分层结构,树和二叉树是处理层次模型的典型结构。

  • 树的定义:是n个结点的有限集,在任意一颗非空树中有且只有一个称为根(root)的结点,其余的结点被分为m个互不相交的有限集,其中每个集合本身又是一颗树,称为跟结点的子树。

图示法表示二叉树的一个结论:

  1. 边的数目恰好比结点数目少一个,即e=n-1;

  2. 节点分为根节点,分支结点,叶子结点。
  3. 度分为结点的度和树的度,结点的度是指该结点相连的孩子结点的数目,树的度是指树中所有结点的度的最大值。
  4. 树是一种分层结构,根结点作为第一层,结点的层次(树深度)是指从根结点开始到该结点的层次数,树的深度是指该树中所有结点的层次的最大值。
  5. 森林是m颗互不相交的树的集合。对于树中的每个结点而言,其子树的集合及时森林。
  • 二叉树是一种特殊的有向树,也叫二元位置树。特点是每个结点至多有两棵子树,即二叉树中的每个结点至多有两个孩子结点,且每个孩子结点都有各自的位置关系。

二叉树定义:二叉树或者可以为空,或者是由一个根结点加上两棵分别称为左子树和右子树的,互不相交的二叉树组成。

  1. 满二叉树:就是除叶子结点外的任何结点均有两个孩子结点,且所有的叶子结点都在同一层上的二叉树。特点是每一层上的结点树是最大的。

  2. 完全二叉树:除去最底层结点后的二叉树是一颗满二叉树,且最底层结点均靠左对其的二叉树。

算法中处理的事件有两类,一类是客户到达事件,另一类是客户离开事件,前一类事件发生的时刻随客户到来自然形成;后一类事件发生的时刻按先后顺序进行,则由客户事务所需时间和等待所耗的时间而定。

递归定义的基本项描述了一个或几个递归过程的终结状态,虽然一个有限的递归(无迭代)可以描述一个无限的计算过程,但任何实际应用的递归过程除错误情况外,必定能经过有限层次的递归而终止。所谓终结状态指的是不需要继续递归而可直接求解的状态。

递归定义的归纳项描述了如何实现从当前状态到终结状态的转换。

递归设计的实质:当一个复杂的问题可以分解成若干个子问题来处理时,其中某些子问题与原问题有相同的特征属性,则可利用和原问题相同的分析处理方法,反之这些子问题解决了原问题也解决了。

/*
 二叉树的存储
*/
#define VirNode ‘0‘;
#define MAX_TREE_SIZE 100;
typedef char ElemType;
typedef ElemType SqBitTree[MAXZ_TREE_SIZE];   //SqBitTree[0]单元存放结点的总数,通常存放构成满二叉树时的结点总数;

//二叉树的层次遍历算法
void leveltree(SqBitTree bt){
	int i,j;
	i=1;
	while(i<=bt[0]){
		for(j=i;j<2*i;j++){
			if(bt[j]==VirNode) printf("*");
			else
				printf("%c",bt[j]);
		}
		printf("\n");
		i=2*i;
	}
}

//二叉树的按层次建立算法
void crebitree(){
	int i,j,m;
	i=1;m=0;
	while(m<n){
		for(j=i;j<2*i;j++){
			scanf("%c",bt+j);
			if(bt[j]!=VirNode)
				m++;
		}
		i=2*i;
	}
	bt[0]=i-1;
}
//交换二叉树中所有结点的左右子树算法
void exchangetree(SqBitTree bt){
	int k=2,i,j;ElemType t;
	while(k<=bt[0]){
		for(i=k,j=2*k-1;i<j;i++,j--){
			t=bt[i];
			bt[i]=bt[j];
			bt[j]=t;
		}
		k=2*k;
	}
}
//统计叶子结点的个数
int countleaf(SqBitTree bt){
	int i,j,n;
	i=1;n=0;
	while(i<=bt[0]/2){
		for(j=i;j<2*i;j++)
			if(bt[j]!=VirNode&&bt[2*j]==VirNode&&bt[2*j+1]==VirNode)
				n++;
			i=2*i;
	}
	for(j=i;j<2*i;j++)
		if(bt[j]!=VirNode)
			n++;
		return n;
}
//求二叉树的高度
int height(SqBitTree bt){
	int i,j,h;
	i=1;h=0;
	while(i<=bt[0]){
		h++;
		i=2*i;
	}
	return h;
}

二叉树的遍历就是依次访问二叉树中的各个结点,而且每个结点仅被访问一次。遍历的3中方式有,先序遍历,中序遍历,后序遍历。这个主要是看根结点在什么地方,比如第一个,先序,那么就是根左右,中序就是左根右,后序就是左右根;

认识图

线性表是一种一对一的相邻关系,树是一种一对多的层次关系,图是一种多对多的网状关系,

时间: 2024-08-27 05:01:31

数据结构(C语言第2版)-----数组,广义表,树,图的相关文章

数据结构 笔记5 多维数据与广义表

多维数组 数组是一种常见的数据类型,由于数组中各元素具有相同的数据类型,并且数据元素的下标一般具有固定的上界和下界. 数组是一种元素个数固定的线性表 数组一般不做插入和删除的操作,因此数组一旦建立,结构中的元素个数和元素间的关系就不再发生变化,所以一般用顺序存储方法来表示数组 由于计算机的内存结构是一维的,所以二位数组一般用行向量,列向量形式表示 二维数组的边界结点(除了开始结点和终端结点除外只有一个直接前趋或者只有一个直接后继),其余结点都有两个直接前趋和两个直接后继 矩阵的压缩存储 由于矩阵

数据结构29:广义表的长度和深度

广义表的长度 通过前一节对广义表的介绍,例子中给出了几个广义表的长度.例如:空表的长度为 0,只含有一个原子的广义表长度为 1,等等. 广义表的长度指的是广义表中数据元素的数量.这里需要指明的是,一个广义表中,一个原子算做是一个元素,一个子表也只算做一个元素. 在 LS = (a1,a2,…,an) 中,ai表示原子或者子表, LS 的长度为 n. 广义表的深度 广义表的深度,指的是广义表中括号的重数.例如:C=(a,(b,c,d)): 图1 广义表C的深度 图1中,从前往后数左括号的数量就是广

广义表的基本操作实现

广义表的四个特征:(1)广义线性表:(2)元素复合性:(3)元素递归性:(4)元素共享性 广义表的上述四个特征对于他的使用价值和应用效果起到了很大的作用.广义表的结构相当灵活,它可以兼容线性表.数组.树和有向图等各种常用的数据结构.当二维数组的每行或每列作为子表处理时,二维数组就是一个广义表:如果限制广义表中元素的共享和递归,广义表和树对应:如果限制广义表的递归并允许数据共享,则广义表和图对应. 广义表的基本操作有:(1)创建一个广义表(我以头尾链表作为存储结构):(2)取表头:(3)取表尾:(

数据结构(C语言版)-第4章 串、数组和广义表

补充:C语言中常用的串运算 调用标准库函数 #include<string.h> 串比较,strcmp(char s1,char s2) 串复制,strcpy(char to,char from)串连接,strcat(char to,char from) 求串长,strlen(char s) 4.1  串 串(String)----零个或多个字符组成的有限序列 串的存储结构:顺序存储.链式存储 顺序存储表示 typedef struct{ char *ch; //若串非空,则按串长分配存储区,

数组和广义表-第5章-《数据结构题集》答案解析-严蔚敏吴伟民版

习题集解析部分 第5章 数组和广义表 ——<数据结构题集>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑       本习题文档的存放目录:数据结构\▼配套习题解析\▼05 数组和广义表       文档中源码的存放目录:数据结构\▼配

5-5-广义表(头尾链表存储表示)-数组和广义表-第5章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第5章  数组和广义表 - 广义表(头尾链表存储表示) ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.SequenceString.c    

5-6-广义表(扩展线性链表存储表示)-数组和广义表-第5章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第5章  数组和广义表 - 广义表(扩展线性链表存储表示) ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.SequenceString.c  

5-3-行逻辑链接的顺序表(稀疏矩阵)-数组和广义表-第5章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第5章  数组和广义表 - 行逻辑链接的顺序表(稀疏矩阵) ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.Scanf.c        相关测试

5-4-十字链表(稀疏矩阵)-数组和广义表-第5章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第5章  数组和广义表 - 十字链表(稀疏矩阵) ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.Scanf.c        相关测试数据下载