[工学]数据结构5陈慧南_数组和字符串

合集下载

南邮陈慧南版数据结构课后习题答案共35页PPT

南邮陈慧南版数据结构课后习题答案共35页PPT

南邮陈慧南版数据结构课后习题答案
61、辍பைடு நூலகம்如磨刀之石,不见其损,日 有所亏 。 62、奇文共欣赞,疑义相与析。
63、暧暧远人村,依依墟里烟,狗吠 深巷中 ,鸡鸣 桑树颠 。 64、一生复能几,倏如流电惊。 65、少无适俗韵,性本爱丘山。
46、我们若已接受最坏的,就再没有什么损失。——卡耐基 47、书到用时方恨少、事非经过不知难。——陆游 48、书籍把我们引入最美好的社会,使我们认识各个时代的伟大智者。——史美尔斯 49、熟读唐诗三百首,不会作诗也会吟。——孙洙 50、谁和我一样用功,谁就会和我一样成功。——莫扎特

数据结构-C语言描述(第三版)(陈慧南)章 (11)

数据结构-C语言描述(第三版)(陈慧南)章 (11)

第11章 内 排 序
First 12
q 21
p 33
sorted

55
unsorted
26
42

(a)
First

q
p
sorted
unsorted
12
21
33

55
26
42

① ②
(b)
图11-3 链表的直接插入排序 (a) 插入26前;(b) 插入26后
第11章 内 排 序
与顺序表的直接插入排序一样,链表上的直接插入排序算 法首先将第一个记录视为只有一个记录的有序子序列,将第二 个记录插入该有序子序列中,再插入第三个记录,……,直到 插入最后一个记录为止。每趟插入,总是从链表的表头开始搜 索适当的插入位置。程序11-3中,指针p指示表中与待插入的 记录比较的结点,q指示p的前驱结点。指针sorted总是指向单链 表中已经有序的部分子表的尾部,而指针unsorted指向sorted的 后继结点,即待插入的记录结点,见图11-3(a)。如果待插入的 记录小于第一个记录,则应将其插在最前面。请注意,下面的 while循环总会终止。
1)
n(n 4
1)
(n
1)
O(n 2
)
(11-5)
AM(n)
n1
i1
i 2
2
1 2
n 1 i1
i+2(n
1)
n(n 1) 4
2(n
1)
O(n 2

(11-6)
第11章 内 排 序
2.链表上的直接插入排序
直接插入排序也可以在链表上实现。程序11-3是在单 链表上的直接插入排序算法的C语言程序。单链表采用程序 11-1中描述的单链表结构类型。在单链表表示下,将一个 记录插入到一个有序子序列中,搜索适当的插入位置的操作 可从链表的表头开始。图11-3中,从11到55之间的记录已 经有序,现要插入26。我们从表头开始,将26依次与12、21 和33比较。直到遇到大于或等于26的记录33为止,将26插在 21与33之间。该插入操作如图11-3(b)所示。

《数据结构》陈慧南 第10章

《数据结构》陈慧南 第10章
n−1
n( n − 1 ) ∑i = 2 i =1
南京邮电大学计算机学院 陈慧南 2006年9月 2006年
9.2.3 冒泡排序
(48,36,68,72,12,48,02) 48,36,68,72,12,48,02) 36,48,68,72,12,48,02) (36,48,68,72,12,48,02) 36,48,68,72,12,48,02) (36,48,68,72,12,48,02) 36,48,68,72,12,48,02) (36,48,68,72,12,48,02) 36,48,68,12,72,48,02) (36,48,68,12,72,48,02) (36,48,68,12,48,72,02) 36,48,68,12,48,72,02) 36,48,68,12,48,02,72) (36,48,68,12,48,02,72)
南京邮电大学计算机学院 陈慧南 2006年9月 2006年
序列中两个元素R 序列中两个元素 i和Rj (i<j),且Ki=Kj,若 , 排序后仍保持p(i)<p(j),即Ri 仍然排在 j之 仍然排在R 排序后仍保持 , 则称所用的排序算法是稳定的。 反之, 前 , 则称所用的排序算法是稳定的 。 反之 , 称该排序算法是不稳定的。 称该排序算法是不稳定的。 如果待排序元素总数相对于内存而言较小, 如果待排序元素总数相对于内存而言较小 , 整个排序过程可以在内存中进行, 整个排序过程可以在内存中进行 , 则称之 为内部排序; 反之, 为内部排序 ; 反之 , 如果待排序元素总数 较多, 不能全部放入内存, 较多 , 不能全部放入内存 , 排序过程中需 访问外存, 则称之为外部排序。 访问外存 , 则称之为外部排序 。 本章讨论 内部排序。 内部排序。

数据结构-C语言描述(第三版)(陈慧南)章 (6)

数据结构-C语言描述(第三版)(陈慧南)章 (6)

第6章 树 例如,设有序表为(21, 25, 28, 33, 36, 43),若要在表中 查找元素36,通常的做法是从表中第一个元素开始,将待查元素 与表中元素逐一比较进行查找,直到找到36为止。粗略地说,如 果表中每个元素的查找概率是相等的,则平均起来,成功查找一 个元素需要将该元素与表中一半元素作比较。如果将表中元素组 成图6-3所示的树形结构,情况就大为改观。我们可以从根结点 起,将各结点与待查元素比较,在查找成功的情况下,所需的最 多的比较次数是从根到待查元素的路径上遇到的结点数目。当表 的长度n很大时,使用图6-3所示的树形结构组织表中数据,可 以很大程度地减少查找所需的时间。为了查找36,我们可以让36 与根结点元素28比较,36比28大,接着查右子树,查找成功。显 然,采用树形结构能节省查找时间。
第6章 树
E
E
A
F
B
G
CD
LJ
M
N
T1
X
YZ
U T2
B
F
A
DC
G
JL
T3 N
M
(a)
(b)
图6-2 树的例子
(a) 树T1和T2组成森林;(b) 树T3
第6章 树
6.2 二 叉 树
二叉树是非常重要的树形数据结构。很多从实际问题中抽 象出来的数据都是二叉树形的,而且许多算法如果采用二叉树 形式解决则非常方便和高效。此外,以后我们将看到一般的树 或森林都可通过一个简单的转换得到与之相应的二叉树,从而 为树和森林的存储及运算的实现提供了有效方法。
第6章 树
图6-1描述了欧洲部分语言的谱系关系,它是一个后裔图, 图中使用的描述树形结构数据的形式为倒置的树形表示法。在 前几章中,我们学习了多种线性数据结构,但是一般来讲,这 些数据结构不适合表示如图6-1所示的层次结构的数据。为了 表示这类层次结构的数据,我们采用树形数据结构。在本章中 我们将学习多种不同特性的树形数据结构,如一般树、二叉树、 穿线二叉树、堆和哈夫曼树等。

数据结构3.1.1 数组的存储和寻址

数据结构3.1.1 数组的存储和寻址

a[i1][i2]…[in]的存储地址
Loc(i1, i2 ,, in ) Loc(0, i2 ,, in ) i1 C1
... Loc(0,0, i3,,in ) i2 C2 i1 C1
Loc(0,,0) in C in1 Cn1 i1 C1
Loc(0, ,0) in C in1 C mn i1 C mn m2
n1
n
Loc(0,,0) { ( ik m p ) in } C
k 1
pk 1
《数据结构》 精品课程
第 16 页
如果计算按列优先顺序存储的数组元素 地址?
《数据结构》 精品课程
第4页
可以将高维数组转化为一维数组 计算元素的地址。
高维数组有两种存放次序:按行 优先顺序和按列优先顺序存储。
《数据结构》 精品课程
第5页
按行优先顺序,就是将数组元素按行向量的顺 序存储,第i+1个行向量存储在第i个行向量之 后。BASIC、PASCAL、C/C++等程序设计语 言中,数组按行优先顺序存放;
《数据结构》 精品课程
第7页
按行优先顺序存放 存储分配顺序为:
x[0][0]->x[0][1]>x[0][2]->x[1][0]>x[1][1]->x[1][2]
x[0][0] x[0][1] x[0][2] x[1][0] x[1][1] x[1][2]
《数据结构》 精品课程
第8页
二维数组可以看作是一种特殊的一维数组。 [例] float a[3][4];
第三章 数组和字符串
《数据结构》 精品课程

数据结构(陈慧南编 C++描述)南京邮电大学 课后答案 DS习题答案01

数据结构(陈慧南编 C++描述)南京邮电大学 课后答案 DS习题答案01
template <class T>
www.khd课后a答w案.网com
bool LinkedStack<T>::Push(const T x) {
Node <T> *q=new Node<T>; q->data=x; q->link=top; top=q; return true; }
template <class T> bool LinkedStack<T>::Pop() {
Node<T> *q; while (top){
q=top->link; delete top; top=q; } }
第四章 数组与字符串
1. 给出三维数组元素 A[i][j][k]的存储地址 loc(A[i][j][k])。 答: 设有三维数组声明为 A[n1][n2][n3],每个元素占 k 个存储单元,则
Node<T> *q; while (top){
q=top->link; delete top; top=q; } }
template <class T> bool LinkedStack<T>::IsEmpty() const {
return !top; }
template <class T> bool LinkedStack<T>::IsFull() const {
www.khd课后a答w案.网com
第一章 绪论
1.( 第 18页,第(5)题) 确定下列各程序段的程序步,确定划线语句的执行次数,计算它们的渐近时间复杂度。
(1) i=1; k=0; do { k=k+10*i; i++; } while(i<=n-1) 划线语句的执行次数为 n-1 。

数据结构陈慧南 PPT课件

数据结构陈慧南 PPT课件
动n-i-1元素。若删除表中每个元素的概率是相等的 ,即Qi=1/n,
i 0,移动n 1次,..., i n - 1,移动0次
n(n - 1)
(n - 1) (n - 1) ... 1
2
平均移动元素次数:Ed
n1 i 0
1(ni n
1)
n1 2
南京邮电大学计算机学院 陈慧南 2006年9月
南京邮电大学计算机学院 陈慧南 2006年9月
第27页/共70页
结点类
#include "linearlist.h"
template <class T> class SingleList;//超前声明
template <class T>
class Node
{
private: T element;
element link
……
第11页/共70页
…… private://私有数据
int maxLength; T *elements; };
//顺序表的最大长度 //动态一维数组的指针
南京邮电大学计算机学院 陈慧南 2006年9月
第12页/共70页
动态存储分配 构造函数,构建一个空线性表
template <class T> SeqList<T>::SeqList(int mSize) {
if (i<-1||i>n-1) { //越界检查 cout<<"Out Of Bounds"<<endl; return false;
} if (n==maxLength){ //上溢出检查
cout<<"OverFlow"<<endl; return false; } //从后往前逐个后移元素 for (int j=n-1;j>i;j--) elements[j+1]=elementsink;

第6章 数组和字符串3.31

第6章 数组和字符串3.31
9
• 程序举例:
• • • • • Char a[10],b[10]=“copy”; Strcpy(a,b); Printf(“%c %c “,a,b); Printf(“%d %d\n”,strlen(a),strlen(b)); 运行结果为:copy copy 4 4
10
• 函数原型:
• char* strcat(char* dest,const char* src); 1)此函数同上述strcpy函数具有完全相同的参数说明和返回 值类型。 2)函数功能:把第二个参数src所指字符串拷贝到第一个参 数dest所指字符串之后的存储空间中(即把src所指此付出 连接到dest所指字符串之后),该函数返回dest的值。
7
• C系统专门为处理字符串提供了一些预定义函数供编 程者使用,这些函数的原型被保存在string.h头文件中, 在程序文件中使用这些函数时,必须在程序文件开始 使用#include命令把该头文件引入。
• 1.求字符串长度
函数原型:int strlen(const char s[]); 1)保留字const表示该参数的内容在函数体中是不允许改变的, 不影响读取参数的值。 2)该函数对应的实参可以为任何形式的字符串,如:字符串常 量,一个一维字符数组,二维字符数组中只带航下标的但下标 变量。 3)调用该函数,返回实参字符串的长度。 例:strlen(“constant”)返回值为8。
名字一致区别在于下标所以不需要讨论数组的操作运算但对于保存字符串的数组特殊的字符数组有n个元素的字符数组可以存放最多n1个字符的串字符串的结束标志0虽然存放n个字符的串系统并不以为错但良好的编程习惯要求大家遵守通常都是整体串进行的运算而系统没有提供运算符比如
• C中,存储字符串是利用一维字符数组来实现 的,该字符数组的长度要大于等于字符串的长 度加1。 • 把一个字符串存入到数组时,是把每个字符依 次存入到数组中对应元素中。即第一个字符存 入下标为0的元素中,第二个字符存入下标为1 的元素中,最后把一个空字符'\0'存入到下标为 n的元素中(假定字符串的长度为n)。 • 存储每个字符就是存储它的ASCII码或区位码。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
0123
15 24 33 21
§4.1.1 数组ADT
DATA STRUCTURE
数组ADT
ADT Array { 数据:
下标index和元素值value组成的数据对集合,其中任意两 个数据对的下标index各不相同。 运算: Create(): 建立一个数组。 Retrieve(i): 返回下标为i的元素值。 Store(i,x): 将下标为i的数据对的值置为x。 };
for(int j = 0; j < col; j++)
pMtrx[i][j] = ++n;
delete[] pMtrx; }
§4.1.2 数组的序表示 推广到多维数组a[m1][m2] …[mn],数组元素a[i1][i2] …[in]
的存储地址为 :
j 1
k j1
(0 i j mj , 1 j n)
§4.1.3 一维数组的C++类
DATA STRUCTURE
用C++的模板类定义的一维数组抽象数据 类型。公有成员函数包括:
构造函数 析构函数 重载下标操作符:[] 重载下标操作符用来返回指向第i个元素的引用 重载数组赋值:= 赋值操作符实现数组的整体赋值。
a0,0
a1,0


ai,0


a0,1 a0,n1
a1,1 a1,n1


ai,1 ai,n1


};
am1,0 am1,1 am1,n1
C/C++行优先的存储方法
§4.1.2 数组的顺序表示
DATA STRUCTURE
§4.1.3 一维数组的C++类
DATA STRUCTURE
#include <assert.h>
template <class T>
class Array1D
{
public:
Array1D(int sz=0); ~Array1D(){ delete[] elements; } T& operator [](int i)const;
for ( i = 0; i < row; i++) delete[] ppMtrx[i];
delete[] ppMtrx;
申请指针数组 再为指针数组申请空间 为二维数组赋值
删除二维数组
§4.1.2 数组的顺序表示
DATA STRUCTURE
// 方法3:=====================================
loc(a[i1][i2] …[in]) = loc(a[0]…[0]) + ( i1* m2 * m3 *…* mn + i2* m3 * m4 *…* mn + … + in-1* mn + in ) * k
n1
n
= loc(a[0][0]) ( (ij * mk ) in ) * k
二维数组的顺序表示 loc(a[i][j]) = loc(a[0][0])+(i*n+j)*k (0 i < m; 0 j < n)
基地址:loc(a[0][0]) 每个元素占 k 个存储单元。
§4.1.2 数组的顺序表示
DATA STRUCTURE
C/C++中申请二维数组的方法: int row=3, col=4; // 方法1:===================================== int Mtrx[row][col]={ {1,2,3,4},{5,6,7,8},{9,10,11,12} }; // 方法2:=====================================
大多数语言如PASCAL、BASIC、C、C++等都是按行优先顺序存储 的,FORTRAN是按列优先顺序存储的。
A[m][n] = { {a0,0, a0,1, … a0,n-1 },
…,{ ai,0, ai,1,… ai,n-1 }, …,{am-1,0, am-1,1, … am-1,n-1}
int **ppMtrx = new int*[row]; for (int i = 0; i < row; i++)
ppMtrx[i] = new int[col]; int n=0; for( i = 0; i < row; i++)
for(int j = 0; j < col; j++) ppMtrx[i][j] = ++n;
§4.1.2 数组的顺序表示
DATA STRUCTURE
一维数组的顺序表示 loc(a[i]) = loc(a[0])+i*k ( i = 0, 1, 2, …, n-1 )
基地址:loc(a[0]) 每个元素占 k 个存储单元。
template <class T> A[] = { a0, a1, …, ai, …, an-1 };
数 据 结 构 第5讲
DATA STRUCTURE
第4章 数组和字符串
DATA STRUCTURE
1
数数组组
2
特殊矩阵
3
稀疏矩阵
4
字符串
§4.1.1 数组ADT
DATA STRUCTURE
数组的定义
数组是下标index 和值value 组成的序对的集合。
( index, value )
一维数组: A = { (0, 15), (1, 24), (2, 33), (3, 21) }
pA = new T[100]; // 然后赋值 T b1 = pA[i]; // 获取第i个元素 T b2 = *( pA + i ); // 获取第i个元素
§4.1.2 数组的顺序表示
DATA STRUCTURE
二维数组的顺序表示
二维数组a[m][n]映射到一维的存储空间时有两种顺序:行优先和列 优先。
#define row 3 #define col 4 typedef int Mtrx[row];
将数组定义为 数据类型
main()
定义二维数组
{
int n = 0;
Mtrx *pMtrx = new Mtrx[col]; // 用法与二维数组相同
for(int i = 0; i < row; i++)
取元素值 整体赋值
Array1D<T>& operator=(const Array1D<T> &r);
相关文档
最新文档