数据结构导论作业一
数据结构第一次作业答案.

假设有两个按元素值递增次序排列的线性表,均以单链表形式存储。
请编写算法将这两个单链表归并为一个按元素值递增次序排列的单链表。
【解答】算法的基本设计思想:因为两链表已按元素值递增次序排列,将其合并是,均从第一个结点起进行比较,将小的结点链入链表中,同时后移链表工作指针。
该问题要求结果链表按元素值递减次序排列,故新链表的建立,应该采用头插法(也就是书本上讲的那种从链表中插入元素值的方法。
比较结束后,可能会有一个链非空,此时用头插法将剩下的结点依次插入新链表中即可。
算法实现如下: void MergeList(ListList &La,LinkList &Lb {LinkList r,pa=La->next,pb=Lb->next; //pa和pb分别是链表La 和//Lb的工作指针La->next=NULL;while(pa&&pb //当两链表均不为空时if(pa->data<=pb->data {r=pa->next; //将pa的后继结点暂存于rpa->next=La->next;La->next=pa; //将pa结点链于结果表中,同时逆//置(头插法pa=r; //恢复pa为当前待比较结点}else {r=pb->next; //将pb的后继结点暂存于rpb->next=La->next;La->next=pb; //将pb结点链于结果表中,同时逆置pb=r;}If(pa pb=pa; //通常情况下会剩下一个链表非空,处理剩//下的部分while(pb{r=pb->next;pb->next=La->next;La->next=pb;pb=r;}free(Lb;}选择题:1、D 2、B1、栈的特点是先进后出,由于进栈和出栈操作是可以穿插着进行的。
当第i个元素第一个出栈时,则i之前的元素可以依次排在i之后出栈,但剩余的元素可以在此时进栈并且也会排在i之前的元素出栈,所以第就j个出栈的元素是不确定的。
数据结构(C++)第一次作业参考答案

数据结构第一次作业数据结构第一次作业一.单项选择题(20分)( )1.已知一算术表达式的后缀形式为ABC *+DE-/,则其中缀形式为 _________。
a、(A+B *C)/(D-E)b、A+B*C /D-Ec、(A+B*C)/D-Ed、A+B*C/(D-E)( )2.若某链表中最常用的操作是在最后一个结点之后插入一个结点和删除第一个结点,则采用________存储方式最节省运算时间(假设链表仅设有一个first指针)。
a. 单链表b. 带头结点的双循环链表c. 单循环链表d. 双链表( )3.设一个栈的输入序列为A,B,C,D,则所得到的输出序列不可能是_______。
a. A,B,C,Db. D,C,B,Ac. A,C,D,Bd. D,A,B,C( )4.若线性表最常用的操作是存取第i个元素及其直接前驱的值,则采用_____存储方式节省时间。
a.顺序表 b.双链表 c.单循环链表 d.单链表( )5.若长度为n的线性表采用顺序存储结构,在其第i个位置插入一个新元素的算法的时间复杂度为_______。
(1≤i≤n+1)a、O(0)b、O(1)c、O(n)d、O(n2)( )6.若指针L指向一带头结点的循环单链表的头结点,该表为空表的条件是_______为真值;a. !( L -> link );b. L == (L -> link) -> link;c. L -> link;d. L == L -> link;( )7.用数组A[0..N-1]存放一个循环队列,一元素出队时,其队头指针front的修改方法是________:a. front = (front + 1) mod N;b. front = (front - 2)mod N;c. front = front + 1;d. front = front – 2;( )8.若用Head()和Tail()分别表示取广义表的表头和表尾,广义表A=(1,2,(3,4),(5,(6,7))),则Head(Tail(Head(Tail(Tail(A))))) 。
中南大学《数据结构》课程作业(在线作业)一及参考答案

(一) 单选题1. 栈和队列的共同点是()。
(A)都是先进先出(B) 都是先进后出(C) 只允许在端点处插入和删除元素(D) 没有共同点参考答案:(C)2.对广义表执行操作的结果是()。
(A)(B)(C)(D) (e)参考答案:(B)3. 一个递归的定义可以用递归过程求解,也可以用非递归过程求解,但单从运行时间来看,通常递归过程比非递归过程()。
(A)较快(B) 较慢(C) 相同(D) 不定参考答案:(B)4.从一个长度为n的顺序表中删除第i个元素时,需向前移动的元素的个数是()。
(A)(B)(C)(D)参考答案:(A)5. 若某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则最节省运算时间的存储方式是()。
(A)单链表(B) 仅有头指针的单循环链表(C) 双链表(D) 仅有尾指针的单循环链表参考答案:(D)6. 在下面的程序段中,对x的赋值语句的频度为()。
(A)(B)(C)(D)参考答案: (C)7. 对于栈操作数据的原则是()。
(A)先进先出(B)后进先出(C)后进后出(D)不分顺序参考答案: (B)8. 求循环链表中当前结点的后继和前驱的时间复杂度分别是()。
(A)和(B) 和(C) 和(D)和参考答案: (C)9. 与数据元素本身的形式、内容、相对位置、个数无关的是数据的()。
(A)存储结构(B)逻辑结构(C)算法(D)操作参考答案:(B)10.程序段如下:其中n为正整数,则最后一行的语句频度在最坏情况下是()。
(A)(B)(C)(D)参考答案:(D)11.下述程序段中语句的频度是()。
(A)(B)(C)(D)参考答案:(C)12.二维数组采用列优先的存储方法,若每个元素各占3个存储单元,且地址为150,则元素的地址为()。
(A)429 (B) 432 (C) 435 (D) 438参考答案:(A)13.下列程序段的渐进时间复杂度为()。
;(A)(B)(C)(D)参考答案:(C)14.下列程序的时间复杂度为()。
数据结构第一次作业

第一行为第一个链表的各结点值,以空格分隔。
第二行为第二个链表的各结点值,以空格分隔。
【输出形式】
合并好的链表,以非降序排列,值与值之间以空格分隔。
【样例输入】
4 7 10 34
1 4 6 29 34 34 52
【样例输出】
1 4 6 7 10 29 34 52
【评分标准】
要使用链表实现,否则不能得分。
3.设n为大于1的正整数,计算机执行下面的语句时,带#语句的执行次数为n。
i=1;
j=0;
while(i+j<=n){
# if(i>j)
j++;
else
i++;
}
4.在具有n个链结点的链表中查找一个链结点的时间复杂度为O(n)。
5.下面程序段的时间复杂度为O(mn)。
for ( i = 0; i < n; i++ )
D.每个链结点有多少个直接后继结点,它就应该设置多少个指针域
8.将长度为m的线性链表链接在长度为n的线性链表之后的过程的时间复杂度若采用大O形式表示,则应该是B。
A.O(m) B.O(n) C.O(m+n) D.O(m-n)
9.在一个单链表中,若要在p所指向的结点之后插入一个新结点,则需要相继修改__个指针域
int time (int n) {
int count=0, x=2;
while ( x < n/2 ) {
x=2x;
count++;
}
return (count);
}
时间复杂度:O(logn)
count值:logn-2
《数据结构》第1阶段在线作业

一、单项选择题答题要求 :每题只有一个正确的选项。
1(5.0 分)0最大容量为 n 的循环队列,队尾指针是 rear,队头是 front,则队空 的条件是( ) A) (rear+1) % n = front B) rear = front C) rear+1 = front D) (rear-l) % n = front 参考答案: B收起解析 解析:无2(5.0 分)0以下判断不正确的是( ) A) 顺序存储的线性表可随机存取。
B) 同一线性表中的数据元素应具有相同的特性。
C) 顺序存储方式的优点是存储密度大,插入、删除操效率高。
D) 在线性表的链式存储结构中,逻辑上相邻的数据元素在物理位置上不一定相 邻。
参考答案: C收起解析解析:无3(5.0 分)0以下说法错误的是( ) A) 散列法存储的基本思想是由关键码的值决定数据的存储地址。
B) 散列表的结点中只包含数据元素自身的信息,不包含任何指针。
C) 装填因子是散列法的一个重要参数,它反映散列表的装填程度。
D) 散列表的查找效率主要取决于散列表造表时选取的散列函数和处理冲突的 方法。
参考答案: B收起解析解析:无4(5.0 分)0一维数组和线性表的区别为( ) A) 前者长度固定,后者长度可变 B) 两者长度均固定 C) 前者长度可变,后者长度固定 D) 两者长度均可变 参考答案: A收起解析 解析:无5(5.0 分)0在具有 n 个结点的二叉树(二叉链表表示)中,值为空的链域数为 () A) n-1 B) 2n-1 C) n1 D) 2n 1 参考答案: B收起解析 解析:无6(5.0 分)5.0已知广义表 LS=((a,b,c),(d,e,f)),运用 head 和 tail 函数取出 LS 中元素 e 的运算是( ) A) head(tail(LS)) B) tail(head(LS)) C) head(tail(head(tail(LS)))) D) head(tail(tail(head(LS)))) 参考答案: C收起解析解析:无7(5.0 分)5.0以下说法错误的是( ) A) 对循环链表来说,从表中任一结点出发都能通过前后操作而扫描整个循环链 表。
数据结构第一章作业

作业11、编写一个函数deleteV_seq( PSeqList palist , int x),在palist所指的顺序表中,删除一个值为x的元素,返回成功与否的标志。
#include "stdio.h"#include "stdlib.h"#define MAXSIZE 100struct SeqList{int data[MAXSIZE];int length; /* 表长 */};typedef struct SeqList *PSeqList;PSeqList createList_seq()/* 创建线性表*/{PSeqList palist=(PSeqList)malloc(sizeof(struct SeqList));if(palist!=NULL){palist->length=0;for(int i=0;i<9;i++){palist->data[i]=i*i;palist->length++;}return(palist);}printf("Out of space!!\n");return NULL;}int LocateV_seq(PSeqList palist,int x) /*定位所要删除的元素*/{if(!palist){return -1 ; /*表不存在*/}for(int i=0;i<palist->length;i++){if(palist->data[i]==x)return i ;}if(i==palist->length)return -1 ;}int DeleteV_seq(PSeqList palist , int x)/*删除指定元素*/ {if(!palist){printf("表不存在");return -1 ;}if(LocateV_seq(palist,x)==-1){printf("无法删除指定元素");return 0 ;}else{for(int i=LocateV_seq(palist,x);i<palist->length;i++) palist->data[i]=palist->data[i+1];palist->length--;return 1;}}int main(){int i;PSeqList list;list=createList_seq(); /* 创建线性表*/printf("删除前:");for(i=0;i<list->length;i++)printf(" %d " , list->data[i]);printf("\n");if(DeleteV_seq(list,25)==1){printf("删除后:");for(i=0;i<list->length;i++)printf(" %d " , list->data[i]);}return 0;}2、已知list是指向无头结点的单链表的指针变量,写出删除该链表中从第i个结点开始的连续k个结点的算法。
《数据结构》第一章作业参考答案
第一章作业参考答案1.31.4抽象数据类型复数的定义:ADT Complex{数据对象:D={e1,e2|e1,e2∈R}数据关系:R1={<e1,e2>|e1是复数的实数部分,e2是复数的虚数部分} 基本操作:AssignComplex(&z,v1,v2)操作结果:构造复数Z,其实部和虚部分别被赋以参数v1和v2的值。
DestroyComplex(&Z)初始条件:复数已存在操作结果:复数Z被销毁GetReal(Z,&RealPart)初始条件:复数已存在操作结果:用RealPart返回复数Z的实部值GetImag(Z,&ImagPart)初始条件:复数已存在操作结果:用ImagPart返回复数Z的虚部值Add(Z1,Z2,&sum)初始条件:Z1,Z2是复数操作结果:用sum返回两个复数Z1,Z2的和Sub(Z1,Z2,&dif)初始条件:Z1,Z2是复数操作结果:用dif返回两个复数Z1,Z2的差Mul(Z1,Z2,&pro)初始条件:Z1,Z2是复数操作结果:用pro返回两个复数Z1,Z2的乘积Div(Z1,Z2,&quo)初始条件:Z1,Z2是复数操作结果:用quo返回两个复数Z1,Z2的商}//ADT Complex抽象数据类型有理数的定义:ADT Rational{数据对象:D={e1,e2|e1,e2∈N}数据关系:R1={<e1,e2>|e1是有理数的分子,e2是有理数的分母,e2≠0} 基本操作:AssignRational(&Z,v1,v2)初始条件:v2≠0操作结果:构造有理数Z,其分子和分母分别被赋以参数v1和v2的值。
DestroyRational(&Z)初始条件:有理数已存在操作结果:有理数Z被销毁GetNumerator(Z,&NumeratorPart)初始条件:有理数已存在操作结果:用NumeratorPart返回有理数Z的分子GetDenominator(Z,&DenominatorPart)初始条件:有理数已存在操作结果:用DenominatorPart返回有理数Z的分母Add(Z1,Z2,&sum)初始条件:Z1,Z2是有理数操作结果:用sum返回两个有理数Z1,Z2的和Sub(Z1,Z2,&dif)初始条件:Z1,Z2是有理数操作结果:用dif返回两个有理数Z1,Z2的差Mul(Z1,Z2,&pro)初始条件:Z1,Z2是有理数操作结果:用pro返回两个有理数Z1,Z2的乘积Div(Z1,Z2,&quo)初始条件:Z1,Z2是有理数操作结果:用quo返回两个有理数Z1,Z2的商}//ADT Rational1.7 参考C++教材1.8(1)n-1(3)n-1(5)[n(n+1)(2n+1)/6+n(n+1)/2]/2 (参考《数据结构》第一章电子教案第41页例3)(7)1.16void print_descending()//按从大到小顺序输出三个数{scanf("%d,%d,%d",&x,&y,&z);if(x<y) x<->y; //<->为表示交换的双目运算符,以下同if(x<z) x<->z;if(y<z) y<->z;printf("%d %d %d",x,y,z);}//print_descending。
数据结构导论试题和部分答案
全国2012年1月 数据结构导论试题 课程代码:02142 一、单项选择题(本大题共15小题,每小题2分,共30分) 1.结点按逻辑关系依次排列形成一条“锁链”的数据结构是( )A.集合 B.线性结构 C.树形结构 D.图状结构 2.下面算法程序段的时间复杂度为( ) for ( int i=0; ifor ( int j=0; ja[i][j]=i*j; A. O(m2) B. O(n2) C. O(mn) D. O(m+n) 3.线性结构是( )A.具有n(n≥0)个表元素的有穷序列 B.具有n(n≥0)个字符的有穷序列 C.具有n(n≥0)个结点的有穷序列 D.具有n(n≥0)个数据项的有穷序列 4.单链表中删除由某个指针变量指向的结点的直接后继,该算法的时间复杂度是( ) A. O(1) B. O(n) C. O(log2n) D. O(n) 5.关于串的叙述,正确的是( ) A.串是含有一个或多个字符的有穷序列 B.空串是只含有空格字符的串 C.空串是含有零个字符或含有空格字符的串 D.串是含有零个或多个字符的有穷序列 6.栈的输入序列依次为1,2,3,4,则不可能的出栈序列是( )A.1243 B. 1432 C. 2134 D.4312 7.队列是( )A. 先进先出的线性表 B. 先进后出的线性表 C. 后进先出的线性表 D.随意进出的线性表 8.10阶上三角矩阵压缩存储时需存储的元素个数为( ) A.11 B.56 C.100 D.101 9.深度为k(k≥1)的二叉树,结点数最多有( )A.2k 个 B.(2k -1)个 C.2k-1个 D.(2k+1)个 10.具有12个结点的二叉树的二叉链表存储结构中,空链域NULL的个数为( )A. 11 B.13 C. 23 D. 25 11.具有n个顶点的无向图的边数最多为( )A.n+1 B.n(n+1) C.n(n-1)/2 D.2n(n+1)
全国自考《数据结构导论》真题及答案解析
全国自考《数据结构导论》真题及答案解析-卷面总分:86分答题时间:60分钟试卷题量:43题一、单选题(共30题,共60分)1.在顺序表中查找第i个元素,时间效率最高的算法的时间复杂度为()A.O(1)B.O(√n)C.O(log2n)D.O(n)正确答案:A您的答案:本题解析:暂无解析2.树形结构中,度为0的结点称为()A.树根B.叶子C.路径D.二叉树正确答案:B您的答案:本题解析:暂无解析3.已知有向图G=(V,E),其中V={V1,V2,V3,V4,V5,V6,V7},E={},则图G的拓扑序列是()A.V1,V3,V4,V6,V2,V5,V7B.V1,V3,V2,V6,V4,V5,V7C.V1,V3,V4,V5,V2,V6,V7D.V1,V2,V5,V3,V4,V6,V7正确答案:A您的答案:本题解析:暂无解析4.有关图中路径的定义,表述正确的是()A.路径是顶点和相邻顶点偶对构成的边所形成的序列B.路径是不同顶点所形成的序列C.路径是不同边所形成的序列D.路径是不同顶点和不同边所形成的集合正确答案:A您的答案:本题解析:暂无解析5.串的长度是指()A.串中所含不同字母的个数B.串中所含字符的个数C.串中所含不同字符的个数D.串中所含非空格字符的个数正确答案:B您的答案:本题解析:暂无解析6.组成数据的基本单位是()A.数据项B.数据类型C.数据元素D.数据变量正确答案:C您的答案:本题解析:暂无解析7.程序段的时间复杂度为()A.O(1)=B.O(n)C.O(n2D.O(n3)正确答案:B您的答案:本题解析:暂无解析8.与串的逻辑结构不同的数据结构是()A.线性表B.栈C.队列D.树正确答案:D您的答案:本题解析:暂无解析9.二叉树的第i(i≥1)层上所拥有的结点个数最多为()A.B.2iC.D.正确答案:C您的答案:本题解析:暂无解析10.设单链表中指针p指向结点A,若要删除A的直接后继,则所需修改指针的操作为()A.p->next=p->next->nextB.p=p->nextC.p=p->next->nextD.p->next=p正确答案:A您的答案:本题解析:暂无解析11.下列排序算法中,某一趟结束后未必能选出一个元素放在其最终位置上的是()A.堆排序B.冒泡排序C.直接插入排序D.快速排序正确答案:C您的答案:本题解析:暂无解析12.设字符串S1=″ABCDEFG″,S2=″PQRST″,则运算S=CONCAT(SUBSTR(S1,2,LENGTH(S2)),SUBSTR(S1,LENGTH(S2),2))后S的结果为()A.″BCQR″B.″BCDEF″C.″BCDEFG″D.″BCDEFEF″正确答案:D您的答案:本题解析:暂无解析13.在平衡二叉树中插入一个结点后造成了不平衡,设最低的不平衡结点为A,并且A的左孩子的平衡因子为-1,右孩子的平衡因子为0,则使其平衡的调整方法为()A.LL型B.LR型C.RL型D.RR型正确答案:B您的答案:本题解析:暂无解析14.如果结点A有3个兄弟结点,而且B为A的双亲,则B的度为()A.1B.3C.4D.5正确答案:C您的答案:本题解析:15.数据表A中每个元素距其最终位置较近,则最省时间的排序算法是()A.堆排序B.插入排序C.直接选择排序D.快速排序正确答案:B您的答案:本题解析:暂无解析16.在表长为n的顺序表上做插入运算,平均要移动的结点数为()A.n/4B.n/3C.n/2D.n正确答案:C您的答案:本题解析:暂无解析17.顺序表中有19个元素,第一个元素的地址为200,且每个元素占一个字节,则第14个元素的存储地址为()A.212B.213C.214D.215正确答案:B您的答案:本题解析:暂无解析18.由顶点V1,V2,V3构成的图的邻接矩阵为,则该图中顶点V1的出度为(C)A.0B.1C.2D.3正确答案:C您的答案:本题解析:暂无解析19.元素的进栈次序为A,B,C,D,E,则退栈中不可能的序列是()A.A,B,C,D,EB.B,C,D,E,AC.E,A,B,C,DD.E,D,C,B,A正确答案:C本题解析:暂无解析20.由带权为9,2,5,7的四个叶子结点构造一棵哈夫曼树,该树的带权路径长度为()A.23B.37C.44D.46正确答案:C您的答案:本题解析:暂无解析21.在已知尾指针的单循环链表中,插入一个新结点使之成为首结点,其算法的时间复杂度为()A.O(1)B.(log2n)C.O(n)D.O(n2)正确答案:A您的答案:本题解析:暂无解析22.已知一个有序表为(13,18,24,35,47,50,62,83,90,115,134),当二分查找值为90的元素时,查找成功时需比较的次数为()A.1B.2C.3D.4正确答案:B您的答案:本题解析:暂无解析23.在查找顺序表各结点概率相等的情况下,顺序按值查找某个元素的算法时间复杂度为()A.O(1)B.O(n)C.O(√n)D.O(log2n)正确答案:B您的答案:本题解析:暂无解析24.下列各项键值序列中不是堆的为()A.{5,23,16,68,94,72,71,73}B.{5,16,23,68,94,72,71,73}C.{5,23,16,73,94,72,71,68}D.{5,23,16,68,73,71,72,94}正确答案:C您的答案:本题解析:暂无解析25.在线性表的下列存储结构中进行插入、删除运算,花费时间最多的是()A.单链表B.双链表C.顺序表D.单循环链表正确答案:C您的答案:本题解析:暂无解析26.在栈中进行插入和删除操作的一端称为()A.栈顶B.栈底C.任意位置D.指定位置正确答案:A您的答案:本题解析:暂无解析27.用n个值构造一棵二叉排序树,它的最大高度为A..n/2B.nC.√nD.log2n正确答案:B您的答案:本题解析:暂无解析28.冒泡排序的时间复杂度是()A.O(n2)B.O(nlog2n)C.O(n)D.O(log2n)正确答案:A您的答案:本题解析:暂无解析29.设无向图的邻接表如题14图所示,则该图的边数为()A.4B.5C.10D.20正确答案:B您的答案:本题解析:暂无解析30.带表头结点链队列的队头和队尾指针分别为front和rear,则判断队空的条件为()A.front==rearB.front!=NULLC.rear!=NULLD.front==NULL正确答案:A您的答案:本题解析:暂无解析二、填空题(共13题,共26分)31.下列程序段的时间复杂度为________正确答案:O(n)您的答案:32.数据的逻辑结构被分为集合结构、________、树形结构和图状结构4种。
数据结构作业及答案
第一章绪论一、选择题1.数据结构是一门研究非数值计算的程序设计问题中计算机的1以及它们之间的2和运算等的学科。
1 A.数据元素 B.计算方法 C.逻辑存储 D.数据映像2 A.结构 B.关系 C.运算 D.算法2.数据结构被形式地定义为(K, R),其中K是1的有限集,R是K上的2有限集。
1 A.算法 B.数据元素 C.数据操作 D.逻辑结构2 A.操作 B.映像 C.存储 D.关系3.在数据结构中,从逻辑上可以把数据结构分成。
A.动态结构和静态结构B.紧凑结构和非紧凑结构C.线性结构和非线性结构D.内部结构和外部结构4.线性结构的顺序存储结构是一种1的存储结构,线性表的链式存储结构是一种2的存储结构。
A.随机存取 B.顺序存取 C.索引存取 D.散列存取5.算法分析的目的是1,算法分析的两个主要方面其一是指2,其二是指正确性和简单性。
1 A.找出数据结构的合理性 B.研究算法中的输入和输出的关系C.分析算法的效率以求改进D.分析算法的易懂性和文档性2 A.空间复杂度和时间复杂度 B.研究算法中的输入和输出的关系C.可读性和文档性D.数据复杂性和程序复杂性k6.计算机算法指的是1,它必须具备输入、输出和2等5个特性。
1 A.计算方法 B.排序方法 C.解决问题的有限运算序列 D.调度方法2 A.可执行性、可移植性和可扩充性 B.可行性、确定性和有穷性C.确定性、有穷性和稳定性D.易读性、稳定性和安全性7.线性表的逻辑顺序与存储顺序总是一致的,这种说法。
A.正确 B.不正确8线性表若采用链式存储结构时,要求内存中可用存储单元的地址。
A.必须连续的B.部分地址必须连续的C.一定是不续的D连续不连续都可以9.以下的叙述中,正确的是。
A.线性表的存储结构优于链式存储结构 B.二维数组是其数据元素为线性表的线性表C.栈的操作方式是先进先出D.队列的操作方式是先进后出10.每种数据结构都具备三个基本运算:插入、删除和查找,这种说法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、章节作业第一章概论1.设计算法在整型数组A[n]中查找值为K的元素,若找到,则输出其位置i(0≤i≤n-1),否则输出-1作为标志,并分析算法的时间复杂度。
int search (int A[],int n,int k){ int i;i=0;while (i<=n-1)if (A[i]!=k) i++;else break;if (i<=n-1) return I;else return -1;}当查找成功时,A[i]与k比较次数≤n;当查找不成功时,A[i]与k比较n次,所以,算法时间复杂度T(n)=O(n)。
2.写出计算方阵A[n][n]与B[n][n]乘积C[n][n]的算法,分析算法的时间复杂度。
void matrixmultiply (int A[][n],int B[][n],int C[][n],int n){ int I,j;for (i=0;i<n;i++)for (j=0;j<n;j++){ C[i][j]=0;for (k=0;k<n;k++)C[i][j]+=A[i][j]*B[k][j];}}以方阵阶数n作为输出规模。
可知第二层循环中的第一条赋值语句共执行n2次,第三层循环体中的乘法和赋值语句共执行n3次,所以此算法的计算量为n3+n2,算法时间复杂T(n)=O(n3)第二章线性表1.设带头结点的单链表的结点结构如下:struct node { DataType data;struct node *next;} Node, *LinkList;试编写一个函数int count(LinkList head,DataType x)统计单链表中数据域为x的结点个数。
int count(LinkList head,DataType x){LinkList p=head->next;Int m=0;while (p!=NULL){ if(p->data==x) m++;p=p->next;}return m;}2.试分别以顺序表和带头结点的单链表作存储结构,各写一个实现线性表的就地(即使用尽可能少的附加空间)逆置的算法,在原表的存储空间内将线性表(a1,a2,…,a n)逆置为(a n,a n-1,…,a1)。
顺序表逆置算法void inverse_sqlist(Seqlist L) {int m,n,k;DataType temp;m=0; n=L.length-1;while (m<n){ temp=L.data[m];L.data[m]=L.data[n];L.data[n]=temp;m++;n--;}}带头结点的单链表的逆置算法reverse_2(LinkList head){LinkList p,q;p=head->next;head->next=NULL;while (p!=NULL){q=p->next;p->next=head->next;head->next=p;p=q;}}第三章栈、队列和数组1.有一个整数序列,其输入顺序为20,30,90,-10,45,78,试利用栈将其输出序列改变为30,-10,45,90,78,20,试给出该整数序列进栈和出栈的操作步骤。
(用push(x)表示x进栈,pop(x)表示x出栈)push(20),push(30),pop(30),push(90),push(-10),pop(-10),push(45),pop(45 ),pop(90),push(78),pop(78),pop(20)2.设有编号为1,2,3,4的四辆列车,顺序进入一个栈式结构的站台,试写出这四辆列车开出车站的所有可能的顺序。
一号列车先出站:1234,1243,1324,1342,1432;二号列车先出站:2134,2143,2314,2341,2431;三好列车先出站:3214,3241,3421;四号列车先出站:4321;但是这里的 4123、4132、4213、4231都不是正解,所以共有14种可能3.假设以带头结点的循环链表表示队列,并且只设一个指针指向队列尾结点(注意不设头指针),试编写相应的初始化队列、入队列和出队列算法。
类型定义:typedef struct linksd_queue{DataType data;struct linked_queue *next;} LqueueTp;队列的初始化void InitQueue(LqueueTp *rear){ LqueueTp *p;p=(LqueueTp *)malloc(sizeof(LqueueTp)); rear=p;rear->next=rear;}入队列void EnQueue(LqueueTp *rear;DataType x) { LqueueTp *p;p=(LqueueTp*)malloc(sizeof(LqueueTp)); p->data=x;p->next=rear->next;rear->next=p;rear=p}出队列OutQueue(LqueueTp *rear,DataType *x) { LqueueTp *h,*p ;if (rear==rear->next){ error; return 0; }else {h=rear->next;p=h->next;*x=p->data;h->next=p->next;if (p==rear)rear=h;free(p);return 1;}}4.假设以数组cycque[m]存放循环队列的元素,同时设变量rear和quelen分别指示循环队列中队列尾元素位置和内含元素的个数。
试给出此循环队列的队列满和队列空的条件,并写出相应的入队列和出队列的算法。
类型定义:typedef struct cycqueue{DataType data[m];int rear;int quelen;} CycqueueTp;CycqueueTp *cq队列满条件是:(cq->quelen==m)。
队列空条件是:(cq->quelen==0)入队列:int EnCycQueue(CycqueueTp *cq;DataType x){if (cq->quelen==m){ error; return 0;}else {cq->rear=(cq->rear+1)%m;cq->data[cq->rear]=x;cq->quelen=cq->quelen+1;return 1;}}出队列:int OutCyQueue(CycqueueTp *cq){if (cq->quelen==0){ error; return 0;}else {cq->quelen=cq->quelen-1;*x=cq->data[(cq->rear+m-cq->quelen)% m]; return 1;}}取队列首元素:DataType GetHead(CycqueueTp *cq){ DataType x;x=cq->data[cq->rear=m-cq->quelen]% m];return x;}第四章树和二叉树1.算法设计题(1)以二叉链表作存储结构,试编写求二叉树叶子结点个数的算法。
typedef struct btnode{ DataType data;struct btnode *lchild,*rchild;}*BinTree;int leafnode_num(BinTree bt ){if (bt==NULL) return 0 ;elseif (bt->lchild==NULL) && (bt->rchild==NULL)return 1;elsereturn leafnode_num (bt->lchild)+leafnode_num (bt->rchild); }(2)设计算法求二叉树的结点的个数。
typedef struct btnode{DataType data;struct btnode *lchild,*rchild;}*BinTree;int node_num (BinTree bt){if (bt==NULL) return 0;elsereturn node_num(bt->lchild)+node_num(bt->rchild)+1;}(3)设计算法按先序次序打印二叉树T中叶子结点的值。
typedef struct btnode{ int data;struct btnode *lchild,*rchild;}*BinTree;void preorder (BinTree bt){ if (bt!=NULL){ if ((bt->lchild==NULL) && (bt->rchild==NULL))printf(“%d”,bt->dta);preorder(bt->lchild);preorder(bt->rchild);}}2.树的存储结构采用孩子兄弟链表,试编写树的按层次遍历算法typedef struct tnode{ int data;struct tnode *son,*brother;}*Tree;void tree_travel (Tree root ){ InitQueue(Q);if (root1=NULL){ EnQueue( q , root );while (!EmptyQueue(Q)){ p=GetHead(Q);OutQueue (Q);prinf(“%d” , p->data);p=p->son;while (p!=NULL){ Enqueue (Q , p);p=p->brother;}}}}第五章图1.求下列有向图中从顶点v o到其余各顶点的最短路径及长度(给出求解的过程)。
2.写出将一个无向图的邻接矩阵转换成邻接表的算法。
#define vnum 20typedef struct graph{ VertexType vexs[vnum];int arcs[vnum][vnum];int vexnum,arcnum;} GraphTp_Mat;typedef struct arcnode{int adjvex;struct arcnode *nextarc;} ArcNodeTp;typedef struct vexnode{ int vertex;ArcNodeTp *firstarc;AdjLis[vnum];typedef struct graph{ AdjLis adjlist;int vexnum,arcnum;} GraphTp_Adj;void Matrix_to_Adjlis(GraphTp_Mat *ga,GraphTp_Adj *gp) { int I,j;ArcNodeTp *p;gp->vexnum=ga->vexnum;gp->arcnum=ga->arcnum;for ( i =0;I<ga->vexnum;i++){ gp->adjlis[i].vertex=I;gp->adjlis[i].firstarc=NULL;}for (i=0;I<ga->vexnum;i++)for (j=0;j<ga->vesnum;j++)if (ga->arcs[i][j]==1)}p=(ArcNodeTp *)malloc(sizeof(ArcNodeTp));p->adjvex=j;p->nextarc=ga->adjlis[i].firstarc;ga->adjlis[i].firstarc=p;}}第六章查找1.假设线性表中结点是按键值递增的顺序排列,试写一顺序查找算法,将岗哨设在高下标端。