数据结构详细总结-基础版——C语言版

******************************************

本文全部来自个人手打总结,转载请注明出处!

*****************************************


1. 1946年第一台电子数值积分计算机ENIAC

2.什么是数据结构

数据结构是指相互之间存在一种或多种特定关系的数据元素集合(按某种逻辑关系组织起来的一批数据,按一定的映像方式存放在计算机的存储器中,并在这些数据上定义了一个运算的集合)

2.1数据结构包含数据的逻辑结构,数据的存储结构,数据的运算

2.3数据元素的存储分为:顺序存储,链式存储

2.4逻辑结构:(集合结构,线性结构,树形结构,图状结构)

3.数据类型按值分为:非原子结构的原子类型(整型,实型,字符型),结构类型(数组结构体)

4.抽象数据类型(ADT):指一个数学模型以及定义在该模型上的一组操作

5.程序设计基本原则:分解,抽象,信息隐藏

6.实现抽象数据类型:传统的面向过程的程序设计,“包,模型”的设计方法“面向对象的程序设计”

6.  算法:算法就是解决一系列操作步骤的集合

7.算法的特性:有穷性,确定性,可行性,有输入,有输出

8.算法的评价标准:正确性,可读性,健壮性,高效率与低存储

9.  类Ç语言与Ç语言区别:

由于Ç语言不是抽象艺术数据类型的理想描述工具,从Ç语言选出一个核心子集,并添加了C ++的引用调用参数传递方式等,构成了类Ç语言。类Ç是面向对象的,而Ç是面向过程的,类ç的特性是可以继承,重载,多态。类ç语言与ç语言相似但又有一些不同,这种语言是专门为某种具体的应用而仿照ç语言开发的。

1简述下列概念:数据,数据元素,数据项,数据对象,数据结构,逻辑结构,存储结构,抽象数据类型。

答案:

数据:是客观事物的符号表示,指所有能输入到计算机中并被计算机程序处理的符号的总称如数学计算中用到的整数和实数,文本编辑所用到的字符串,多媒体程序处理的图形,图像,声音,动画等通过特殊编码定义后的数据

数据元素:。是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理在有些情况下,数据元素也称为元素,结点,记录等数据元素用于完整地描述一个对象,如一个学生记录,树中棋盘的一个格局(状态),图中的一个顶点等。

数据项:是组成数据元素的,有独立含义的,不可分割的最小单位例如,学生基本信息表中的学号,姓名,性别等都是数据项。

数据对象:是性质相同的数据元素的集合,是数据的一个子集例如:整数数据对象是集合N = {0,±1,±2,...},字母字符数据对象是集合C = {” A','B',...,'Z','a','b',...,'z'},学生基本信息表也可以是一个数据对象。

数据结构:是相互之间存在一种或多种特定关系的数据元素的集合换句话说,数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。

逻辑结构:从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的因此,数据的逻辑结构可以看作是从具体问题抽象出来的数学模型

存储结构:数据对象在计算机中的存储表示,称为也。物理结构

抽象数据类型:由用户定义的,表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称具体包括三部分:数据对象,数据对象上关系的集合和对数据对象的基本操作的集合。

2.试举一个数据结构的例子,叙述其逻辑结构和存储结构两方面的含义和相互关系。

答案:

例如有一张学生基本信息表,包括学生的学号,姓名,性别,籍贯,专业等。每个学生基本信息记录对应一个数据元素,学生记录按顺序号排列,形成了学生基本信息记录的线性序列。对于整个表来说,只有一个开始结点(它的前面无记录)和一个终端结点(它的后面无记录),其他的结点则各有一个也只有一个直接前趋和直接后继。学生记录之间的这种关系就确定了学生表的逻辑结构,即线性结构。

。这些学生记录在计算机中的存储表示就是存储结构如果用连续的存储单元(如用数组表示)来存放这些记录,则称为顺序存储结构;如果存储单元不连续,而是随机存放各个记录,然后用指针进行链接,则称为链式存储结构。

即相同的逻辑结构,可以对应不同的存储结构

线性表

1.概念:线性表是n个数据元素的有限序列,元素之间存在着线性的逻辑关系,表中有且仅有一个开始结点,有且仅有一个终止结点,除开始结点外,表中的每个结点均只有一个前驱结点,只有一个后继结点。

2.特点:同一性(数据类型),有穷性(数据元素),有序性(相邻数据元素存在着序序偶关系)

2.1顺序表:采用顺序存储结构的线性表

2.2单链表:链表是通过一组任意存储单元来存储线性表中的数据元素(注:每个结点至少有两个域:数据域,指针域)

3.顺序表和链表的比较

顺序存储的优点:数据存储数据元素,操作方法简单,容易实现:无须为表示结点间的逻辑关系增加额外的存储开销存储密度高顺序表可按元素位序随机存储结点

缺点:插入,删除操作时,大量移动数据元素,效率低占用连续的存储空间,存储分配智能预先进行(链表的优缺点刚好相反)

栈与队列

1.从数据结构上看,两者都为线性表。

1.2栈先进后出应用:括号匹配,表达式求值,数制转换,行编辑,迷宫求解,

2.在递归调用,函数调用,表达式值应用

3.解决缓冲区问题应利用一种先进先出的线性表,而队列正是一种先进先出的线性表

4.循环队列存储在数组A [0..m]中,则入队时的操作为后=(后+ 1)%(m + 1)

 

 

串:由零个或多个字符组成的有限序列

串是一种特殊的线性表:数据元素是一个字符

2.以行为主:LOC(aij)+ [(i-1)* n + j-1] * d

3.串的实现方法有顺序串,堆串,块链串

4.1定长顺序存储:直接使用定长的字符数组定义,为每个定义的串变量分配一个固定长度的存储区,存储分配是在编译时完成的

4.2堆串:与定长类似,其值得存储空间是在程序过程中动态分配的

4.3块链串:链表的每个结点既可以存放一个或者多个,结点称为块,链表称为块链结构

广义表:线性表要求每个数据元素必须是结构上不可再分的单个元素,而广义表中的数据元素可以是单个元素也可以是一个广义表(有限序列),因此广义表是线性表的推广,线性表是广义表的特例。【LS =(DI,D2,...,DN)】

1. di是原子:不可分割的成分,可以是一个数可以是一个结构

2.本本也是一个广义表,也可叫做子表

3.长度即为它元素个数

4.长度为0称为空表

5.不为空时,di为表头其余元素组成表尾,表尾一定是广义表,表头不一定。

 

1.树:它是由n(n> = 1)个有限节点组成一个具有层次关系的集合。它具有2.特点:每个节点有零个或多个个节点;没有父节点的节点称为根节点;每一个非根节点有且只有一个父节点;除了根节点外,每个子节点可以分为多个不相交的子树

二叉树性质:

3.1第i层至多有2 ^(i-1)个结点

3.2深度为k的二叉树至多有2 ^(k)-1

3.3对任意一颗二叉树T,若终端结点数为N0,度为2的结点数为n2时,则N0 = N2 + 1

3.4具有n个结点的完全二叉树的深度为(log2 ^ n)+1

3.5设置全二叉树共有n个结点。如果从根结点开始,按层序(每一层从左到右)用自然数1,2,... .n给结点进行编号(k = 1,2 ... .n),有以下结论:
①若k = 1,则该结点为根结点,它没有父结点;若k> 1,则该结点的父结点编号为INT(k / 2) ;
若若2k≤n,则编号为k的结点的左子结点编号为2k;否则该结点无左子结点(亦无右子结点);
③若2k +1≤n,则编号为ķ的结点的右子结点编号为2K + 1;否则该结点无右子结点

2.引入二叉线索树的目的是加快查找结点的前驱或后继的速度

6.树的存储结构有三种:双亲表示法、孩子表示法、孩子兄弟表示法

1. 图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成

2. 具有n个顶点的有向图最多有n(n-1) 条边。

3.8个顶点的无向图最多有8*7/2=28条边,再添加一个点即构成非连通无向图,故至少有9个顶点

3. 图的存储方式有:邻接矩阵、邻接表、十字链表、多重链表

4. prim算法适合构造一个稠密图G的最小生成树。

5. 广度优先遍历通常借助队列来实现算法,深度优先遍历通常借助栈来实现算法。

6. 拓扑排序 可以判断出一个有向图是否有环

7. 深度->先序遍历  广度->层次遍历

2.边带权值的图叫网

邻接矩阵用两个数组保存数据。一个一维数组存储图中顶点信息,一个二维数组存储图中边或弧的信息。

1.如果要求一个线性表既能较快的查找,又能适应动态变化的要求,最好采用(分块查找 查找法。

2.从未排序序列中挑选元素,并将其依次放入已排序序列(初始时为空)的一端的方法,称为(选择排序   )。

3.堆是一种选择排序。

4.堆的形状是一棵(  完全二叉树  )。

将两个递增的有序链表合并为一个递增的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中不允许有重复的数据。

void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc)

{ pa=La->next;  pb=Lb->next;    

  while(pa && pb)

{if(pa->datadata){pc->next=pa;pc=pa;pa=pa->next;}

    else if(pa->data>pb->data) {pc->next=pb; pc=pb; pb=pb->next;}

    else

{pc->next=pa;pc=pa;pa=pa->next;

      q=pb->next;delete pb ;pb =q;

}

     }

 pc->next=pa?pa:pb;    //插入剩余段

    delete Lb;            //释放Lb的头结点

}  

2.设计一个算法,通过一趟遍历在单链表中确定值最大的结点。

ElemType Max (LinkList L ){

if(L->next==NULL) return NULL;

pmax=L->next; //假定第一个结点中数据具有最大值

p=L->next->next;

while(p != NULL ){//如果下一个结点存在

if(p->data > pmax->data) pmax=p; p=p->next;//遍历链表

}return pmax->data;

3.(8)如果允许在循环队列的两端都可以进行插入和删除操作。要求:

① 写出循环队列的类型定义;

② 写出“从队尾删除”和“从队头插入”的算法。

1.#define M  typedef struct{elemtp data[M];int front,rear;

}cycqueue;

2.elemtp delqueue ( cycqueue Q)

{if (Q.front==Q.rear)  { cout<<"队列空"<

Q.rear=(Q.rear-1+M)%M;   return(Q.data[(Q.rear+1+M)%M]);

}void enqueue (cycqueue Q, elemtp x)

{if (Q.rear==(Q.front-1+M)%M)  { cout<<"队满"<

 Q.data[Q.front]=x;       

Q.front=(Q.front-1+M)%M;  

}

 

 

10)已知f为单链表的表头指针, 链表中存储的都是整型数据,试写出实现下列运算的递归算法:

① 求链表中的最大整数② 求链表的结点个数;③ 求所有整数的平均值。

int GetMax(LinkList p)

{if(!p->next) return p->data;

else

{int max=GetMax(p->next);return p->data>=max ? p->data:max;}

}

int GetLength(LinkList p)

{if(!p->next)return 1;

else{return GetLength(p->next)+1;}

}

double GetAverage(LinkList p , int n)

{if(!p->next) return p->data;

Else {double ave=GetAverage(p->next,n-1);return (ave*(n-1)+p->data)/n;}

}

4.已知模式串t=‘abcaabbabcab’写出用KMP法求得的每个字符对应的next和nextval函数值。

答案:

模式串t的next和nextval值如下:

j

1  2  3  4  5  6  7  8  9  10 11 12

t串

a  b  c  a  a  b  b  a  b   c  a  b

next[j]

0  1  1  1  2  2  3  1  2  3  4  5

nextval[j]

0  1  1  0  2  1  3  0  1  1  0  5

① p的nextval函数值为0110132。(p的next函数值为0111232)。

② 利用KMP(改进的nextval)算法,每趟匹配过程如下:

第一趟匹配: abcaabbabcabaacbacba abcab(i=5,j=5)  

第二趟匹配: abcaabbabcabaacbacba abc(i=7,j=3)

第三趟匹配:abcaabbabcabaacbacba a(i = 7,j = 1)

第四趟匹配:abcaabbabcabaac bacba abcabaa(i = 15,j = 8)

你可能感兴趣的:(数据结构详细总结-基础版——C语言版)