数据结构(c语言版)课后习题答案完整版
第 1 章 绪论5.选择题:CCBDCA6.试分析下面各程序段的时间复杂度。(1)O(1)(2)O(m*n)(3)O(n 2)(4)O(log 3n)(5)因为 x++共执行了 n-1+n-2+……+1= n(n-1)/2,所以执行时间为 O(n 2)(6)O( )第 2 章 线性表1.选择题babadbcabdcddac2.算法设计题(6)设计一个算法,通过一趟遍历在单链表中确定值最大的结点。ElemType Max (LinkList L ){if(L->next==NULL) return NULL;pmax=L->next; //假定第一个结点中数据具有最大值p=L->next->next;while(p != NULL ){//如果下一个结点存在if(p->data > pmax->data) pmax=p;p=p->next;}return pmax->data;(7)设计一个算法,通过遍历一趟,将链表中所有结点的链接方向逆转,仍利用原表的存储空间。void inverse(LinkList L->next=NULL;while ( p) {q=p->next; // q 指向*p 的后继p->next=L->next;L->next=p; // *p 插入在头结点之后p = q;}}(10)已知长度为 n 的线性表 A 采用顺序存储结构,请写一时间复杂度为 O(n)、空间复杂度为 O(1)的算法,该算法删除线性表中所有值为 item 的数据元素。[题目分析] 在顺序存储的线性表上删除元素,通常要涉及到一系列元素的移动(删第i 个元素,第 i+1 至第 n 个元素要依次前移) 。本题要求删除线性表中所有值为 item 的数据元素,并未要求元素间的相对位置不变。因此可以考虑设头尾两个指针(i=1,j=n) ,从两端向中间移动,凡遇到值 item 的数据元素时,直接将右端元素左移至值为 item 的数据元素位置。void Delete(ElemType A[ ],int n)∥A 是有 n 个元素的一维数组,本算法删除 A 中所有值为 item 的元素。{i=1;j=n;∥设置数组低、高端指针(下标) 。while(itemplate class Queue { //循环队列的类定义public: Queue ( int=10 );~Queue ( ) { delete [ ] Q; }void EnQueue ( Type Type DeQueue ( );Type GetFront ( );void MakeEmpty ( ) { front = rear = tag = 0; } //置空队列int IsEmpty ( ) const { return front == rear } //判队列空否int IsFull ( ) const { return front == rear } //判队列满否private:int rear, front, tag; //队尾指针、队头指针和队满标志Type *Q; //存放队列元素的数组int m; //队列最大可容纳元素个数}构造函数template Queue:: Queue ( int sz ) : rear (0), front (0), tag(0), m (sz) {//建立一个最大具有 m 个元素的空队列。Q = new Type[m]; //创建队列空间assert ( Q != 0 ); //断言: 动态存储分配成功与否}插入函数template void Queue :: EnQueue ( Type //判队列是否不满,满则出错处理rear = ( rear + 1 ) % m; //队尾位置进 1, 队尾指针指示实际队尾位置Q[rear] = item; //进队列tag = 1; //标志改 1,表示队列不空}删除函数template Type Queue :: DeQueue ( ) {assert ( ! IsEmpty ( ) ); //判断队列是否不空,空则出错处理front = ( front + 1 ) % m; //队头位置进 1, 队头指针指示实际队头的前一位置tag = 0; //标志改 0, 表示栈不满return Q[front]; //返回原队头元素的值}读取队头元素函数template Type Queue :: GetFront ( ) {assert ( ! IsEmpty ( ) ); //判断队列是否不空,空则出错处理return Q[(front + 1) % m]; //返回队头元素的值}第 4 章 串、数组和广义表1.选择题BBCAB BBCBB ABDCB C2.综合应用题(1)已知模式串 t=‘abcaabbabcab’写出用 KMP 法求得的每个字符对应的 next 和nextval 函数值。模式串 t 的 next 和 nextval 值如下:j 1 2 3 4 5 6 7 8 9 10 11 12 t 串 a b c a a b b a b c a bnext[j] 0 1 1 1 2 2 3 1 2 3 4 5nextval[j] 0 1 1 0 2 1 3 0 1 1 0 5(3)数组 A 中,每个元素 A[i,j]的长度均为 32 个二进位,行下标从-1 到 9,列下标从 1 到 11,从首地址 S 开始连续存放主存储器中,主存储器字长为 16 位。求:① 存放该数组所需多少单元?② 存放数组第 4 列所有元素至少需多少单元?③ 数组按行存放时,元素 A[7,4]的起始地址是多少?④ 数组按列存放时,元素 A[4,7]的起始地址是多少?每个元素 32 个二进制位,主存字长 16 位,故每个元素占 2 个字长,行下标可平移至1 到 11。(1)242 (2)22 (3)s+182 (4)s+142(4)请将香蕉 banana 用工具 H( )—Head( ),T( )—Tail( )从 L 中取出。L=(apple,(orange,(strawberry,(banana)),peach),pear)H(H(T(H(T(H(T(L) ) ) ) ) ) )(5)写一个算法统计在输入字符串中各个不同字符出现的频度并将结果存入文件(字符串中的合法字符为 A-Z 这 26 个字母和 0-9 这 10 个数字)。void Count()//统计输入字符串中数字字符和字母字符的个数。{int i,num[36];char ch;for(i=0;ilchild==NULL //判断该结点是否是叶子结点(左孩子右孩子都为空) ,若是则返回 1elsereturn LeafNodeCount(T->lchild)+LeafNodeCount(T->rchild);}( 3) 交换二叉树每个结点的左孩子和右孩子。void ChangeLR(BiTree if(T->lchild==NULLelse{temp = T->lchi