[工学]数据结构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码或区位码。

(陈慧南 第3版)算法设计与分析——第5章课后习题答案

(陈慧南 第3版)算法设计与分析——第5章课后习题答案

(3) 分析算法的时间复杂度 上述算法的时间复杂度为 n 2
(2) 编写 C 程序实现这一算法;
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define N 1000 struct point { double x; double y; }p1[N],pxSmall[N],pxLarge[N]; double Distance (point a , point b); double min (double a , double b); bool Compare_Y (point a , point b); bool Compare_X (point a , point b); double minDistance (int l, int r); int main() { int n ; double D ; cin>>n;
int main() { int n, x, *a; cin >> n; a = new int[n]; for (int i = 0; i < n; i++) cin >> a[i]; cin >> x; if (Triple_search(a, 0, n - 1, x) == -1) cout << "NotFound!" << endl; else cout << Triple_search(a, 0, n - 1, x) << endl; delete []a; return 0; } int Triple_search(int a[], int l, int r, int x) { if (l <= r) { int m1 = l + (r-l)/3; int m2 = l + (r-l)*2/3; if (a[m2]<x) return Triple_search(a, m2 + 1, r, x); else if (a[m1] < x && a[m2] > x) return Triple_search(a, m1 + 1, m2 - 1, x); else if (a[m1] > x) return Triple_search(a, l, m1 - 1, x); else if (a[m1] == x) return m1; else if (a[m2] == x) return m2; } return -1; }

配套课件 数据结构-C语言描述(第三版)--陈慧南

配套课件 数据结构-C语言描述(第三版)--陈慧南

数据结构主要是为研究和解决如何使用计算机处理这些非数值问题而产生的 理论、技术和方法。
对计算机学科来说,数据结构与算法的概念是至关重要的,它们是计算机学 科的基础之一,更是软件技术的基础。数据结构与算法之间有着本质的联系。当 谈论一种算法时,自然要涉及算法所处理的数据问题;而讨论数据的组织或结构, 离开了对处理此类数据的运算及其算法的研究也是无意义的。因此有人概括出一 个公式,即
(3) 树形结构(tree)。树中,除一个称为根的特殊元素没有前驱只有后继外, 其余元素都有且仅有一个前驱,但后继的数目不限。对于非根元素,都存在 着一条从根到该元素的路径。树中的数据元素之间存在一对多的关系。树是 层次数据结构。
(4) 图状结构(graph)。图是最一般的数据结构,图中每个元素的前驱和后 继的数目都不限。图中数据元素之间的关系是多对多的关系。
(1) 集合结构(set)。集合结构中,元素间的次序是随意的。元素之间除了“属 于同一个集合”的联系之外没有其他关系。由于集合结构的元素间没有固有的关 系,因此往往需要借助其他结构才能在计算机中实际表示此结构。
(2) 线性结构(linear)。线性结构是数据元素的有序序列,其中,第一个元 素没有前驱只有后继,最后一个元素只有前驱没有后继,其余元素有且仅有 一个前驱和一个后继。数据元素之间形成一对一的关系。
第1章 概 论
1.1 什么是数据结构 1.2 数据抽象和抽象数据类型 1.3 描述数据结构 1.4 算法和算法分析 习题1
1.1 什么是数据结构
数据结构是计算机科学与技术领域广泛使用的术语,然而,究竟什么是数据 结构,在计算机科学界至今没有标准的定义。
计算机由硬件和软件组成。硬件是躯体,软件是灵魂。硬件通过软件发挥效 用。软件的核心是程序。学习程序设计需要掌握一门程序设计语言,它是学习 计算机后续课程所必需的技能。但程序设计不等于编码,为了充分利用计算机 资源,开发高效的程序,计算机技术人员还必须掌握计算机学科多方面的知识, 如数据的组织、算法的设计和分析、软件工程技术等。

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

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

AD
n1 i0
1 n
(n
i
1)
n i 1
1 (n n
i)
n 1 2
第4章 线性表和数组
从上式来看,在顺序表中插入和删除元素,平均约需移动 表中的一半元素。Insert函数和Remove函数的平均时间复杂度均 为O(n)。
函数Retrieve的实现是比较容易的,由于顺序表可以随机存 取,所以无需搜索,便可立即获得位置pos处的元素,由语句 *x=lst.Elements[pos] 实现之。此函数的时间复杂度为O(1)。
第4章 线性表和数组
4.1.3 线性表的链接表示
使用第2章介绍的单链表、循环链表或双向链表存储 线性表称为线性表的链接存储表示。在本节中我们以不带 表头结点的单链表为例讨论线性表的链接表示的实现。我 们同样可以使用循环链表和双向链表实现线性表,也可以 使用带表头结点的链表实现线性表。在4.2节(多项式的算 术运算)中我们将介绍使用带表头结点的循环链表的线性 表应用实例。
第4章 线性表和数组
*x=lst.Elements[pos]; return TRUE; } BOOL Replace(List *lst, int pos, T x) {
if ( pos<0 || pos>=lst->Size){ printf("Out of Bounds"); return FALSE; } lst->Elements[pos]=x; return TRUE; }
第4章 线性表和数组
若线性表已满,则返回TRUE,否则返回FALSE。 int Size(List lst) 返回线性表的长度。 BOOL Insert(List *lst, int pos, T x) 若线性表未满且0≤pos≤n,则原表中位置在pos及pos之后的所有元素后 移一个位置,元素x插在位置pos处,并且函数返回TRUE;否则函数返回 FALSE。 BOOL Remove(List *lst, int pos, T* x) 若线性表非空且0≤pos<n,则位置pos处的元素复制到参数*x,从原表 中移去该元素,表中pos之后的所有元素前移一个位置,并且函数返回 TRUE;否则函数返回FALSE。

南邮陈慧南版数据结构课后习题5参考答案

南邮陈慧南版数据结构课后习题5参考答案

5.2(1)无序树:9棵(2)有序树:12棵(3)二叉树:30棵5.4(1)2k-1(2)⎥⎥⎤⎢⎢⎡-k i 1 (3)k(i-1) + m + 1(4) i +1≤11+⎥⎥⎤⎢⎢⎡-k k i 5.5(1) 空二叉树和所有结点均无左孩子的二叉树(2) 空二叉树和只有一个根(3) 空二叉树和所有结点均无右孩子5.65.7先:DEHFJGCKAB中:HEJFGKCDAB后:HJKCGFEBAD5.9(1)template <class T>void BinaryTree<T>::Del(BTNode<T> *p) //private{if (p!=NULL){Del(p->lChild);Del(p->rChild);delete p;}} template <class T>void BTree<T>::Del() //public{Del(root);root = NULL;}(2)/*求二叉树中度为1的结点个数*/template <class T>int BinaryTree<T>::CountDegree1(){int total = 0;CountDegree1(root, total);return total;}template <class T>void BinaryTree<T>::CountDegree1(BTNode<T> *t, int &num) {if (t){if ( ( (t->lChild != NULL) && (t->rChild == NULL) ) || ( (t->lChild == NULL) && (t->rChild != NULL)) ) {++num;}CountDegree1(t->lChild, num);CountDegree1(t->rChild, num);}}(3)template <class T>void BinaryTree<T>::Exch(BTNode<T> *p) //private{if (p!=NULL){BTNode<T> *temp;temp=p->lchild;p->lchild=p->rchild;p->rchild=temp;Exch(p->lchild);Exch(p->rchild);}}template <class T>void BTree<T>::Exchange() //public{Exch(root);}5.145.16分别以下列数据为输入,构造最小堆。

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

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

第12章 文件和外排序
1) 串行处理文件 串行处理文件(图12-2)是无序的,对这样的文件按关键字 值的搜索只能采取顺序搜索的方法进行,即从文件的第一个记 录开始,依次将待查关键字值与文件中的记录的关键字值进行 比较,直到成功找到该记录,或直到文件搜索完毕,搜索失败 为止。因此通常搜索时间比较长。
一般情况下,设l和u分别是搜索范围内的最小块号和最大 块号,L和H分别是该搜索范围内的最小关键字值和最大关键字 值,则下一次读入内存的块号i为:
i
1
K-L H-L
(u
1)
(12-2)
第12章 文件和外排序
这时:
若K<Li,则下一次被搜索的块号的范围为[l, i-1],并且新的 H将是Li;
若Li≤K≤Hi,则i即为所求的块,可在该块中去搜索待查关键字 值K;
对于无法事先知道记录被访问频率的应用,可以按第7章介 绍的自组织线性表的方式组织成自组织文件。具体方法有:计 数方法(count)、移至开头法(Move-To-Front)和互换位置法 (Transposition)。
第12章 文件和外排序
(2) 顺序处理文件 顺序处理文件已按关键字值排序。有序表上的各种搜索方 法原则上都可以用于顺序处理文件的搜索,如顺序搜索和二分 搜索等。但是由于文件是外存上的数据结构,在考虑算法时, 必须尽量减少访问外存的次数,因此顺序处理文件的搜索算法 有自己的特点。下面介绍顺序处理文件上的分块插值搜索。
第12章 文件和外排序
文件是存在外存储器上的。为了有效分配外存空间,我 们可以将多个扇区构成一个簇(cluster)。簇是文件的最小分配 单位。簇的大小由操作系统决定。文件管理器(file manager)是 操作系统的一部分,它负责记录一个文件由哪些簇组成。 UNIX操作系统按扇区分配文件空间,并称之为块(block)。为 了与逻辑文件和文件的逻辑记录相对应,文件存储器上的文 件称为物理文件(physical file),一簇或块(物理块)中的信息称 为物理记录。用户读/写的记录是指逻辑记录,查找该逻辑记 录所在的物理块是操作系统的职责。

数组与字符串PPT课件

数组与字符串PPT课件
-32-
-15-
二维数组的定义和引用
定义二维数组,描述国际象棋棋盘,棋盘8行8列, 每个方格要么为黑色,要么为白色。
int board[8][8];
访问二维数组中的数据元素,需要使用2个下标
board[0][3]
行和列下标都从0开始,与1维数组相同。 C++中规定,先指定行下标,再指定列下标。
-16-
二维数组的使用
cin>>name只能读取空格前的第一段字符串。
-28-
读取字符串示例
#include <iostream> int main() {
char name[50]; std::cout<<"What is your name: "; std::cin.getline(name, 49); std::cout<<"Your name is: "<<name<<"\n"; return 0; }
二维数组的初始化
情况四:顺序初始化,缺省的初始化为0 int a[3][3]={1,2,4,5,6};
1 a[0][0]
2 a[0][1] a[0]
4 a[0][2]
5 a[1][0]
6 a[1][1] a[1]
0 a[1][2]
0
a[2][0]
0 a[2][1] a[2]
0 a[2][2]
二维数组示例
-7-
篱笆桩错误
访问数组元素时,最大下标应该为数组元素个数减 1,越过此边界,会导致程序的异常行为。
int score[10]; score[10] = 94;
-8-

南邮陈慧南版数据结构课后习题答案

南邮陈慧南版数据结构课后习题答案

}
65
if (p==root) root=root->lchild;
else q->rchild=p->lchild;
37
e=p->element;
25
delete p;
return true;
14
32
}
7.8 以下列序列为输入,从空树开始构造AVL搜索树。 (1)A,Z,B,Y,C,X (2)A,V,L,T,R,E,I,S,O,K
解:1 调用9.4中的函数InDg计算各个顶点的入度; 2 利用拓扑排序算法依次删去入度为0的顶点发出的边,若最后还
有入度不为0顶点,则该有向图存在有向回路,返回真值。
template <class T>
void LinkedGraph<T>::InDg(ENode<T> *a[],int n,int ind[])
int i,j,top=-1; //top为栈顶元素的下标 ENode<T> *p; for(i=0; i<n; i++)
if(!InDegree[i]) {
时间复杂度。
template <class E,class K>
bool BSTree<E,K>::Delete(E&e)
{ BTNode<E> *p=root,*q=p;
if (!p) return flse;
25
37
91
while (p->rchild)
{ q=p;
14
56
p=p->rchild;
if(!visited[i]) DFS1(i,visited,parent); delete []visited, []parent; }

《数据结构A》第01章

《数据结构A》第01章

南京邮电大学计算机学院 陈慧南 2006年9月 2006年
ADT 1.1 栈ADT ADT Stack { 数据: 数据: 0个或多个元素的线性序列(a0,a1,...,an-1), 其最 个或多个元素的线性序列( 个或多个元素的线性序列 大允许长度为MaxStackSize. 大允许长度为 . 运算: 运算: Create(): 建立一个空栈 : Destroy():撤消一个栈 : Push(x):值为 的新元素进栈,成为栈顶元素 的新元素进栈, :值为x的新元素进栈 Pop():从栈中删除栈顶元素 : Top(x):在x中返回栈顶元素 : 中返回栈顶元素 }
1.1 算法与数据结构
南京邮电大学计算机学院 陈慧南 2006年9月 2006年
程序 = 数据结构+算法 数据结构+
数据结构和算法是计算机学科的基础之一, 数据结构和算法是计算机学科的基础之一, 更是软件技术的基础. 更是软件技术的基础. 数据的组织和表示方法直接影响使用计算机 求解问题的效率. 求解问题的效率. 算法设计通常建立在所处理数据的一定组织 形式之上的,它们之间有着本质的联系. 形式之上的,它们之间有着本质的联系.当 讨论一种算法时, 讨论一种算法时,自然要涉及算法所处理的 数据问题. 数据问题.
1.2.2 数据的逻辑结构
数据的逻辑结构 对数据元素间逻辑关系的描述被称为数据 的逻辑结构(logical structure) ,它可以用 逻辑结构( 一个二元组表示:DS=( 其中, 一个二元组表示:DS=(D,R),其中,D是数 据元素的有限集合, 据元素的有限集合,R是D中元素序偶的集合. 中元素序偶的集合.
南京邮电大学计算机学院 陈慧南 2006年9月 2006年
整型int 整型int的规范 int的规范 的取值范围是: 变量 a 的取值范围是:-32768~32767 执行的操作有: 对变量 a 执行的操作有: 算术运算 +,-,*,/,% 关系运算 <,>,<=,>=,==,!= <=,>=,==, 赋值运算 = 整型int int的实现 整型int的实现 在计算机内存储表示方法. 变量 a 在计算机内存储表示方法. 操作的具体实现方法. 操作的具 in C++
相关主题
  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);
相关文档
最新文档