怎么用一个指针变量指向指针的指针表示二维数组数组中的一个汉字并用printf函数输出此汉字?

c语言实验报告,指针的应用分别输出字符串中的数字和其他字符(共10篇)

0
}

1.1 简述下列术语:数据,数据元素、数据对象、数据结构、存储结构、数据类型和抽象数据类型。

解:数据是对客观事物的符号表示。在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。

    数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。

    数据对象是性质相同的数据元素的集合,是数据的一个子集。

    数据结构是相互之间存在一种或多种特定关系的数据元素的集合。

    数据类型是一个值的集合和定义在这个值集上的一组操作的总称。

    抽象数据类型是指一个数学模型以及定义在该模型上的一组操作。是对一般数据类型的扩展。

1.2 试描述数据结构和抽象数据类型的概念与程序设计语言中数据类型概念的区别。

解:抽象数据类型包含一般数据类型的概念,但含义比一般数据类型更广、更抽象。一般数据类型由具体语言系统内部定义,直接提供给编程者定义用户数据,因此称它们为预定义数据类型。抽象数据类型通常由编程者定义,包括定义它所使用的数据和在这些数据上所进行的操作。在定义抽象数据类型中的数据部分和操作部分时,要求只定义到数据的逻辑结构和操作说明,不考虑数据的存储结构和操作的具体实现,这样抽象层次更高,更能为其他用户提供良好的使用接口。

试按图论中图的画法惯例画出其逻辑结构图。

1.4 试仿照三元组的抽象数据类型分别写出抽象数据类型复数和有理数的定义(有理数是其分子、分母均为自然数且分母不为零的分数)。

操作结果:构造一个复数C,其实部和虚部分别为re和im

操作结果:构造一个有理数R,其分子和分母分别为s和m

操作结果:销毁有理数R

1.5 试画出与下列程序段等价的框图。

1.6 在程序设计中,常用下列三种不同的出错处理方式:

(1) 用exit语句终止执行并报告错误;

(2) 以函数的返回值区别正确返回或错误返回;

(3) 设置一个整型变量的函数参数以区别正确返回或某种错误返回。

试讨论这三种方法各自的优缺点。

解:(1)exit常用于异常错误处理,它可以强行中断程序的执行,返回操作系统。

    (2)以函数的返回值判断正确与否常用于子程序的测试,便于实现程序的局部控制。

    (3)用整型函数进行错误处理的优点是可以给出错误类型,便于迅速确定错误。

1.7 在程序设计中,可采用下列三种方法实现输出和输入:

(2) 通过函数的参数显式传递;

(3) 通过全局变量隐式传递。

试讨论这三种方法的优缺点。

解:(1)用scanf和printf直接进行输入输出的好处是形象、直观,但缺点是需要对其进行格式控制,较为烦琐,如果出现错误,则会引起整个系统的崩溃。

    (2)通过函数的参数传递进行输入输出,便于实现信息的隐蔽,减少出错的可能。

    (3)通过全局变量的隐式传递进行输入输出最为方便,只需修改变量的值即可,但过多的全局变量使程序的维护较为困难。

1.8 设n为正整数。试确定下列各程序段中前置以记号@的语句的频度:

1.9 假设n为2的乘幂,并且n>2,试求下列算法的时间复杂度及变量count的值(以n的函数形式表示)。

1.11 已知有实现同一功能的两个算法,其时间复杂度分别为和,假设现实计算机可连续运算的时间为秒(100多天),又每秒可执行基本操作(根据这些操作来估算算法时间复杂度)次。试问在此条件下,这两个算法可解问题的规模(即n值的范围)各为多少?哪个算法更适宜?请说明理由。

    则对于同样的循环次数n,在这个规模下,第二种算法所花费的代价要大得多。故在这个规模下,第一种算法更适宜。

1.12 设有以下三个函数:

请判断以下断言正确与否:

1.13 试设定若干n值,比较两函数和的增长趋势,并确定n在什么范围内,函数的值大于的值。

解:的增长趋势快。但在n较小的时候,的值较大。

1.14 判断下列各对函数和,当时,哪个函数增长更快?

1.15 试用数学归纳法证明:

1.16 试写一算法,自大至小依次输出顺序读入的三个整数X,Y和Z的值

1.17 已知k阶斐波那契序列的定义为

    试编写求k阶斐波那契序列的第m项值的函数算法,k和m均以值调用的形式在函数参数表中出现。

解:k>0为阶数,n为数列的第n项

1.18 假设有A,B,C,D,E五个高等院校进行田径对抗赛,各院校的单项成绩均已存入计算机,并构成一张表,表中每一行的形式为

编写算法,处理上述表格,以统计各院校的男、女总分和团体总分,并输出。

试编写算法,计算的值并存入数组a[0..arrsize-1]的第i-1个分量中(i=1,2,,n)。假设计算机中允许的整数最大值为maxint,则当n>arrsize或对某个,使时,应按出错处理。注意选择你认为较好的出错处理方法。

1.20 试编写算法求一元多项式的值的值,并确定算法中每一语句的执行次数和整个算法的时间复杂度。注意选择你认为较好的输入和输出方法。本题的输入为,和,输出为。

本算法的时间复杂度为o(n)。

2.1 描述以下三个概念的区别:头指针,头结点,首元结点(第一个元素结点)。

解:头指针是指向链表中第一个结点的指针。首元结点是指链表中存储第一个数据元素的结点。头结点是在首元结点之前附设的一个结点,该结点不存储数据元素,其指针域指向首元结点,其作用主要是为了方便对链表的操作。它可以对空表、非空表以及首元结点的操作进行统一处理。

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

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

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

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

2.3 在什么情况下用顺序表比链表好?

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

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

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

2.6 已知L是无表头结点的单链表,且P结点既不是首元结点,也不是尾元结点,试从下列提供的答案中选择合适的语句序列。

2.7 已知L是带表头结点的非空单链表,且P结点既不是首元结点,也不是尾元结点,试从下列提供的答案中选择合适的语句序列。

2.8 已知P结点是某双向链表的中间结点,试从下列提供的答案中选择合适的语句序列。

2.9 简述以下算法的功能。

解:(1) 如果L的长度不小于2,将L的首元结点变成尾元结点。

2.10 指出以下算法中的错误和低效之处,并将它改写为一个既正确又高效的算法。

2.11 设顺序表va中的数据元素递增有序。试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性。

2.12 设和均为顺序表,和分别为和中除去最大共同前缀后的子表。若空表,则;若=空表,而空表,或者两者均不为空表,且的首元小于的首元,则;否则。试写一个比较,大小的算法。

2.13 试写一算法在带头结点的单链表结构上实现线性表操作Locate(L,x);

2.14 试写一算法在带头结点的单链表结构上实现线性表操作Length(L)。

2.15 已知指针ha和hb分别指向两个单链表的头结点,并且已知两个链表的长度分别为m和n。试写一算法将这两个链表连接在一起,假设指针hc指向连接后的链表的头结点,并要求算法以尽可能短的时间完成连接运算。请分析你的算法的时间复杂度。

2.16 已知指针la和lb分别指向两个无头结点单链表中的首元结点。下列算法是从表la中删除自第i个元素起共len个元素后,将它们插入到表lb中第i个元素之前。试问此算法是否正确?若有错,请改正之。

2.17 试写一算法,在无头结点的动态单链表上实现线性表操作Insert(L,i,b),并和在带头结点的动态单链表上实现相同操作的算法进行比较。

2.18试写一算法,实现线性表操作Delete(L,i),并和在带头结点的动态单链表上实现相同操作的算法进行比较。

2.19 已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写一高效的算法,删除表中所有值大于mink且小于maxk的元素(若表中存在这样的元素),同时释放被删结点空间,并分析你的算法的时间复杂度(注意,mink和maxk是给定的两个参变量,它们的值可以和表中的元素相同,也可以不同)。

2.20 同2.19题条件,试写一高效的算法,删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同),同时释放被删结点空间,并分析你的算法的时间复杂度。

2.21 试写一算法,实现顺序表的就地逆置,即利用原表的存储空间将线性表逆置为。

2.22 试写一算法,对单链表实现就地逆置。

// 带头结点的单链表的逆置

2.23 设线性表,,试写一个按下列规则合并A,B为线性表C的算法,即使得

线性表A,B和C均以单链表作存储结构,且C表利用A表和B表中的结点空间构成。注意:单链表的长度值m和n均未显式存储。

// 将合并后的结果放在C表中,并删除B表

2.24 假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并成一个按元素值递减有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原表(即A表和B表)的结点空间构造C表。

// 将合并逆置后的结果放在C表中,并删除B表

2.25 假设以两个元素依值递增有序排列的线性表A和B分别表示两个集合(即同一表中的元素值各不相同),现要求另辟空间构成一个线性表C,其元素为A和B中元素的交集,且表C中的元素有依值递增有序排列。试对顺序表编写求C的算法。

// 将A、B求交后的结果放在C表中

2.26 要求同2.25题。试对单链表编写求C的算法。

// 将A、B求交后的结果放在C表中,并删除B表

2.27 对2.25题的条件作以下两点修改,对顺序表重新编写求得表C的算法。

(1) 假设在同一表(A或B)中可能存在值相同的元素,但要求新生成的表C中的元素值各不相同;

(2) 利用A表空间存放表C。

// A、B求交,然后删除相同元素,将结果放在C表中

// A、B求交,然后删除相同元素,将结果放在A表中

2.28 对2.25题的条件作以下两点修改,对单链表重新编写求得表C的算法。

(1) 假设在同一表(A或B)中可能存在值相同的元素,但要求新生成的表C中的元素值各不相同;

(2) 利用原表(A表或B表)中的结点构成表C,并释放A表中的无用结点空间。

// A、B求交,结果放在C表中,并删除相同元素

// A、B求交,结果放在A表中,并删除相同元素

2.29 已知A,B和C为三个递增有序的线性表,现要求对A表作如下操作:删去那些既在B表中出现又在C表中出现的元素。试对顺序表编写实现上述操作的算法,并分析你的算法的时间复杂度(注意:题中没有特别指明同一表中的元素值各不相同)。

// 在A中删除既在B中出现又在C中出现的元素,结果放在D中

2.30 要求同2.29题。试对单链表编写算法,请释放A表中的无用结点空间。

// 在A中删除既在B中出现又在C中出现的元素,并释放B、C

// 求集合A-B,结果放在A表中,并删除B表

2.31 假设某个单向循环链表的长度大于1,且表中既无头结点也无头指针。已知s为指向链表中某个结点的指针,试编写算法在链表中删除指针s所指结点的前驱结点。

// 在单循环链表S中删除S的前驱结点

2.32 已知有一个单向循环链表,其每个结点中含三个域:pre,data和next,其中data为数据域,next为指向后继结点的指针域,pre也为指针域,但它的值为空,试编写算法将此单向循环链表改为双向循环链表,即使pre成为指向前驱结点的指针域。

// 建立一个空的循环链表

2.33 已知由一个线性链表表示的线性表中含有三类字符的数据元素(如:字母字符、数字字符和其他字符),试编写算法将该线性表分割为三个循环链表,其中每个循环链表表示的线性表中均只含一类字符。

// 将单链表L划分成3个单循环链表

在2.34至2.36题中,“异或指针双向链表”类型XorLinkedList和指针异或函数XorP定义为:

// 指针异或函数XorP返回指针p和q的异或值

2.34 假设在算法描述语言中引入指针的二元运算“异或”,若a和b为指针,则ab的运算结果仍为原指针类型,且

则可利用一个指针域来实现双向链表L。链表L中的每个结点只含两个域:data域和LRPtr域,其中LRPtr域存放该结点的左邻与右邻结点指针(不存在时为NULL)的异或。若设指针L.Left指向链表中的最左结点,L.Right指向链表中的最右结点,则可实现从左向右或从右向左遍历此双向链表的操作。试写一算法按任一方向依次输出链表中各元素的值。

2.35 采用2.34题所述的存储结构,写出在第i个结点之前插入一个结点的算法。

2.36 采用2.34题所述的存储结构,写出删除第i个结点的算法。

2.37 设以带头结点的双向循环链表表示的线性表。试写一时间复杂度O(n)的算法,将L改造为。

设有一个双向循环链表,每个结点中除有pre,data和next三个域外,还增设了一个访问频度域freq。在链表被起用之前,频度域freq的值均初始化为零,而每当对链表进行一次Locate(L,x)的操作后,被访问的结点(即元素值等于x的结点)中的频度域freq的值便增1,同时调整链表中结点之间的次序,使其按访问频度非递增的次序顺序排列,以便始终保持被频繁访问的结点总是靠*表头结点。试编写符合上述要求的Locate操作的算法。

在2.39至2.40题中,稀疏多项式采用的顺序存储结构SqPoly定义为

2.39 已知稀疏多项式,其中,,。试采用存储量同多项式项数m成正比的顺序存储结构,编写求的算法(为给定值),并分析你的算法的时间复杂度。

2.40 采用2.39题给定的条件和存储结构,编写求的算法,将结果多项式存放在新辟的空间中,并分析你的算法的时间复杂度。

在2.41至2.42题中,稀疏多项式采用的循环链表存储结构LinkedPoly定义为

2.41 试以循环链表作稀疏多项式的存储结构,编写求其导函数的方法,要求利用原多项式中的结点空间存放其导函数多项式,同时释放所有无用结点。

2.42 试编写算法,将一个用循环链表表示的稀疏多项式分解成两个多项式,使这两个多项式中各自仅含奇次项或偶次项,并要求利用原链表中的结点空间构成这两个链表。

// 将单链表L划分成2个单循环链表

3.1 若按教科书3.1.1节中图3.1(b)所示铁道进行车厢调度(注意:两侧铁道均为单向行驶道),则请回答:

(1) 如果进站的车厢序列为123,则可能得到的出站车厢序列是什么?

(2) 如果进站的车厢序列为123456,则能否得到435612和135426的出站序列,并请说明为什么不能得到或者如何得到(即写出以 S表示进栈和以 X表示出栈的栈操作序列)。

3.2 简述栈和线性表的差别。

解:线性表是具有相同特性的数据元素的一个有限序列。栈是限定仅在表尾进行插入或删除操作的线性表。

3.3 写出下列程序段的输出结果(栈的元素类型SElemType为char)。

3.4 简述以下算法的功能(栈的元素类型SElemType为int)。

假设以S和X分别表示入栈和出栈的操作,则初态和终态均为空栈的入栈和出栈的操作序列可以表示为仅由S和X组成的序列。称可以操作的序列为合法序列(例如,SXSX为合法序列,SXXS为非法序列)。试给出区分给定序列为合法序列或非法序列的一般准则,并证明:两个不同的合法(栈操作)序列(对同一输入序列)不可能得到相同的输出元素(注意:在此指的是元素实体,而不是值)序列。

解:任何前n个序列中S的个数一定大于X的个数。

    假定前n个操作都相同,从第n+1个操作开始,为序列不同的起始操作点。由于前n个操作相同,故此时两个栈(不妨为栈A、B)的存储情况完全相同,假设此时栈顶元素均为a。

第n+1个操作不同,不妨T1的第n+1个操作为S,T2的第n+1个操作为X。T1为入栈操作,假设将b压栈,则T1的输出顺序一定是先b后a;而T2将a退栈,则其输出顺序一定是先a后b。由于T1的输出为……ba……,而T2的输出顺序为……ab……,说明两个不同的合法栈操作序列的输出元素的序列一定不同。

3.6 试证明:若借助栈由输入序列12n得到的输出序列为(它是输入序列的一个排列),则在输出序列中不可能出现这样的情形:存在着i

解:这个问题和3.1题比较相似。因为输入序列是从小到大排列的,所以若

3.7 按照四则运算加、减、乘、除和幂运算()优先关系的惯例,并仿照教科书3.2节例3-2的格式,画出对下列算术表达式求值时操作数栈和运算符栈的变化过程:

3.8 试推导求解n阶梵塔问题至少要执行的move操作的次数。

3.9 试将下列递推过程改写为递归过程。

3.10 试将下列递归过程改写为非递归过程。

3.11 简述队列和堆栈这两种数据类型的相同点和差异处。

解:栈是一种运算受限的线性表,其限制是仅允许在表的一端进行插入和删除运算。

队列也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入,而在表的另一端进行删除。

3.12 写出以下程序段的输出结果(队列中的元素类型QElemType为char)。

3.13 简述以下算法的功能(栈和队列的元素类型均为int)。

3.14 若以1234作为双端队列的输入序列,试分别求出满足以下条件的输出序列:

    (1) 能由输入受限的双端队列得到,但不能由输出受限的双端队列得到的输出序列。

    (2) 能由输出受限的双端队列得到,但不能由输入受限的双端队列得到的输出序列。

    (3) 既不能由输入受限的双端队列得到,也不能由输出受限的双端队列得到的输出序列。

假设以顺序存储结构实现一个双向栈,即在一维数组的存储空间中存在着两个栈,它们的栈底分别设在数组的两个端点。试编写实现这个双向栈tws的三个操作:初始化inistack(tws)、入栈push(tws,i,x)和出栈pop(tws,i)的算法,其中i为0或1,用以分别指示设在数组两端的两个栈,并讨论按过程(正/误状态变量可设为变参)或函数设计这些操作算法各有什么有缺点。

// 链栈的数据结构及方法的定义

// 从栈顶到栈底用Visit()函数遍历栈中每个数据元素

3.16 假设如题3.1所属火车调度站的入口处有n节硬席或软席车厢(分别以H和S表示)等待调度,试编写算法,输出对这n节车厢进行调度的操作(即入栈或出栈操作)序列,以使所有的软席车厢都被调整到硬席车厢之前。

试写一个算法,识别一次读入的一个以@为结束符的字符序列是否为形如‘序列1&序列2’模式的字符序列。其中序列1和序列2中都不含字符‘&’,且序列2是序列1的逆序列。例如,a+b&b+a是属该模式的字符序列,而1+3&3-1则不是。

3.18 试写一个判别表达式中开、闭括号是否配对出现的算法。

1n)表示一个图像区域,g[i,j]表示该区域中点(i,j)所具颜色,其值为从0到k的整数。编写算法置换点(i0,j0)所在区域的颜色。约定和(i0,j0)同色的上、下、左、右的邻接点为同色区域的点。

3.21 假设表达式有单字母变量和双目四则运算符构成。试写一个算法,将一个通常书写形式且书写正确的表达式转换为逆波兰表达式。

// 输入的表达式串必须为#...#格式

3.22 如题3.21的假设条件,试写一个算法,对以逆波兰式表示的表达式求值。

}

本文为算法笔记中有关STL的部分,由于算法笔记字数太多,Typora太卡了,所以单独拆分出来

  • C++STL和一些其他的函数的使用
    • 使用erase成员函数删除元素时的陷阱

STL都需要在命名空间std

sort()不写比较函数,默认升序排序

填写的比较函数是填写函数名,不要加括号!!


注意:比较函数也可以放在对应的结构体或类中定义

也可以不自己写比较函数,使用C++标准库提供的模板函数:

如果要排序的类型是自定义类型(如类、结构体),则必须重载<运算符(也只需要重载<运算符,因为sort函数参数列表只填写开始迭代器和末尾的下一位迭代器这2个参数,即采用默认的<运算符排序,因此重载<即可达到目的)

注意:一定要重载<运算符,因为sort默认是降序排序,用的是<运算符

对于结构体or类有两种排序方法:

  • sort参数列表传入比较函数
  • 结构体内or外重载<运算符【重载运算符速度快于比较函数】

3、声明比较类/结构体(此法很少用)

**在STL中,只有vector、 string、 deque 是可以使用sort的。**这是因为像set、map这种容器是用红黑树实现的(了解即可),元素本身有序,故不允许使用sort排序。

  • last)范围内第1个值大于等于val的元素的位置,如果是数组,则返回该位置的指针;如果是容器,则返回该位置的迭代器
  • 则返回该位置的指针;如果是容器,则返回该位置的迭代器

显然,如果数组或容器中没有需要寻找的元素,则lower_bound()upper_bound()均返回可以插入该元素的位置的指针或迭代器(即假设存在该元素时,该元素应当在的位置)。

是通用数值类型计算函数。

    • 三个形参:前2个形参指定要累加的元素范围,第3个形参则是累加的初值

    • 返回类型是第3个形参的类型

    • 这个函数调用的效果是:从空字符串开始,把vec里的每个元素连接成一个字符串。

    • 对于自定义数据类型,需要写一个回调函数来实现自定义数据的处理,然后让它作为accumulate()的第四个参数【可以用lambda表达式作为函数对象】
  • 第一个参数:赋值的起点
  • 第二个参数:赋值的终点(不包含)
  • 第三个参数:赋值的初值,每次+1

用于给一个范围的数据(数组或具有前向迭代器的容器)进行赋值,赋值的值从第三个参数开始递增,每次+1。需要头文件numeric(前向迭代器意思是迭代器的值或者说下标是递增的)

用于给一个范围的数据进行赋值,需要头文件numeric

ound(first, last, val)用来寻找在数组或容器的[first, last)`范围内第1个值大于`val`的元素的位置,如果是数组, 则返回该位置的指针;如果是容器,则返回该位置的迭代器

显然,如果数组或容器中没有需要寻找的元素,则lower_bound()upper_bound()均返回可以插入该元素的位置的指针或迭代器(即假设存在该元素时,该元素应当在的位置)。

是通用数值类型计算函数。

    • 三个形参:前2个形参指定要累加的元素范围,第3个形参则是累加的初值

    • 返回类型是第3个形参的类型

    • 这个函数调用的效果是:从空字符串开始,把vec里的每个元素连接成一个字符串。

    • 对于自定义数据类型,需要写一个回调函数来实现自定义数据的处理,然后让它作为accumulate()的第四个参数【可以用lambda表达式作为函数对象】
  • 第一个参数:赋值的起点
  • 第二个参数:赋值的终点(不包含)
  • 第三个参数:赋值的初值,每次+1

用于给一个范围的数据(数组或具有前向迭代器的容器)进行赋值,赋值的值从第三个参数开始递增,每次+1。需要头文件numeric(前向迭代器意思是迭代器的值或者说下标是递增的)

用于给一个范围的数据进行赋值,需要头文件numeric

}

我要回帖

更多关于 指向指针的指针表示二维数组 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信