数据结构与算法(C语言版)第二章

合集下载

《数据结构用C语言描述》第二章

《数据结构用C语言描述》第二章

25 34 57 16
63
i
插入x 50
01 23 4 5
48 09 67
25 34 570 50 16 48
09 63 顺序表插入时,平均数据移动次数 AMN在各表项 插入概率相等时平均时间复杂度: T(n)=O(n)
· 删除
25 34 571650 16 48 09 63 删除 x
01 23 4 5 6 7
sequenlist *L, int i )
■{
■ if ( i >= 0 && i < (*L).last) return
(*L).data[i];
■ else
■ printf ( “参数i 不合理! \n” );
· 插入
01 23 4 5 6 7
25 34 57 16
63
i
插入x 50
01 23 4 5
return 0;
//插入不成功
else {
for ( j =( * L ) . l a s t ; j >=i-1; j - - )
(*L).data[j] =(* )L.data[j -1];
(*L).data[i] =x; (*L).last++; }
return 1; //插入成
}
01 23 4 5 6 7
链表(linked List)
链表是线性表的链接存储表示 · 单链表 · 静态链表 · 循环链表 · 双向链表
单链表(Singly linked List)
定义: 用一组地址任意的存储单元存 放线性表中的数据元素。(ZHOU ZHAO
SUN G
存储地址 1 7 13 19

C语言程序设计(谭浩强版)第二章

C语言程序设计(谭浩强版)第二章
奇妙的输出结果。并且,处理出错的方法
不应是中断程序的执行,而应是返回一个
表示错误或错误性质的值,以便在更高的
抽象层次上进行处理。
算法设计的原则
4.高效率与低存储量需求
通常,效率指的是算法执行时间; 存储量指的是算法执行过程中所需 的最大存储空间, 两者都与问题的规模有关。
算法设计的原则
算法的时间复杂度
第二章 程序的灵魂——算法
2.1 算法的概念 2.2 算法的简单举例
2.3 算法的特性 2.4 怎样表示一个算法 2.5 结构化程序设计方法
算法的概念
计算机应用: 提取数学模型—设计算法— 编程—测试—应用
程序设计=数据结构+算法
数据结构:对数据的描述 算法:对操作的描述 除此之外程序设计还包括:程序设计方法, 和程序设计语言
怎样表示一个算法
例4的伪代码表示法如下 开始 读入整数n 置sum的初值为0 置k的初值为1 执行下面的操作: 如果k为奇数,置item=1/k 如果k为偶数,置item=-1/k sum=sum+item 直到k>n 打印sum的值 结束
算法设计的原则
算法设计的原则
设计算法时,通常应考虑达到以下目标: 1.正确性 2.可读性 3.健壮性 4.高效率与低存储量需求
从算法中选取一种对于所研究的问题 来说是 基本操作 的原操作,以该基 本操作 在算法中重复执行的次数 作 为算法运行时间的衡量准则。
结构化程序设计方法
采用结构化算法写成的计算机程序是结构 化程序。要编写出结构化程序,经常采用 的方法是结构化程序设计方法。这种方法 的基本思路是: 把给定的问题按层次(纵方向)、分阶段 (横方向)分解为一系列易于编程解决的 小问题,然后对应着这些分解的小问题, 设计结构化的算法,最后采用语言将算法 描述出来。这样一种程序设计方法就是结 构化程序设计方法。

数据结构-c语言描述(第二版)答案耿国华编著

数据结构-c语言描述(第二版)答案耿国华编著

第1章绪论2.(1)×(2)×(3)√3.(1)A(2)C(3)C5.计算下列程序中x=x+1的语句频度for(i=1;i<=n;i++)for(j=1;j<=i;j++)for(k=1;k<=j;k++)x=x+1;【解答】x=x+1的语句频度为:T(n)=1+(1+2)+(1+2+3)+……+(1+2+……+n)=n(n+1)(n+2)/66.编写算法,求一元多项式p n(x)=a0+a1x+a2x2+…….+a n x n的值p n(x0),并确定算法中每一语句的执行次数和整个算法的时间复杂度,要求时间复杂度尽可能小,规定算法中不能使用求幂函数。

注意:本题中的输入为a i(i=0,1,…n)、x和n,输出为P n(x0)。

算法的输入和输出采用下列方法(1)通过参数表中的参数显式传递(2)通过全局变量隐式传递。

讨论两种方法的优缺点,并在算法中以你认为较好的一种实现输入输出。

【解答】(1)通过参数表中的参数显式传递优点:当没有调用函数时,不占用内存,调用结束后形参被释放,实参维持,函数通用性强,移置性强。

缺点:形参须与实参对应,且返回值数量有限。

(2)通过全局变量隐式传递优点:减少实参与形参的个数,从而减少内存空间以及传递数据时的时间消耗缺点:函数通用性降低,移植性差算法如下:通过全局变量隐式传递参数PolyValue(){int i,n;float x,a[],p;printf(“\nn=”);scanf(“%f”,&n);printf(“\nx=”);scanf(“%f”,&x);for(i=0;i<n;i++)scanf(“%f”,&a[i]);/*执行次数:n次*/p=a[0];for(i=1;i<=n;i++){p=p+a[i]*x;/*执行次数:n次*/x=x*x;}printf(“%f”,p);}算法的时间复杂度:T(n)=O(n)通过参数表中的参数显式传递float PolyValue(float a[],float x,int n){float p,s;int i;p=x;s=a[0];for(i=1;i<=n;i++){s=s+a[i]*p;/*执行次数:n次*/p=p*x;}return(p);}算法的时间复杂度:T(n)=O(n)第2章线性表习题1.填空:(1)在顺序表中插入或删除一个元素,需要平均移动一半元素,具体移动的元素个数与插入或删除的位置有关。

《数据结构(C语言版)》电子教案第2章

《数据结构(C语言版)》电子教案第2章

数据元素,返回一特殊值(例如0),表示查找失败。
(5) 插入元素Inselem (L,i,x) 在线性表L的第 i 个位置上插入一个值为 x 的新元素,这样 使原序号为 i , i+1, ..., n 的数据元素的序号变为 i+1,i+2, ..., n+1,要求1≤i≤Getlen(L)+1,插入后原表长增1。 (6) 删除元素Delelem(L,i) 在线性表L中删除序号为i的数据元素,删除后使序号为 i+1, i+2,..., n 的元素变为序号i, i+1,...,n-1,要求1≤i≤Getlen(L), 删除后表长减1。
typedef int ElemType //在实际应用中,将ElemType定义成实际类型 typedef struct{ ElemType data[MaxLen]; //定义存储表中元素的数组 int length; //线性表的实际长度 }sqList; sqList L; //定义表结构的变量
E in
2012-9-12

i 1
n 1
p i ( n i 1)
1 n 1

i 1
n 1
( n i 1)
n 2
18
由此可以看出,在线性表上做插入操作需要移动表中一 半的数据元素,当n较大时,算法的效率是比较低的,所以 在线性表上进行插入操作的时间复杂度为O(n)。 6.顺序表的删除运算Delelem(L,i)的实现 顺序表的删除运算是指将表中第 i 个元素从线性表中去
i+1。
线性表是一种典型的线性结构。 数据的运算是定义在逻辑结构上的,而运算的具体实现则 是在存储结构上进行的。
2012-9-12

数据结构与算法(C语言版)第2版上PPT课件

数据结构与算法(C语言版)第2版上PPT课件
1.1.1 学习数据结构的意义 1.1.2 学习算法的意义
5
1.1.1 学习数据结构的意义
数据结构为研究非数值计算问题提供了数据的表示与操 作途径。数据结构是计算机科学与技术专业的专业基础课, 是十分重要的核心课程。所有的计算机系统软件和应用软件 都要用到各种类型的数据结构。因此,要想更好地运用计算 机来解决实际问题,仅掌握几种计算机程序设计语言是难以 应付众多复杂课题的。要想有效地使用计算机,充分发挥计 算机的功能,还必须学习和掌握好数据结构的有关知识。扎 实地打好“数据结构”这门课程的基础,对于学习计算机专 业的其他课程,如操作系统、编译原理、数据库管理系统、 软件工程及人工智能等都是十分有益的。
数据结构与算法 (C语言版)第2
版上
1
整体概况
概况一
点击此处输入 相关文本内容
01
概况二
点击此处输入 相关文本内容
02
概况三
点击此处输入 相关文本内容
03
2
第1章
绪论
3
本章主要内容
1.1 学习数据结构与算法的意义 1.2 数据结构 1.3 抽象数据类型 1.4 算法 1.5 算法分析
4
1.1 学习数据结构与算法的意义
图1.2 4类基本数据结构示意图
11
数据结构的形式定义为
Data_Structure = (D, R) 其中,D是数据元素的有限集;R是D上关系的有限集。
数据结构可以分为逻辑上的数据结构和物理上的数据结构。 数据结构的形式化定义为逻辑结构。物理结构为数据在计算 机中的表示,它包括数据元素的表示和关系表示。
数据对象(data object)是性质相同的数据元素的集合,是数据的 一个子集。
10

数据结构课后习题答案详解(C语言版_严蔚敏) 2

数据结构课后习题答案详解(C语言版_严蔚敏) 2

数据结构习题集答案(C语言版严蔚敏)第2章线性表2.1 描述以下三个概念的区别:头指针,头结点,首元结点(第一个元素结点)。

解:头指针是指向链表中第一个结点的指针。

首元结点是指链表中存储第一个数据元素的结点。

头结点是在首元结点之前附设的一个结点,该结点不存储数据元素,其指针域指向首元结点,其作用主要是为了方便对链表的操作。

它可以对空表、非空表以及首元结点的操作进行统一处理。

2.2 填空题。

解:(1) 在顺序表中插入或删除一个元素,需要平均移动表中一半元素,具体移动的元素个数与元素在表中的位置有关。

(2) 顺序表中逻辑上相邻的元素的物理位置必定紧邻。

单链表中逻辑上相邻的元素的物理位置不一定紧邻。

(3) 在单链表中,除了首元结点外,任一结点的存储位置由其前驱结点的链域的值指示。

(4) 在单链表中设置头结点的作用是插入和删除首元结点时不用进行特殊处理。

2.3 在什么情况下用顺序表比链表好?解:当线性表的数据元素在物理位置上是连续存储的时候,用顺序表比用链表好,其特点是可以进行随机存取。

2.4 对以下单链表分别执行下列各程序段,并画出结果示意图。

解:2.5 画出执行下列各行语句后各指针及链表的示意图。

L=(LinkList)malloc(sizeof(LNode)); P=L;for(i=1;i<=4;i++){P->next=(LinkList)malloc(sizeof(LNode));P=P->next; P->data=i*2-1;}P->next=NULL;for(i=4;i>=1;i--) Ins_LinkList(L,i+1,i*2);for(i=1;i<=3;i++) Del_LinkList(L,i);解:2.6 已知L是无表头结点的单链表,且P结点既不是首元结点,也不是尾元结点,试从下列提供的答案中选择合适的语句序列。

a. 在P结点后插入S结点的语句序列是__________________。

C语言设计第2章 算法与数据结构

C语言设计第2章 算法与数据结构

第1节 算法概念
3、求5!(即1×2×3×4×5的值)。分别用自然语 言、传统流程图来表示设计的算法。 解:先定义两个变量,变量p用来表示被乘数,变量 i用来表示乘数。 (1)用自然语言表示: 第一步:把常数1赋给变量p,即:p=1。 第二步:把常数2赋给变量i,即:i=2。 第三步:使p*i,乘积仍放在变量p中,即:p=p*i。 第四步:使i的值加1,即:i++。 第五步:如果i不大于5,返回第三步重新执行;否 则,算法结束。最后得到p的值就是5!的值。
第1节 算法概念
(3) 算法的表示 算法可以用任何形式的语言和符号来描 述,常用的有:自然语言、传统流程图、 N-S结构图、伪代码、PAD图等。
第1节 算法概念
①自然语言 例如:利用自然语言描述求解一个一元二次方程实数根的 过程。 第一步:将方程化简为标准方程。即:ax2+bx+c=0 。利用 b2-4ac的值来判断方程无解、有一个解还是有两个解。 第二步:如果b2-4ac<0 此题无解,执行第六步。否则执行 第三步。(因为题目要求求实数根,所以这里忽略复数根) 第三步:如果b2-4ac=0此题有一个解,执行第五步。否则执 行第四步。 第四步:如果b2-4ac>0此题有两个解。 第五步:根据求根公式求出方程根 第六步:解题结束。
第1节 算法概念
(2)用传统流程图表示
第1节 算法概念
5、求100-999之间的所有水仙花数。水仙花数又称阿姆斯特 朗数,指一个数的各位数字的立方和等于这个数,例如: 153为水仙花数( )。 解:先设三个变量i、j、k分别表示三位数的百位、十位和个 位,用传统流程图表示
第1节 算法概念
• 思考与提高
第1节 算法概念

《算法与数据结构》第2章 常用数据结构ppt

《算法与数据结构》第2章 常用数据结构ppt
数据的概念不再只是那些用数字组合而成的各种 数据了,如整数、小数、实数、虚数、复数、指数 和对数等. 随着计算机科学技术的发展,数据的概念也相应地 发生了一些重要的变化.
数据〔续〕
数据〔Data〕是信息的载体,是对自然界客观事物 的符号表示. 在计算机科学与技术学科,数据泛指那些能够被计 算机接收、识别、存储、加工和处理的对象的全体. 换句话说,数据是对那些能够有效地输入到计算机 中并且能够被计算机程序所加工和处理的符号全体 的总称.
存储表示方式——顺序存储
顺序存储方式,是在计算机内存储器中开辟一片地址 连续的存储单元顺序存放数据中的各个元素;它把逻 辑上相邻的数据元素存放在物理上相邻的存储单元中, 利用物理上的邻接关系表示逻辑上的先后次序关系, 这 种 存 储 表 示 方 式 称 作 顺 序 存 储 结 构 〔Sequential Storage Structure〕.
非线性结构——树型结构
在非线性结构中,D中数据元素之间不存在一对一的次 序关系.
树型结构中的数据元素之间,存在着一对多的层次关 系,在树型结构中:
没有直接前趋的结点称之为根结点;
除根结点外每个结点有且仅有一个直接前趋〔称之为 双亲结点〕;
没有直接后继的结点称之为叶结点,除叶结点外每个 结点都有一个或多个直接后继〔称之为孩子结点〕.
抽象数据类型〔续〕
抽象数据类型〔Abstract Data Type简记为ADT〕是指一 个数据模型以及定义在该数据模型上的一组操作.这里的数 据模型,是要求解问题中的各种数据的总和;通常,把这些 数据可以组织成为一个或多个数据结构.
当数据模型表现为一个数据结构时,抽象数据类型就是这 个数据结构以及定义在这个数据结构上的一组运算;这种 情况是我们讨论和学习抽象数据类型概念的基础,也是数据 结构课程对抽象数据类型定义的根本要求.
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

循环链表的运算和单链表的运算相似,区别仅在 于当需要从头到尾扫描整个链表时判断是否到表尾 的条件不同。在单链表中以指针域是否为“空”作 为判断表尾结点的条件,而在循环链表中则以结点 的指针域是否等于头指针作为判断表尾结点的条件。
顺序结构线性表的运算(插入)
例如要在线性表的第4和第5个元素之间插入一个 值为b的数据元素,则需将第5个至第8个数据元素 依次往后移动一个位置。
顺序结构线性表的运算(插入)
当在第i(1≤i≤n)个元素之前插入一个元素,需将第n个 至第i个元素(n-i+1个)依次向后移动一个位置,算法 描述见P24算法2.4。 算法分析:本算法时间主要耗费在移动元素上,即 执行for循环语句,循环次数为n-i,每执行一次循环, 就移动一个数据元素。所以移动元素的个数取决于 插入的位置。当i=1,从第1个结点到第n个结点之间 的所有结点依次向后移动一位;当i=n+1,则就不需 要移动结点。如果在每个元素之前插入结点的概率 是相同的即1/(n+1)。插入一个结点需移动的个数为: [n+(n-1)+(n-2)+…+2+1]/(n+1)=n/2。算法的时间复 杂度为O(n)。
线性表的应用举例
{ /* LA和LB均非空*/ GetElem(LA,i,ai); GetElem(LB,j,bj); if(ai<bj) { ListInsert(LC,++k,ai);++i;}/*LA的元素插入到表LC中*/ else if (ai=bj) { ListInsert(LC,++k,bj);++i;++j;} else { ListInsert(LC,++k,bj);++j;} } while(i <=LA_len){ /*如果LA完,则将表LA中的所剩元素插入到表LC中*/ GetElem(LA,i++,ai); ListInsert(LC,++k,ai);
定义:n( 0)个数据元素的有限序列,记作(a1, a2, …, an) ai 是表中数据元素,n 是表长度。
线性表的特点
线性表(linear list)是一种最简单、常用的 数据结构,通常一个线性表是由n(n≥0)个性 质相同的数据元素组成的有限序列。线性表的 长度即为线性表中元素的个数n(n≥0),当n= 0时,称为空表。 非空线性表结构特征:
单链表的基本运算
单链表是一种非随机存取的结构,在单链表中要寻 找某个元素必须从头指针开始进行遍历。 查找:见P29算法2.8 插入:在单链表中插入一个结点有三种情况。(1) 将新结点插入在链表的第一个结点前;(2) 将新结 点插入在两个结点之间;(3) 将新结点插入在链表 的最后一个结点后。参见P30算法2.9。 删除:参见P30算法2.10。 创建:参见P31算法2.11(往前插入)。 两个有序链表的合并:参见P31算法2.12。
线性表的顺序实现
各种高级语言中的一维数组也具有随机存取的特 性,因此常用一维数组来表示线性表。在C语言 中就是用数组来表示顺序存储结构的线性表。 建立一个一维数组V[0,1,…,n-1],使数据元 素ai的下标与数组V的下标i相关联,把a1,a2, a3,…,ai,ai+1,…,an依次相继存入存储单元 V[0],V[1],V[2],…,V[i-1],V[i],…,V[n-1] 中。数组V中的第i个分量V[i-1]就是线性表中第i 个数据元素在内存中的映像,只要给出一个下标 值i-1,就可以存取元素ai。
data:数据域,存放结点的值; next:指针域,存放直接后继结点的地址。 链表正是通过每个结点的指针域将线性表中n个结 点按其逻辑顺序链接在一起的。 如果链表中的每个结点只有一个指针域,该种链表 则称为单链表(或线性链表)。
每个链表须有一个头指针,指向(存放)表中 第一个结点(地址)。已知一单链表,就是已 知了链表的起地址,即头指针。因此单链 表可以用头指针的名字来命名。例如,头 指针的名字是head,则把链表称为表head。 用C语言描述单链表的结点结构如下: typedef struct LNode { ElemType data; struct Lnode *next; } LNode, *LinkList;
一元多项式的表示及相加
ห้องสมุดไป่ตู้小结
线性表的顺序表示
线性表的顺序表示就是: 把线性表的各个数 据元素依次存储在一组地址连续的存储单元 里。线性表的这种机内表示称为线性表的顺 序映像或线性表的顺序存储结构,用这种方 法存储的线性表简称为顺序表。 假设线性表的每个元素需占用L个存储单元, 并以所占的第一个单元的存储地址作为数据 元素的存储位置。则线性表中第i+1个数据 元素的存储位置LOC(ai+1)和第i个数据元素 的存储位置LOC(ai)之间满足下列关系: LOC(ai+1)=LOC(ai)+L
设L是LinkList型的变量,则L为单链表的头指针,它 指向表中第一个结点。若L为“空”(L=NULL),则 所表示的线性表为“空”表,其长度n为“零”。 在有些情况下,需要在单链表的第一个结点之前附 设一个结点,称之为头结点,头结点的数据域可以 不存储任何信息,也可存储如线性表的长度等附加 信息,头结点的指针域存储指向第一个结点的指针 (即第一个元素结点的存储位置)。此时单链表的头 指针指向头结点。若线性表为空表,则头结点的指 针域为“空”。
线性表的应用举例
x=get(LA,i); k=i+1; while(k<=length(LA)) { y=get(LA,K);/**/ if(x==y) Delete(LA,k);/**/ else k++; } i++; } }/**/
内容提要
线性表的类型定义
线性表的顺序表示与实现 线性表的链式表示与实现
(1)有且只有一个首结点a1,它无前驱; (2)有且只有一个尾结点an,它无后继; (3)其它所有结点有且只有一个前驱,也有且只有一 个后继。
线性表中的数据元素可以是各种各样的,但同 一表中的元素必定具有相同特性。
抽象数据类型线性表的定义
线性表数据结构: List=(D,R) 数据对象: D={ ai| ai∈Elemtype,i=1, 2,…,n,i>=1} 数据关系: R={< ai-1,ai>| ai-1,ai,∈D, i=2,3,…,n} 。 抽象数据类型线性表的定义:见P19。
顺序结构线性表的运算(插入)
线性表的插入操作是指在线性表的第i-1个数 据元素和第i个数据元素之间插入一个新的数 据元素,就是要使长度为n的线性表: (a1,…,ai-1,ai,…,an) 变成长度为n+1的线性表: (a1,…,ai-1,b,ai,…,an+1) 如果在第i(1≤i≤n)个元素之前插入,就必须把 第n到第i个之间的所有结点依次向后移动一 个位置,再将新结点x插入到第i个位置;除 非i=n+1。
顺序结构线性表的运算(删除)
线性表的删除操作是使长度为n的线性表: (a1,…,ai-1 ,ai,,ai+1,…,an ) 变成长度为n-1的线性表: (a1,…,ai-1 ,ai+1,…,an ) 数据元素ai-1 , ai,ai+1之间的逻辑关系发 生变化,为了在存储结构上反映这个变化, 需要移动表中的元素,把表中的第i+1个到第 n个结点的所有元素依次向前移动一个位置。
顺序结构线性表的特点
优点:


无须为表示结点间的逻辑关系而增加额外的存 储空间; 可以方便地随机存取表中的任一结点 为了保持顺序表中数据元素的顺序,在插入操 作和删除操作时需要移动大量数据。对于有些 需要频繁进行插入和删除操作的问题、以及每 个数据元素所占字节较大的问题来说,将导致 系统的运行速度难以提高。
线性表的应用举例
} while(j<=LB_len) { GetElem(LB,j++,bj); ListInsert(LC,++k,bj); } }/*MergeList*/
判断下面算法有何功能:
PURGE(LA)/**/ List *LA; { int i=1,k,x,y; while(i<length(LA)) /**/
第二章 线性表
内容提要
线性表的类型定义
线性表的顺序表示与实现 线性表的链式表示与实现
一元多项式的表示及相加
小结
什麽是线性表
英文小写字母表(a,b,c,…,z)是一个长度为26 的线性表。 一年中的四个季节(春,夏,秋,冬)是一个长度为 4的线性表。 学生情况登记表是一个复杂的线性表。 由若干数据项组成的数据元素称为记录(record), 由多个记录构成的线性表又称为文件(file)。
顺序结构线性表的运算(删除)
通常情况下,删除第i(1≤i≤n)个元素时,需将从第i+1 至第n个元素依次向前移动一个位置,算法描述P24算 法2.5。 算法分析:类似于插入结点时间复杂度的分析,可以 得到删除一个结点的需要移动[(n-1)+(n-2)+(n3)+…+2+1]n=(n-1)/2。时间复杂度也为O(n)。 当在顺序存储结构的线性表中某个位置上插入或删除 一个数据元素时,其时间主要耗费在移动元素上,而 移动元素的个数取决于插入或删除元素的位置。在顺 序存储结构的线性表中插入或删除一个数据元素,平 均要移动表中的一半结点,当线性表中的结点很多时, 算法效率将较低,时间复杂度为O(n)。
缺点:

内容提要
线性表的类型定义
线性表的顺序表示与实现 线性表的链式表示与实现
一元多项式的表示及相加
小结
线性链表的基本概念
相关文档
最新文档