当前位置:文档之家› 数据结构作业答案(大连理工大学)

数据结构作业答案(大连理工大学)

作业1. 线性表编程作业:1.将顺序表逆置,要求用最少的附加空间。

参考答案#include <>#include <>#include <>#define LIST_INIT_SIZE 100#define LISTINCREMENT 10#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;typedef int ElemType;typedef struct{ ElemType *elem;int length;int listsize;}SqList;立单链表");printf("2.取元素值");printf("3.查找\n");printf("4.插入");printf("5.删除");printf("6.显示\n");printf("7.删除大于mink且小于maxk的元素值");printf("8.就地升序排序\n");printf("9.就地逆置");printf("a.有序表插入");printf("q.退出\n");printf("\n请选择操作:");fflush(stdin);scanf("%c",&choice);switch(choice){case '1': printf("请输入单链表中结点个数:");scanf("%d",&n);Create_L2(L,n);break;case '2': printf("请输入元素位序:");scanf("%d",&i);GetElem_L(L,i,e);printf("元素值为:%d\n",e);break;case '3': printf("请输入要查找的元素:");scanf("%d",&e);if(dlbcz(L,e))printf("查找成功!");elseprintf("查找失败。

");break;case '4': printf("请输入插入位置:");scanf("%d",&i);printf("请输入要插入的元素:");scanf("%d",&e);if(ListInsert_L(L,i,e))printf("插入成功!单链表为:");elseprintf("插入失败。

");break;case '5': printf("请输入删除位置:");scanf("%d",&i);if(ListDelete_L(L,i,e))printf("删除成功!");elseprintf("删除失败。

\n");break;case '6': printf("\n单链表为:");xsList(L);break;case '7': printf("请输入mink和maxk:");scanf("%d,%d",&mink,&maxk);DelList(L,mink,maxk);break;case '8': sh_sort(L);break;case '9': nizhi(L);break;case 'a': printf("请输入在有序表中插入的元素值:");scanf("%d",&e);yxcharu(L,e);break;}}}作业2. 栈、队列、数组非编程作业:1.若进栈序列为ABCD,请写出全部可能的出栈序列和不可能的出栈序列。

参考答案:可能的出栈序列:(14种)dcba cdba bacd cbda adcb cbad bdca acdb bcda acbd bcad abdc badc abcd不可能的出栈序列:(10种)d bca dbac dabc dacb dcab cabd cdab bdac cadb adbc2.简要说明循环队列如何判断队满和队空参考答案:当牺牲一个存储结点,约定以“队列头指针在队列尾指针的下一位置(指环状的下一个位置)上” 作为队列“满”状态的标志时,循环队列判断队满的条件为:(rear+1) % MaxQsize==front;判断队空的条件为:front == rear。

3.设A为n阶对称矩阵,采用压缩存储存放于一维数组F[n(n+1)/2]中(从F[0]开始存放),请分别给出存放上三角阵时任一矩阵元素a ij(1≤i,j≤n)的地址计算公式和存放下三角阵时任一矩阵元素a ij(1≤i,j≤n)的地址计算公式。

参考答案:存放上三角阵时,任一矩阵元素a ij(1≤i,j≤n)的地址计算公式为:()()ij11-1Loc(a)=Loc(a)+1*2i ij l⨯⎡⎤+-⎢⎥⎣⎦存放下三角阵时,任一矩阵元素a ij(1≤i,j≤n)的地址计算公式为:()()ij11-1Loc(a)=Loc(a)+1*2j ji l⨯⎡⎤+-⎢⎥⎣⎦4.写出下面稀疏矩阵的三元组顺序表和十字链表表示。

参考答案:400000503008000000000700200000A⎡⎤⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎣⎦编程作业栈采用顺序栈存储,试设计算法实现将表达式转换成后缀表达式输出。

例如,输入表达式:a+b/c-(d*e+f)*g输出其后缀表达式:abc/+de*f+g*-参考答案:#include <>#include <>#include <>#define OVERFLOW -2#define OK 1#define ERROR 0#define STACK_INIT_SIZE 100#define STACKINCREMENT 10typedef int Status;typedef char SElemType;typedef char string[80];typedef struct{ SElemType *base;SElemType *top;int stacksize;}SqStack;Status InitStack(SqStack &S){ =(SElemType*)malloc(STACK_INIT_SIZE *sizeof(SElemType));if(! exit(OVERFLOW);=;=STACK_INIT_SIZE;return(OK);}Status ClearStack(SqStack &S){ =(SElemType*)realloc,STACK_INIT_SIZE *sizeof(SElemType));if(! exit(OVERFLOW);=;=STACK_INIT_SIZE;return(OK);}void DestroyStack(SqStack &S){ =0;if free;==NULL;}Status StackEmpty(SqStack S){ if==return true;elsereturn false;}SElemType GetTop(SqStack S){ SElemType e;if>e=*;return e;}Status Push(SqStack &S, SElemType e){if 树非编程作业:1.请分别画出具有3个结点的树和3个结点的二叉树的所有不同形态。

参考答案:具有3个结点的树:具有3个结点的二叉树:2. 已知二叉树的先序遍历序列是EABDCFHGIKJ ,中序遍历序列是ABCDEFGHIJK ,请构造二叉树,并写出其层次遍历序列和后序遍历序列。

参考答案:层次:E A F B H D G I C K J 后序---C D B A G J K I H F E3. 将下图所示的森林转换成一棵二叉树。

EACB D I JH FGKA B C D G H I J KE FL参考答案:转换成的二叉树为:4. 将下图所示的二叉树还原成树或森林。

BA CDFGE HI JKLABCDGHIJKEFLMN参考答案:转换为森林:5. 假设用于通信的电文由7个字母组成{A,B,C,D,E,F,G},字母在电文中出现的频率分别为、、、、、、。

试为这7个字母设计哈夫曼编码,并计算其带权路径长度WPL 。

参考答案:哈夫曼树为:AC HBFDM EGNJI K L 1AEG BWPL=4*++3*+++2*+=A:101 B:001 C:100 D:0001 E:11 F:0000 G:01编程作业:二叉树采用二叉链表存储,试设计算法实现:1.CreateBT (BiTree &T):从键盘输入二叉树的先序遍历序列字符串(以”#”代表空结点),建立其二叉链表;如输入:AB#D##CE#F### 则建立如下图所示二叉树的二叉链表2.ExchangeBT(BiTree T ): 设计递归算法实现二叉树中所有结点的左右孩子交换;3.CountLeaf(BiTree T, TElemType x, int &count ): 统计以值为x 的结点为根的子树中叶子结点的数目;4.DispBiTree(BiTree T, int level ) : 按树状打印二叉树。

打印得到:#C###F ##E A ##D #BBCFAED提示:对于根为T ,层次为level 的子树:① 打印其下一层(level+1层)右子树; ② 打印根结点;③ 打印其下一层(level+1层)左子树; *结点左边的’#’个数为其层次数*参考答案:#include <> #include <>typedef struct BiTNode{ char data;struct BiTNode *lchild,*rchild; }BiTNode, *BiTree; 图非编程作业:1.已知带权有向图如图所示,画出该图的邻接矩阵存储结构。

相关主题