北工大895历年真题答案
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
问题:用 malloc 函数开辟的空间没有用 free 函数回收。 2. (1) 算法用途:求输入文本的最长行 输入:从键盘读入多行文本(以空行结尾) 输出:所有最长行及其行号(可能有多个最长行) (2) 代码(亲测可用,附截图)
#include "stdafx.h" #include<stdlib.h> #include <stdio.h> #include<string.h> typedef struct node { // 缓冲区链表 char line[ 256 ]; int num; struct node *next; } Link; Link * addlink ( Link *p, char *line, int i ) { Link *q = (Link *)malloc( sizeof( Link ) ); strcpy( q->line, line ); q->num = i; q->next = p; return q; // 在表头添加元素 }
//树结点的数据类型,暂定为整形 //孩子结点
//表头结构
//树结构 //结点数组 //根结点的位置和结点数
/*树的孩子兄弟表示法结构定义 */ typedef struct CSNode { ElemType data; struct CSNode *firstchild, *rightsib; }CSNode, *CSTree;
typedef struct { PTNode nodes[MAXSIZE]; //结点数组 int r,n; //根的位置和结点数 }PTree; /*树的孩子表示法结点结构定义 */ #define MAXSIZE 100
typedef int ElemType; typedef struct CTNode { int child; struct CTNode *next; }*ChildPtr; typedef struct { ElemType data; ChildPtr firstchild; }CTBox; typedef struct { CTBox nodes[MAXSIZE]; int r,n; }CTree;
(2)ASL=(1x1+2x2+3x4+4x6)/10=41/10 3.(1)
(2)深:V1->V2->V3->V4->V6->V5 (答案可多种) 广:V1->V2->V3->V4->V5->V6 注:一般按从大到小排 (3)V1->V2->V6->V4->V5 4、堆排序是不稳定的: 比如:3 27 36 27,
如果堆顶 3 先输出,则,第三层的 27(最后一个 27)跑到堆顶,然后堆稳定, 继续输出堆顶,是刚才那个 27,这样说明后面的 27 先于第二个位置的 27 输出, 不稳定。 四、 1、思路很简单,根放在 0 位置,以后假定当前位置是 i,那么左子结点在 2i+1, 右子结点在 2i+2。比如根的左子结点在 1,右子结点在 2。结点 1 的左子结点在 3,右子结点在 4。定义一种空值表示没有子结点,比如 empty。 递归实现比较简单:
四.1.
2.(1)所需数据:所有地点的名称,每个地点之间的距离 (2)图 (3)
C 语言程序设计部分
1. (1) 输出结果为下面 2 C 1 C Progra Pogam
问题:fun()没有在 main()之前申明 (2) 输出结果为下面 Uifcftuxbz 问题:str 中放 N 个元素,当循环退出后,k=N-1,此时有 str[k]=’\0’,是非法操作。 将 while(k<N)改为 while(k<N-1) (3) 输出结果为下面 34 45 12 23
2、(亲测代34;stdafx.h" #include <stdio.h> #include <stdlib.h> struct Node { int data; int count; struct Node * next; }; //建立只含头结点的空链表 struct Node * create_list() { struct Node * head = NULL; head = (struct Node *)malloc(sizeof(struct Node)); if (NULL == head) { printf("memory out of use/n"); return NULL; } head->next = NULL; head->data = 0; return head; } //尾插法建立链表 int insert_form_tail(struct Node * head, int num) { struct Node * temp = head; struct Node * new_node = NULL; new_node = (struct Node *)malloc(sizeof(struct Node)); if (NULL == new_node) { printf("memory out of use/n"); return -1; } //寻找尾结点 while (temp->next != NULL) { temp = temp->next; } //将新结点插入到链表的最后 new_node->data = num; new_node->count = 1;
895-2014-C 语言部分 answer
1、 (1) 输出是 rgorpasisihtam 问题:如果输入字符串长度小于 11,会有意想不到结果。 (2) 输出是 18 54 56 43 58 30 60 95 79 90 89 86 88 67 78 87 77 83 69 80 问题: while(i<=j&&data[i]<60) 以 及 while(i<=j&&data[j]>=60) 都 去 不 到 i=j,所以改为 while(i<j&&data[i]<60) while(i<j&&data[j]>=60) (3) 输出 defghabc 问题 用 malloc 函数开辟的空间,没有用 free 函数回收。
4.(1)答:尽管合并排序最坏情况运行时间为 O(nlog2n) ,直接插入排序的最坏情况运行时 间为 O(n2) ,降低了时间复杂度,但是插入排序在 n 较小时运行的快一些,因此,在合并 排序算法中,当子序列的长度小于给定的阈值时,采用直接插入排序就可以提高时间性能。 (2)答:直接插入排序的平均时间复杂度为 O(n2) ,空间复杂度为 O(1) ,快速排序的平 均时间复杂度为 O(nlogn) ,空间复杂度为 O(log2n) ,当子序列长度小于给定阈值时,直 接插入排序运行的快一些,而且空间复杂度比快速排序小,所以选择直接插入排序更好。
} else { insert_form_tail(buf,data); } } }while(1); printf("\n"); show_list(buf); system("pause"); } }
new_node->next = NULL; temp->next = new_node; return 0; } //打印链表 void show_list(struct Node * head) { struct Node * temp; temp = head->next; while(temp) { printf("%d 的出现次数为:%d\n",temp->data,temp->count); temp = temp->next; } } //在带头结点的单链表 head 中查找其值为 key 的结点 Node* LocateNode (Node *head,int key) { Node *p=head->next;//从开始结点比较。表非空,p 初始值指向开始结点 while(p&&p->data!=key)//直到 p 为 NULL 或 p->data 为 key 为止 p=p->next;//扫描下一结点 return p;//若 p=NULL,则查找失败,否则 p 指向值为 key 的结点 } void main() { int data; Node *buf = NULL; //定义头结点 Node *p1 = NULL; //链表建立 buf = create_list(); printf("请输入若干整数(输入 0 结束输入):"); do { scanf("%d", &data); if(data==0) break; else { printf("接收完毕,请继续输入:"); p1=LocateNode(buf, data); if(p1) { p1->count++;
Link *freelink(Link *head){ // 释放整个链表 Link *q, *next; q = head; while(q){ next = q->next; free(q); q = next; } return NULL; } void main( ) { int max = 0, i, n; Link *buf = NULL; for( i=0; ; i++ ) { char line[256]; gets(line); // 读入一行 if( 0 == (n = strlen( line ) ) ) break; // 空行时,结束循环 if( n < max ) continue; // if( n > max ) { max = n; // buf = freelink( } buf = addlink( buf, 继续下一循环处理 保存最长行的长度 buf );// 清空缓冲区 line, i ); // 保存最长行
} for( ; buf!=NULL; buf=buf->next ) printf( "%d: %s\n", buf->num, buf->line );// 输出缓冲区 system("pause"); }
2014 年 895 一.1-5ABBBA 6-10DDDCC 二.1.n 2.B 3.108 30 6 – 4 / 5 + 8 * 4.64 5.ABDEFCGH 6.26 7.队列 8.n-1 9.越小 10.关键字之间的比较和记录的移动 三. 1.(1)A:00 B:01 C:10 D:11 29 32 28 30 45
(2)采用哈夫曼编码 通过分析传输的文本,可以发现各个字母出现的次数为 A:4,B:5,C:2,D: 1。由于出现的频率不同,且要不产生二义性,故采用哈夫曼编码。如图:
故 A:11
B:0
C:100
D:101
(3)(1)中编码长度相同,当字母较多时,编码长度会很长,比较浪费空间。(2)
中编码长度不同,所以根据每个字母使用频率指定不同的编码,使用频率高,编 码长度短,这种方法会节省空间。 2.(1)判定树如图:
void Conversion(int A[],int n,BiTree &T) { if(T == NULL) A [n] = empty; A [n] = T ->data; Conversion (A , n * 2 + 1,T ->lchild); Conversion (A , n * 2 + 2,T ->rchild); }
2、 (1)树 (2) /*树的双亲表示法结点结构定义
#define MAXSIZE 100 typedef int ElemType; typedef struct PTNode { ElemType data; int parent; }PTNode;
*/
//树结点的数据类型,暂定为整形 //结点结构 //结点数据 //双亲位置