数据结构(C语言第2版)-----数组,广义表,树,图
任何一个算法的设计取决于选定的数据结构,而算法的实现依赖于采用的存储结构。
之前线性表的数据元素都是非结构的原子类型,元素的值是不可再分的。下面学习的这两个线性表是很特殊的,其中数据元素本身也可能是一种数据结构。
认识数组和广义表
数组可以看成是一种特殊的线性表,也就是线性表中的数据元素本身也是一个线性表,数组中的个元素具有统一的类型。其实说白了就是在脑海中想数组中的数据如何在内存中以什么形式的线性表来存储。在C语言中,一个二维数组可以定义为其分量类型为一维数组类型的一维数组类型。
数组一旦被建立,数组中的维度和维界就不再改变,即数组中的数据元素数目固定,并且数组中每个数据元素都和唯一的一组下标值对应。也就是数组的元素个数和数据元素之间的关系就不能发生变化,所以不会有元素的插入和删除等操作,其基本操作主要是数据元素的读取和更新。
由于内存空间是一维的结构,而数组元素之间的位置是有规律的,因此用一维连续存储单元存放数组的数据元素就有个次序约定问题。
广义表简称表,和之前数组是一类的,但是还有点区别,广义表中的不同元素可以有不同的结构,它是一种递归的数据结构。
广义表有三个重要的结论:
- 层次性:里面的元素可以是子表,子表中的元素也可以是子表,是一个多层次结构
- 共享性:可以其它表所共享。
- 递归性:可以是其自身的子表。
这里面就是说在广义表里面的一个空间中在有一个结构体,里面保存数据的值。之前的内容主要是指针。总感觉广义表这些东西是内存中需要保存的,我们做程序的大体知道就OK,不需要说把里面的细节全部的会。
树和二叉树
之前了解的栈,队列,数组,广义表等都是线性结构,而树是一种非线性结构,但是一种分层结构,树和二叉树是处理层次模型的典型结构。
- 树的定义:是n个结点的有限集,在任意一颗非空树中有且只有一个称为根(root)的结点,其余的结点被分为m个互不相交的有限集,其中每个集合本身又是一颗树,称为跟结点的子树。
图示法表示二叉树的一个结论:
- 边的数目恰好比结点数目少一个,即e=n-1;
- 节点分为根节点,分支结点,叶子结点。
- 度分为结点的度和树的度,结点的度是指该结点相连的孩子结点的数目,树的度是指树中所有结点的度的最大值。
- 树是一种分层结构,根结点作为第一层,结点的层次(树深度)是指从根结点开始到该结点的层次数,树的深度是指该树中所有结点的层次的最大值。
- 森林是m颗互不相交的树的集合。对于树中的每个结点而言,其子树的集合及时森林。
- 二叉树是一种特殊的有向树,也叫二元位置树。特点是每个结点至多有两棵子树,即二叉树中的每个结点至多有两个孩子结点,且每个孩子结点都有各自的位置关系。
二叉树定义:二叉树或者可以为空,或者是由一个根结点加上两棵分别称为左子树和右子树的,互不相交的二叉树组成。
- 满二叉树:就是除叶子结点外的任何结点均有两个孩子结点,且所有的叶子结点都在同一层上的二叉树。特点是每一层上的结点树是最大的。
- 完全二叉树:除去最底层结点后的二叉树是一颗满二叉树,且最底层结点均靠左对其的二叉树。
算法中处理的事件有两类,一类是客户到达事件,另一类是客户离开事件,前一类事件发生的时刻随客户到来自然形成;后一类事件发生的时刻按先后顺序进行,则由客户事务所需时间和等待所耗的时间而定。
递归定义的基本项描述了一个或几个递归过程的终结状态,虽然一个有限的递归(无迭代)可以描述一个无限的计算过程,但任何实际应用的递归过程除错误情况外,必定能经过有限层次的递归而终止。所谓终结状态指的是不需要继续递归而可直接求解的状态。
递归定义的归纳项描述了如何实现从当前状态到终结状态的转换。
递归设计的实质:当一个复杂的问题可以分解成若干个子问题来处理时,其中某些子问题与原问题有相同的特征属性,则可利用和原问题相同的分析处理方法,反之这些子问题解决了原问题也解决了。
/*
二叉树的存储
*/
#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中方式有,先序遍历,中序遍历,后序遍历。这个主要是看根结点在什么地方,比如第一个,先序,那么就是根左右,中序就是左根右,后序就是左右根;
认识图
线性表是一种一对一的相邻关系,树是一种一对多的层次关系,图是一种多对多的网状关系,
数据结构(C语言第2版)-----数组,广义表,树,图的更多相关文章
- 数据结构(c语言第2版)-----了解链表,栈,队列,串
关于链表我觉得这都是最基本的东西,但是不常见,在实际的应用中很少的使用,了解它会用就OK,不需要研究的那么深,除非做那种内存压缩,存储方面工作. C语言中动态申请空间 malloc() q=(dlin ...
- 数据结构(C语言第2版)----时间复杂度和单链表
马上要到校招了,复习下相关的基础知识. 时间复杂度是什么? 官方解释: 算法的执行时间需要依据算法所编制的程序在计算机上于运行时所消耗的时间来度量.在算法中可以使用基本的语句的执行次数作为算法的时间复 ...
- 数据结构(C语言版)-第4章 串、数组和广义表
补充:C语言中常用的串运算 调用标准库函数 #include<string.h> 串比较,strcmp(char s1,char s2) 串复制,strcpy(char to,char f ...
- 深入浅出数据结构C语言版(6)——游标数组及其实现
在前两次博文中,我们由表讲到数组,然后又由数组的缺陷提出了指针式链表(即http://www.cnblogs.com/mm93/p/6576765.html中讲解的带有next指针的链表).但是指针式 ...
- 数据结构算法C语言实现(十九)--- 5.5&5.6&5.7广义表
一.简述 传说Lisp的基本数据结构就是广义表,广义表也是具有典型递归属性的数据结构,此外,由于建表要处理字符串,用C语言处理起来也是一脸懵逼.....最后自己还想写一个将广义表还原成字符串的函数,一 ...
- 数据结构C语言版 有向图的十字链表存储表示和实现
/*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...
- 数据结构C语言版 表插入排序 静态表
数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./* 数据结构C语言版 表插入排序 算法10.3 P267-P270 编译 ...
- 数据结构C语言版 弗洛伊德算法实现
/* 数据结构C语言版 弗洛伊德算法 P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...
- 《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明
<数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明 先附上文档归类目录: 课本源码合辑 链接☛☛☛ <数据结构>课本源码合辑 习题集全解析 链接☛☛☛ ...
随机推荐
- Android+jsp +html 文件上传案例 已测试 成功通过
我文件上传一直是广大读者一个问题 今天就把成功案例写下 javaweb 网页前段 <%@ page language="java" import="java.uti ...
- 我的ORM汇总
MyOql是我写的ORM,目前仅支持 MSSql2005+ ,从2009年到今天,已使用过不少项目,之后会写 其它关系数据库的解析器: MySql,Sqlite,Oracle 等. 代码地址(最新版) ...
- .NET中STAThread和MTAThread
本文讨论在.NET中使用进程内COM组件时的公寓模型,以一个示例直观演示STAThread和MTAThread的作用和区别. 1. COM中的公寓 1.1 基本规则 公寓是COM组件的运行环境,日常生 ...
- HTML5中类jQuery选择器querySelector的使用
简介 HTML5向Web API新引入了document.querySelector以及document.querySelectorAll两个方法用来更方便地从DOM选取元素,功能类似于jQuery的 ...
- Three.js + HTML5 Audio API 打造3D音乐频谱,Let’s ROCK!
继续玩味之前写的音乐频谱作品,将原来在Canvas标签上的 作图利用Three.js让它通过WebGL呈现,这样就打造出了一个全立体感的频谱效果了. 项目详情及源码 项目GitHub地址:https: ...
- django开发个人简易Blog—nginx+uwsgin+django1.6+mysql 部署到CentOS6.5
前面说完了此项目的创建及数据模型设计的过程.如果未看过,可以到这里查看,并且项目源码已经放大到github上,可以去这里下载. 代码也已经部署到sina sea上,地址为http://fengzhen ...
- salesforce 零基础学习(四十五)Approval Lock & UnLock相关注意事项
我们都知道,当一条记录进入审批流程以后会自动加锁,apex提供Approval类的lock和unlock方法可以让我们使用代码对记录进行加锁和解锁. 项目中遇到一个需求,需要当某种情况下对记录进行先解 ...
- Android开发-之数据的存储方式一
在Android中,数据的存储分为两种方式: 1.直接以文件的形式存储在目录中 2.以json格式存储在数据库中 将数据以文件的存储又分为两种方式: 1.生成.txt文件 2.生成xml文件 那么今天 ...
- js实现继承的方式总结
js实现继承的5种方式 以下 均为 ES5 的写法: js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承 ...
- VS-项目发布失败的解决方案1
报错信息 错误 1 未能将文件 Script\easyui\themes\gray\images\Thumbs.db 复制到 obj\Release\Package\PackageTmp\Script ...