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

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

认识数组和广义表

数组可以看成是一种特殊的线性表,也就是线性表中的数据元素本身也是一个线性表,数组中的个元素具有统一的类型。其实说白了就是在脑海中想数组中的数据如何在内存中以什么形式的线性表来存储。在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中方式有,先序遍历,中序遍历,后序遍历。这个主要是看根结点在什么地方,比如第一个,先序,那么就是根左右,中序就是左根右,后序就是左右根;

认识图

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

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

  1. 数据结构(c语言第2版)-----了解链表,栈,队列,串

    关于链表我觉得这都是最基本的东西,但是不常见,在实际的应用中很少的使用,了解它会用就OK,不需要研究的那么深,除非做那种内存压缩,存储方面工作. C语言中动态申请空间 malloc() q=(dlin ...

  2. 数据结构(C语言第2版)----时间复杂度和单链表

    马上要到校招了,复习下相关的基础知识. 时间复杂度是什么? 官方解释: 算法的执行时间需要依据算法所编制的程序在计算机上于运行时所消耗的时间来度量.在算法中可以使用基本的语句的执行次数作为算法的时间复 ...

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

    补充:C语言中常用的串运算 调用标准库函数 #include<string.h> 串比较,strcmp(char s1,char s2) 串复制,strcpy(char to,char f ...

  4. 深入浅出数据结构C语言版(6)——游标数组及其实现

    在前两次博文中,我们由表讲到数组,然后又由数组的缺陷提出了指针式链表(即http://www.cnblogs.com/mm93/p/6576765.html中讲解的带有next指针的链表).但是指针式 ...

  5. 数据结构算法C语言实现(十九)--- 5.5&5.6&5.7广义表

    一.简述 传说Lisp的基本数据结构就是广义表,广义表也是具有典型递归属性的数据结构,此外,由于建表要处理字符串,用C语言处理起来也是一脸懵逼.....最后自己还想写一个将广义表还原成字符串的函数,一 ...

  6. 数据结构C语言版 有向图的十字链表存储表示和实现

    /*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...

  7. 数据结构C语言版 表插入排序 静态表

    数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./*  数据结构C语言版 表插入排序  算法10.3 P267-P270  编译 ...

  8. 数据结构C语言版 弗洛伊德算法实现

    /* 数据结构C语言版 弗洛伊德算法  P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...

  9. 《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明

    <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明 先附上文档归类目录: 课本源码合辑  链接☛☛☛ <数据结构>课本源码合辑 习题集全解析  链接☛☛☛  ...

随机推荐

  1. 【实战Java高并发程序设计 2】无锁的对象引用:AtomicReference

    AtomicReference和AtomicInteger非常类似,不同之处就在于AtomicInteger是对整数的封装,而AtomicReference则对应普通的对象引用.也就是它可以保证你在修 ...

  2. HTML以及CSS的作用和理念

    首先,在学习之前,这些是必要知道的东西.什么是HTML,什么是CSS 它们有什么用?又能做什么? 了解HTML和CSS的用途,能更有利我们快速,高效的学习它们. 那么,关于这两者,我就用我通俗的语言像 ...

  3. WPF之命令浅谈

    一.认识命令 1.1命令的特点 提到“命令”,我们应该想到命令的发出者,命令的接受者,命令的内容,准备工作,完成任务,回报工作...与事件中的发送者,接受者,消息,处理,处理,处理一一对应,如果是单纯 ...

  4. android输入限制

    title: 2016-5-30 Android输入验证 tags: EditText,输入验证 --- 前言2 使用EditText让用户输入文字时,需要对输入验证.除过验证是否有效的逻辑不同,Ed ...

  5. 生活中的OO智慧——大话面向对象五大原则

    世间万物,以俗眼观纷纷各异,以道眼观种种是常.面向对象思想不仅是编程的智慧,同样也是人生的智慧.通过生活去领悟面向对象的智慧,以面向对象的智慧来指导生活. (部分图片取自How I explained ...

  6. MyBatis(跨表查询)

    1.建立数据库表如下: DROP TABLE IF EXISTS t_demo_user; CREATE TABLE IF NOT EXISTS t_demo_user( userid ), user ...

  7. Jquery UI - DatePicker 在Dialog中无法自动隐藏的解决思路

    通过Jquery UI Dialog模态展示如下的一个员工编辑页面,但是遇到一个奇怪的问题:点击Start Date的input元素后,其无法失去焦点.从而导致DatePicker控件在选择日期后无法 ...

  8. Objective-C 原型模式 -- 简单介绍和使用

    用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. Prototype原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建 ...

  9. [Hadoop大数据]——Hive数据的导入导出

    Hive作为大数据环境下的数据仓库工具,支持基于hadoop以sql的方式执行mapreduce的任务,非常适合对大量的数据进行全量的查询分析. 本文主要讲述下hive载cli中如何导入导出数据: 导 ...

  10. 构建基于Chromium的应用程序

    chromium是google chrome浏览器所采用的内核,最开始由苹果的webkit发展而出,由于webkit在发展上存在分歧,而google希望在开发上有更大的自由度,2013年google决 ...