期末考试 信管 数据结构 小抄

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

动态内存分配就是设计人员可以根据问题的具体需要,在程序运行时再确定数据的个数或占用内存单元的大小,从而在程序运行时具体确定所需要的内存空间。

数据是人们利用文字符号、数学符号以及其他规定的符号对现实世界的十五及其活动所作的抽象描述。

数据元素:表示一个事物的一组数据。

数据项:构成数据元素的数据。

队列:只能在表的一端进行插入操作,在表的另一端进行删除操作的线性表.
顺序队列:顺序存储结构的队列。

抽象数据类型:指一个逻辑概念上的类型和这个类型上的操作集合。

二叉树:是n(n≥0)个结点的有限集合。

n=0的树称为空二叉树;n>0的二叉树由一个根结点以及两棵互不相交的、分别称为左子树和右子树的二叉树组成。

由给定的n个叶结点权值可以构造很多棵形态不同的二叉树,WPL值最小的二叉树称为哈夫曼树。

设计哈夫曼树的结点存储结构为双亲孩子存储结构
无向完全图:在有n个顶点的无向图中,有n(n-1)/2条边,即任意两个顶点之间有且只有一条边。

有向完全图:在有n个顶点的有向图中,有n(n-1)条边,即任意两个顶点之间有且只有方向相反的两条边
结点的度= 入度+ 出度。

即进来的边条数加指出去的边条数
路径长度:对于不带权的图,一条路径的路径长度是指该路径上的边的条数;对于带权的图,一条路径的路径长度是指该路径上各个边权值的总和。

生成树:一个连通图的最小连通子图称作该图的生成树。

有n个顶点的连通图的生成树有n个顶点和n-1条边。

数据结构包含三个方面的内容,即数据的逻辑结构,数据的存储结构和数据操作。

数据的存储结构:数据元素在计算机中的存储方式。

有两种基本形式:顺序和链式存储结构。

描述算法语言的三种形式:文字、伪码、程序设计语言形式。

算法的时间复杂度有:O(1),O(log2n),O(n),O(nlog2n),O(n2),O(n3 ),O(2n)。

算法的时间复杂度是衡量一个算法好坏的重要指标。

n的越大,时间复杂度越大,算法的执行效率越低。

程序运行时要求系统分配空间的函数:malloc()函数、free()、calloc()、realloc()
线性表的表示方法:顺序表、链表。

(抽象数据类型的存储结构)
串的顺序存储结构:静态数组结构、动态数组结构。

串的链式存储结构:单字符结点链、块链。

单链表中构成链表的结点只有一个指向直接后继结点的指针域。

其结构特点:逻辑上相邻的数据元素在物理上不一定相邻。

链表:单链表、单循环链表、双向循环链表堆栈:限定只能在固定一端进行插入和删除操作的线性表。

允许进行插入和删除操作的一端称为栈顶,另一端称为栈底。

堆栈,后进先出表。

线性表,先进后出表。

树的定义具有递归性
树的表示方法:直观表示法、形式化表示法、凹入表示法
树的存储结构主要有:双亲表示法、孩子表示法、双亲孩子表示法、孩子兄弟表示法深度为k的二叉树至多有2k+1-1个结点
具有n个结点的完全二叉树的深度k为⎡log2(n+1)⎤ -1
二叉树最常用的的链式存储结构是二叉链。

二叉链存储结构的每个结点包含三个域,分别是数据域data、左孩子指针域leftChild和右孩子指针域rightChild。

二叉树的遍历算法分为前序遍历(DLR)、中序遍历(LDR)、后序遍历、层序
树的遍历算法:先根遍历算法、后根遍历算图的遍历算法:深度优先、广度优先
图的存储结构:邻接矩阵、邻接表
排序分为内部排序和外部排序。

常用的插入排序:直接插入排序、希尔排序。

常用的选择排序算法:直接选择排序、堆排序
算法思想:括号匹配问题。

算术表达式中右括号和左括号匹配的次序正好符合后到的括号要最先被匹配的“后进先出”堆栈操作特点,因此可以借助一个堆栈来进行判断。

括号匹配共有四种情况:(1)左右括号配对次序不正确;(2)右括号多于左括号;(3)左括号多于右括号;(4)左右括号匹配正确。

具体方法:顺序扫描算术表达式(表现为一个字符串),当遇到三种类型的左括号时让该括号进栈;当扫描到某一种类型的右括号时,比较当前栈顶括号是否与之匹配,若匹配则退栈继续进行判断;若当前栈顶括号与当前扫描的括号不相同,则左右括号配对次序不正确;若字符串当前为某种类型右括号而堆栈已空,则右括号多于左括号;字符串循环扫描结束时,若堆栈非空(即堆栈中尚有某种类型左括号),则说明左括号多于右括号;否则,左右括号匹配正确。

算法思想:回文。

设字符数组str中存放了要判断的字符串。

把字符数组中的字符逐个分别存入队列和堆栈,然后逐个出队列和退栈并比较出队列的字符和退栈的字符是否相等,若全部相等则该字符序列是回文,否则就不是回文。

算法思想:堆排序。

循环执行如下过程直到数组为空:(1)把堆顶a[0]元素(为最大元素)和当前最大堆的最后一个元素交换;(2)最大堆元素个数减1;(3)由于第(1)步后根结点不再满足最大堆的定义,所以调整根结点使之满足最大堆的定义。

Brute-Force算法的设计思想:将主串S的第一个字符和模式T的第1个字符比较,若相等,继续逐个比较后续字符;若不等,从主串S的下一字符起,重新与T第一个字符比较。

直到主串S的一个连续子串字符序列与模式T相等。

返回值为S中与T匹配的子序列第一个字符的序号,即匹配成功。

否则,匹配失败,返回值–1。

简答题:
数据的逻辑结构:数据元素之间的相互联系方式。

数据逻辑结构的分类:(1)线性结构。

元素之间为一对一的线性关系,第一个元素无直接前驱,最后一个元素无直接后继,其余元素都有一个直接前驱和直接后继。

(2)非线性结构包括树结构、图结构。

元素之间为一对多或多对多的非线性关系,每个元素有多个直接前驱或多个直接后继。

算法:描述求解问题方法的操作步骤的集合。

五个特性:有限性,确定性,可执行性,输入性,输出性。

算法设计五大目标:正确性、可读性、高时间效率、高空间效率。

算法时间效率的度量方法:(1)事后统计的方法(2)事前分析估算的方法。

算法运行时间与下列因素有关: 1.书写算法的程序设计语言 2.编译产生的机器代码质量 3.机器执行指令的速度4.问题的规模(算法的时间效率与算法所处里的数据个数n的函数关系)。

单链表有带头结点结构和不带头结点结构。

(1)带头结点单链表无论在第一个数据元素结点前插入,还是在其他结点前插入,操作方法一样;而不带头结点单链表在第一个数据元素结点前插入,和在其他结点前插入,操作方法不一样(2)删除操作和插入操作类似(3)因此,带头结点单链表的算法设计简单
和顺序表相比,单链表主要优点是不需要预先确定数据元素的最大个数,插入和删除操作不需要移动数据元素;主要缺点是因为是顺序存储结构,所以,查找数据元素时需要顺序进行,不能像顺序表那样随机查找任意一个数据元素。

另外,每个结点中要有一个指针域,因此空间单元利用率不高。

而且单链表操作的算法也较复杂。

顺序表的优点和缺点正好相反。

循环单链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针域指向整个链表的第一个结点,从而使链表形成一个环。

它的优点是从链尾到链头比较方便。

循环单链表也有带头结点和不带头结点两种结构,带头结点的循环单链表实现插入和删除操作时较为方便。

假溢出:顺序队列因多次入队列和出队列操作后出现的虽有存储空间但不能进行入队列操作的情况。

如何解决顺序队列的假溢出问题:1)采用循环队列;2)按最大可能的进队操作次数设置顺序队列的最大元素个数;
3)修改出队算法,使每次出队列后都把队列中剩余数据元素向队头方向移动一个位置;4)修改入队算法,增加判断条件,当假溢出时,把队列中的数据元素向对头移动,然后方完成入队操作。

顺序循环队列的队空和队满判断问题:新问题:在循环队列中,空队特征是front=rear;队满时也会有front=rear;判决条件将出现二义性!解决方案有三:①少用一个存储单元。

判队满:front==(rear+1)%MaxQueueSiz 判队空:rear==front ②加设标志位,出队时置0,入队时置1,则可识别当前front=rear 属于何种情况。

判队满:tag==1 && rear==front判队空:tag==0 && rear==front ③使用一个计数器记录队列中元素个数(即队列长度);判队满:count>0 && rear==front 判队空:count==0显然用设置计数器的方法判断顺序循环队列的对空状态和队满状态最为简单。

与哈希冲突有关的三个因素:1.与装填因子a有关。

所谓装填因子是指哈希表中已存入的数据元素个数n与哈希地址空间大小m 的比值。

a越小,冲突的可能性越小,但哈希表中的空闲单元的比例越大。

为兼顾这两方面,a控制在0.6~0.9之间。

2.与所采用的哈希函数有关。

若选用得当,就可以是哈希地址尽可能均匀地分布在哈希地址空间上,从而减少冲突的发生。

3.与解决哈希冲突的哈希冲突函数有关。

解决哈希冲突的办法:1.开放地址法。

1)线性探查法。

2)平方探查法。

3)伪随机数法。

2.链表法。

递归算法:若一个算法直接的或间接的调用自己本身,则称这个算法是递归算法。

存在算法调用自己的情况:1)问题的定义是递推的(2)问题的解法存在自调用。

递归算法求解问题的基本思想是:对于一个较为复杂的问题,把原问题分解成若干个相对简单且类同的子问题,这样,原问题就可递推得到解。

线性表是一种可以在任意位置进行插入和删除数据操作的,由n(n>=0)个相同类型数据元素(下标)a0,a1,a2,…an-1组成的线性结构。

线性表抽象数据类型包括:1.数据集合:{a0, a1, … , a n-1 }, a i的数据类型为DataType 2.该数据集合上的操作结合:(1)ListInitiate(L) 初始化线性表(2) ListLength(L) 求当前数据元素个数(3) ListInsert(L,i,x) 插入数据元素
4)ListDelete(L,i,x) 删除数据元素
(5)ListGet(L,i,x) 取数据元素。

抽象数据类型树的操作集合: (1)创建MakeTree(T)(2)撤消DestroyTree(T)(3)双亲结点Parent(T, curr) (4)左孩子结点LeftChild(T, curr) (5)右兄弟结点RightSibling(T, curr) (6)遍历树Traverse(T, Visit())
串(又称字符串)是由n(n≥0)个字符组成的有限序列。

(它是数据元素为单个字符的特殊线性表。

串有用性操作集合:(1)初始化串Initiate(S) (2)赋值Assign(S,T) (3)求串长度Length(S)
(4)比较Compare(S,T) (5)插入Insert(S,pos,T) (6)删除Delete(S,pos,len) (7)取子串SubString(S,pos,len) (8)查找子串Search(S,start,T)(9)替换子串Replace(S,start,T,V)
线性表的顺序存储结构的类型定义
typedef struct
{ DataType list[MaxSize];
int size;
} SeqList 注:DataType 为数据元素的数据类型,list表示顺序表存储数据元素的数组,MaxSize表示存储顺序表的数组的最大存储单元个数,size表示顺序表当前存储的数据元素个数。

例题:输入序列有ABC组成,可能输出数列:ABC(A入A出B入B出同)、ACB(A 入出B入C入C出B出)、BAC(AB入B出C入C出A出)、BCA(AB入B出C入C出A出)、CBA(ABC入再出)。

不可能:CAB
例:编程实现如下任务:建立一个线性表,首先依次输入数据元素1,2,3, (10)
然后删除数据元素5,最后依次显示当前线性表中的数据元素。

要求采用单链表实现。

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef int DataType;
#include "LinList.h"
void main(void)
{
SLNode *head;
int i , x;
ListInitiate(&head);
for(i = 0; i < 10; i++)
ListInsert(head, i, i+1) ;
ListDelete(head, 4, &x) ;
for(i = 0; i < ListLength(head); i++)
{ ListGet(head, i, &x) == 0) ;
printf(“%d ”, x);
}
Destroy(&head);
}
例:设计一个顺序表的删除函数,把顺序表L中的数据元素x删除。

int ListDataDelete(SeqList *L, DataType x) { int i, j;
for(i = 0; i < L->size; i++)
if(x == L->list[i]) break;
if(i == L->size) return 0;
else
{ for(j = i; j < L->size; j++)
L->list[j] = L->list[j+1];
L->size--;
return 1;
}
} 例:构造一个顺序表的删除算法,把顺序表L中所有值相同的数据元素x全部删除。

int ListMoreDataDelete(SeqList *L, DataType x)
{ int i, j; int tag = 0;
for(i = 0; i < L->size; i++)
{ if(x == L->list[i])
{ for(j = i; j < L->size-1; j++)
L->list[j] = L->list[j+1];
L->size--; i--;
tag = 1;
}
}
return tag;
}
例:设头指针为head,并设带头结点单链表中的数据元素递增有序,编写算法将数据元素x插入到带头结点单链表的适当位置上,要求插入后保持单链表数据元素的递增有序。

void LinListInsert(SLNode *head, DataType x) { SLNode *curr, *pre, *q;
curr = head->next;
pre = head;
while(curr != NULL && curr->data <= x)
{ pre = curr;
curr = curr->next;
}
q = (SLNode *)malloc(sizeof(SLNode));
q->data = x;
q->next = pre->next;
pre->next = q;
}
例;设head为单链表的头指针,并设单链表带有头结点,编写算法将单链表中的数据元素按照数据元素的值递增有序的顺序进行就地排序。

void LinListSort(SLNode *head)
{ SLNode *curr, *pre, *p, *q;
p = head->next;
head->next = NULL;
while(p != NULL)
{ curr = head->next;
pre = head;
while(curr != NULL && curr->data <= p->data)
{ pre = curr;
curr = curr->next;
}
q = p;
p = p->next;
q->next = pre->next;
pre->next = q;
}
}。

相关文档
最新文档