北科大数据结构上机题代码
- 格式:doc
- 大小:42.50 KB
- 文档页数:26
特别注意事项:仅供参考1,文件名“40862533_王小小_数学0801_实验1.doc”中的实验1指的是第几次上机实验,与“实验指导书”中的实验几没有关系;2,文件名“40862533_王小小_数学0801_实验1.doc”中的doc是文件扩展名,请注意不要提交如“*******.doc.doc”的文件;3,上机实验作业一律以word形式提交;4,若上机实验有多个作业,请按照下列加粗方式给每个作业命名,如:实验1_1,实验1_25,实验作业的word文件的页眉不可少,请每次注意修改;6,每个实验作业均要给出比较详细的程序说明,且程序说明位于程序之后。
程序说明是特别重点考察的部分,请按照你的理解进行撰写;7,该部分“特别注意事项”可以随同作业一并提交,请提交作业前进行对照。
实验1_1/***********************************程序功能: 输出一个字符串***********************************/#include "stdafx.h"#include<iostream>using namespace std;void main(){cout<<"This is a C++ program.\n";}程序说明:该程序由一个main函数构成,main函数中的语句cout是一个函数调用语句,其基本功能是实现标准的输出。
实验1_2/***********************************程序功能:比较两个数字大小***********************************/#include "stdafx.h"#include <iostream>using namespace std;int max(int,int);//定义main函数void main(){int a,b,c;cout<<"input two number"<<endl;cin>>a>>b;c=max(a,b);cout<<"max="<<c<<endl;}int max(int x,int y)//输入xy 两个参数{int z;if(x>y) z=x;else z=y;//简单的if else语句,通过这语句,将xy中较大的赋给zreturn(z);}程序说明:先是输入两个数字,比较大小,并输出。
2022年北京科技大学计算机科学与技术专业《数据结构与算法》科目期末试卷A(有答案)一、选择题1、用有向无环图描述表达式(A+B)*((A+B)//A),至少需要顶点的数目为()。
A.5B.6C.8D.92、若需在O(nlog2n)的时间内完成对数组的排序,且要求排序是稳定的,则可选择的排序方法是()。
A.快速排序B.堆排序C.归并排序D.直接插入排序3、线性表的顺序存储结构是一种()。
A.随机存取的存储结构B.顺序存取的存储结构C.索引存取的存储结构D.Hash存取的存储结构4、循环队列A[0..m-1]存放其元素值,用front和rear分别表示队头和队尾,则当前队列中的元素数是()。
A.(rear-front+m)%mB.rear-front+1C.rear-front-1D.rear-front5、已知有向图G=(V,E),其中V={V1,V2,V3,V4,V5,V6,V7}, E={<V1,V2>,<V1,V3>,<V1,V4>,<V2,V5>,<V3,V5>, <V3,V6>,<V4,V6>,<V5,V7>,<V6,V7>},G的拓扑序列是()。
A.V1,V3,V4,V6,V2,V5,V7B.V1,V3,V2,V6,V4,V5,V7C.V1,V3,V5,V2,V6,V7D.V1,V2,V5,V3,V4,V6,V76、已知字符串S为“abaabaabacacaabaabcc”,模式串t为“abaabc”,采用KMP算法进行匹配,第一次出现“失配”(s!=t)时,i=j=5,则下次开始匹配时,i和j的值分别()。
A.i=1,j=0 B.i=5,j=0 C.i=5,j=2 D.i=6,j=27、下列叙述中,不符合m阶B树定义要求的是()。
A.根结点最多有m棵子树 B.所有叶结点都在同一层上C.各结点内关键字均升序或降序排列 D.叶结点之间通过指针链接8、已知一棵二叉树的前序遍历结果为ABCDEF,中序遍历结果为CBAEDF,则后序遍历结果为()。
装 订 线 内 不 得 答 题自觉遵 守考 试 规 则,诚 信 考 试,绝 不作 弊(A) 空或只有一个结点 (B) 高度等于其结点数(C) 任一结点无左孩子 (D) 任一结点无右孩子6.一趟排序结束后不一定能够选出一个元素放在其最终位置上的是( )。
(A) 堆排序 (B) 冒泡排序 (C) 快速排序 (D) 希尔排序7.设某棵二叉树中只有度数为0和度数为2的结点且度数为0的结点数为n,则这棵二叉中共有()个结点。
(A) 2n (B) n+l (C) 2n-1 (D) 2n+l8.顺序查找不论在顺序线性表中还是在链式线性表中的时间复杂度为( )。
(A) O(n) (B) O(n2) (C) O(n1/2) (D) O(1og2n)9. 下列程序段的时间复杂度为()。
i=0,s=0; while (s<n) {s=s+i;i++;}(A) O(n1/2) (B) O(n1/3) (C) O(n) (D) O(n2)10. 深度为k的完全二叉树中最少有( )个结点。
(A) 2k-1-1 (B) 2k-1 (C) 2k-1+1 (D) 2k-111.设指针变量front表示链式队列的队头指针,指针变量rear表示链式队列的队尾指针,指针变量s指向将要入队列的结点X,则入队列的操作序列为( )。
(A) front->next=s;front=s; (B) s->next=rear;rear=s;(C) rear->next=s;rear=s; (D) s->next=front;front=s;12.设某无向图中有n个顶点e条边,则建立该图邻接表的时间复杂度为( )。
(A) O(n+e) (B) O(n2) (C) O(ne) (D) O(n3)13.设某哈夫曼树中有199个结点,则该哈夫曼树中有( )个叶子结点。
(A) 99 (B) 100 (C) 101 (D) 10214.设无向图G中的边的集合E={(a,b),(a,e),(a,c),(b,e),(e,d),(d,f),(f,c)},则从顶点a出发进行深度优先遍历可以得到的一种顶点序列为()。
《认识实习》数学信计15考试报告(2017.07.14)N = Convert.ToInt32(textBox1.Text);k = new int[N, myn];sum = new int[this.N];ave = new float[this.N];float num = 0f;Random random = new Random();Brush brush = new SolidBrush(Color.Red);for (int i = 0; i < N; i++){sum[i] = 0;for (int j = 0; j < myn; j++){float num2 = (float)random.NextDouble();float num3 = 0f;for (int k = 0; k < mym; k++){if (k == 0){num3 = P0[0];}else{num3 += P0[k];}if (num2 <= num3){this.k[i, j] = k + 1;break;}}sum[i] += k[i, j];}num += (float)this.sum[i];ave[i] = num / (float)(i + 1);m2.Clear(Color.White);lenx = (float)this.pictureBox2.ClientSize.Width / m2.DpiX;leny = (float)this.pictureBox2.ClientSize.Height / m2.DpiY;Pen pen = new Pen(Color.YellowGreen, 1f / m2.DpiY);float num4;for (int k = 1; k < mym; k++){num4 = (float)k * leny / (float)this.mym;m2.DrawLine(pen, 0f, num4, lenx, num4);}float num5;for (int j = 1; j < myn; j++){num5 = (float)j * lenx / (float)this.myn;m2.DrawLine(pen, num5, 0f, num5, leny);}for (int j = 0; j < myn; j++){num5 = ((float)j + 0.5f) * lenx / (float)this.myn;num4 = ((float)this.k[i, j] - 0.5f) * leny / (float)this.mym;m2.FillEllipse(brush, num5, num4, 0.2f, 0.2f);}lenx = (float)this.pictureBox1.ClientSize.Width / m1.DpiX;leny = (float)this.pictureBox1.ClientSize.Height / m1.DpiY;num5 = ((float)i + 0.5f) * lenx / (float)this.N;num4 = ((float)(this.sum[i] - myn) + 0.5f) * leny / (float)(this.mym * myn - myn + 1); m1.FillEllipse(brush, num5, num4, 0.05f, 0.05f);Pen pen2 = new Pen(Color.Gold, 1f / m3.DpiY);if (i > 0){float num6 = (float)(this.mym * myn - myn + 1) - ave[i - 1];float num7 = (float)(this.mym * myn - myn + 1) - ave[i];m3.DrawLine(pen2, (float)(((double)i - 0.5) * (double)this.X3), num6 * Y3, (float)(((double)i + 0.5) * (double)this.X3), num7 * Y3);}if (this.checkBox1.Checked){Thread.Sleep((int)Convert.ToInt16(this.textBox2.Text));}}5.在左下角,画出横线为随机变量的期望,累计平均值Count(this.textBox5.Text);maxy = 0f;for (int i = 1; i <= myn; i++){for (int j = 1; j <= mym * i; j++){if (this.Pn[j - 1, i - 1] > maxy){maxy = Pn[j - 1, i - 1];}}}m4 = pictureBox4.CreateGraphics();m4.Clear(Color.White);m4.PageUnit = GraphicsUnit.Inch;lenx = (float)this.pictureBox4.ClientSize.Width / m4.DpiX;leny = (float)this.pictureBox4.ClientSize.Height / m4.DpiY; X4 = lenx / (float)(this.mym * myn);Y4 = leny / maxy;Brush brush = new SolidBrush(Color.FromArgb(255, 0, 0, 255));PointF pt = new PointF(0f, 0f);PointF pt2 = new PointF(0f, 0f);for (int i = 1; i <= myn; i++){m4.Clear(Color.White);for (int j = i; j <= mym * i; j++){if ((double)this.Pn[j - 1, i - 1] > 0.001){pt.X = (float)j * X4;pt.Y = (this.maxy - Pn[j - 1, i - 1]) * Y4;m4.FillRectangle(brush, pt.X, pt.Y, X4 / 2f, Pn[j - 1, i - 1] * Y4); }}Thread.Sleep(500);}float啊 = this.啊;float哦 = this.哦;float num = 0.1f;int num2 = (int)(6.0 * Math.Sqrt((double)哦) / (double)num) + 1;PointF[] array = new PointF[num2];Pen pen = new Pen(Color.FromArgb(255, 255, 0, 0), 2f / m4.DpiY);int num3 = 0;int num4 = 0;for (float num5 = (float)((double)啊 - 3.0 * Math.Sqrt((double)哦)); num5 <= (float)((double)啊 + 3.0 * Math.Sqrt((double)哦)); num5 += num){float num6 = 1f / (float)Math.Sqrt(6.2831852 * (double)哦) *(float)Math.Exp((double)(-(double)(num5 - 啊) * (num5 - 啊) / (2f * 哦)));float x = num5 * X4;float y = (this.maxy - num6) * Y4;array[num3].X = x;array[num3].Y = y;num3++;if (num4 == 0){pt.X = x;pt.Y = y;num4 = 1;}else{pt2.X = x;pt2.Y = y;m4.DrawLine(pen, pt, pt2);pt.X = pt2.X;pt.Y = pt2.Y;}Thread.Sleep(10);}。
.
说明:
完成。
本次上机内容分两次上机1.
”,按照本说明完成以下实验内容;班级_姓名__Lab8.doc2.将本文档改名为“学号周周日前通过课程中心提交本文档。
3.在16P148)
(实验指导实验内容和实验要求练习题一1.运
练习题二2.ARR_SIZE
改为STU纠错:int FindMax( int score[][STU], int n, int m, int *pRow, int *pCol ) 运行结果截图:
.. .
..
.
3.练习题三运行结果截图:
思考题及问题:①答案:.. .
②答案:
练习题四4.运行结果截图:
..
.
练习题五5.运行结果截图:
..
.
练习题六6.运行结果截图:.. .
思考题及问题:
②答案:..
.
源程序文本(修改部分红色字体标注)
自测练习自测练习一1.源程序文本:
运行结果截图:
自测练习二2.源程序文本:
运行结果截图:..
.
自测练习三3.源程序文本:
自测练习四4.源程序文本:
自测练习五5.修改后的源程序文本(修改部分红色字体标注):
运行结果截图:..
.
自测练习六(选做)6.
..。
第一次《数据结构》上机测试代码题目分配:本次测试一共三个大题目,包括A)顺序表的基本操作,B)单链表的基本操作及C)栈和队列的操作。
1、题目一有3个小题目,每位同学只需做其中一题即可,做题序号由学号后两位模3决定。
若模出来结果为1,则做第1道;结果为2,则做第2道;结果为0,做第3道。
2、题目二也有3个小题目,每位同学只需做其中一题即可,做题序号同题目一。
3、题目三所有同学都做。
该题目有2个测试用例,测试用例由学号后一位模2决定。
若模出来结果为1,则用第1个测试用例;结果为0,则用第2个测试用例。
注意事项:1、每个同学在D:盘下新建一个文件夹,以“班级+学号+姓名”形式命名,如:2班20120102张三。
该文件夹中应该包含三个子文件夹,包括了所有作业。
2、三个子文件夹分别对应三个试题,分别命名为:1)顺序表、2)链表、及3)栈和队列。
将相应题目的工程建于各文件夹下。
(也即,顺序表文件夹应该有顺序表的操作的工程文件)3、考试结束,请各位同学在座位上,等待监考老师确认你的考题之后方可签字离开。
第一部分线性表题目一:*************头文件sequential.h***********************#ifndef _FUNC_H#define _FUNC_H//函数结果状态代码#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2#define LIST_INIT_SIZE 100#define LISTINCREMENT 10typedef int Status;//Status是函数的类型,其值是函数结果状态代码typedef int ElemType;//数据元素的类型ElemType为inttypedef struct {ElemType * elem;int length;int listsize;}SqList;extern Status InitList_sq (SqList &L);//初始化一个空的顺序表Lextern Status BuildList_sq (SqList &L, int n);//构造由n个元素构成的顺序表Lextern Status ListInsert_sq (SqList &L, int i, ElemType e);//在顺序表L中第i个位置插入新元素e,插入成功,返回1(OK),否则返回0(ERROR)extern Status ListDelete_sq (SqList &L, int i, ElemType &e);//在顺序线性表L中删除第i个元素,并用e 返回其值,删除成功,返回1(OK),否则返回0(ERROR)extern Status LocateElem_sq (SqList &L,ElemType e); //定位元素e,定位成功,函数返回该元素在顺序表中的位置,否则返回0extern Status ClearList_sq(SqList &L); //清空顺序表extern Status ListTraverse_sq (SqList L);//遍历顺序表extern void menu();//选择菜单#endif************************************************************************************** *********************************************************************************************************功能函数function.cpp*********************#include <stdlib.h>#include "stdio.h"#include "sequential.h"Status InitList_sq (SqList &L){//初始化一个空的顺序表LL.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));if (! L.elem) return ERROR;L.length = 0;L.listsize = LIST_INIT_SIZE;return OK;}//end of InitListStatus BuildList_sq(SqList &L, int n){//构造由n个元素构成的顺序表Lif (L.length >= L.listsize){ElemType * newbase = (ElemType *)realloc(L.elem,(L.listsize + LISTINCREMENT) * sizeof(ElemType));if (!newbase) return ERROR;L.elem = newbase;L.listsize += LISTINCREMENT;}ElemType e;for (int i = 0; i<n; i++){printf("第%d个元素的值为:",i+1);scanf("%d", &e);L.elem[i]=e;}return OK;}//依次访问L中的每个数据元素并输出其值Status ListTraverse_sq (SqList L){int i = 0;if (! L.elem) return ERROR;while (i < L.length){printf("%d ", L.elem[i]);i++;}printf("\n");return OK;}Status ClearList_sq(SqList &L){//清空顺序表if (! L.elem) return ERROR;L.elem = NULL;L.length = 0;L.listsize = 0;return OK;}Status ListInsert_sq (SqList &L, int i, ElemType e){//在顺序表L中第i个位置插入新元素e,插入成功,返回1(OK),否则返回0(ERROR)return OK;}//end of ListInsertStatus ListDelete_sq (SqList &L, int i, ElemType &e){//在顺序线性表L中删除第i个元素,并用e返回其值,删除成功,返回1(OK),否则返回0(ERROR)return OK;}Status LocateElem_sq(SqList &L, ElemType e){ //定位元素e,定位成功,函数返回该元素在顺序表中的位置,否则返回0return 0;}//打印菜单void menu(){printf("\n请选择操所\n");printf("1.插入元素\n");printf("2.删除元素\n");printf("3.定位元素\n");printf("4.遍历顺序表\n");printf("0.清空线性表,并退出\n");}************************************************************************************** ************************************************************************************** *****************主函数sequential.cpp**************************#include <stdio.h>#include "sequential.h"void main(){SqList L;int i=0;ElemType e = 0;if (!InitList_sq(L)) printf("建立空线性表失败,请重启程序\n");else{printf("请输入需要建立的元素个数,输入0表示退出\n");scanf("%d", &L.length);printf("请逐个输入整数型元素:\n");if (!BuildList_sq(L, L.length)) printf("建立线性表失败,请重新输入\n");else{char choice = 1;while(choice){menu();scanf("%d", &choice);switch(choice){case 1:break;case 2:break;case 3:break;case 4:ListTraverse_sq(L);break;}//end of switch} //end of while}//end of buildlist}//end of initlist}题目二:******* 头文件linked .h****************************** #ifndef _FUNC_H#define _FUNC_H//函数结果状态代码#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2#define LIST_INIT_SIZE 100#define LISTINCREMENT 10//Status是函数的类型,其值是函数结果状态代码typedef int Status;typedef int ElemType;typedef struct LNode {ElemType data; // 数据域struct LNode *next; // 指针域} LNode, *LinkList;extern Status ListInsert_L(LinkList L, int i, ElemType e);//向链表的i位置中插入元素e,如果插入成功,函数返回1,否则返回0:extern Status ListDelete_L(LinkList L, int i, ElemType &e);//删除链表i位置元素,并用e返回,如果删除成功,函数返回1,否则返回0:extern Status LocateElem(LinkList L,ElemType e);//定位元素e在链表中的位置,存在返回该元素的位序,否则返回0;extern void ClearList(LinkList &L);//清空链表extern void CreateListe_L(LinkList &L,int n );//创建链表extern Status ListTravel_L(LinkList L);//遍历链表extern void menu();//菜单#endif************************************************************************************** ************************************************************************************* ********功能函数function.cpp***************************#include <stdlib.h>#include "stdio.h"#include "linked .h"void CreateListe_L(LinkList &L,int n ){//生成链表L=(LinkList)malloc(sizeof(LNode));L->next=NULL;LinkList q=L;for (int i=1;i<=n;i++){LinkList p=(LinkList)malloc(sizeof(LNode));scanf("%d",&p->data);q->next=p;q=p;}q->next=NULL;}Status ListTravel_L(LinkList L){//遍历链表LinkList p;if (!L) return ERROR;printf("链表为:");p=L->next;while (p){printf("%d ",p->data);p=p->next;}return OK;}void ClearList(LinkList &L){//清除链表while ( L->next){LinkList p=L->next;L->next = p->next;free(p);}}Status ListInsert_L(LinkList L, int i, ElemType e){//向链表的i位置中插入元素e,如果插入成功,函数返回1,否则返回0return OK;}//end of ListInsertStatus ListDelete_L(LinkList L, int i, ElemType &e){//删除链表i位置元素,并用e返回,如果删除成功,函数返回1,否则返回0 return OK;}Status LocateElem(LinkList L,ElemType e){//定位元素e在链表中的位置,存在返回该元素的位序,否则返回0}void menu(){//菜单printf("\n**********************\n");printf("1.插入元素\n");printf("2.删除元素\n");printf("3.定位元素\n");printf("4.遍历链表\n");printf("0.清空链表,并退出\n");printf("\n**********************\n");}************************************************************************************** ************************************************************************************** *****************主函数linked .cpp*******************************#include <stdio.h>#include <stdlib.h>#include " linked.h"void main(){LinkList L=(LinkList)malloc(sizeof (LNode));L->next = NULL;int i;int n;ElemType e = 0;char choice = 1;printf("请输入要建立的链表元素个数:");scanf("%d", &n);CreateListe_L(L, n);while(choice){menu();scanf("%d", &choice);switch(choice){case 1:break;case 2:break;case 3:break;case 4:break;}//end of switch} //end of while}题目三:***********************头文件3.h*******************************#ifndef _FUNC_H#define _FUNC_H#define STACK_SIZE 3 //顺序栈的深度为3typedef char SElemType;//栈元素的类型为chartypedef struct {SElemType *base;SElemType *top;int stacksize;} SqStack;//顺序栈extern int InitStack (SqStack &s);//构造栈extern int POP (SqStack &s, SElemType &e);//S栈顶元素出栈,赋给变量e;extern int PUSH (SqStack &s, SElemType e);//元素e入S栈;extern int StackEmpty(SqStack s);//判S栈是否为空extern int EnQueue(SqStack &S1, SqStack &S2,SElemType x);//利用两量栈S1,S2实现元素x的入对列extern int QueueEmpty(SqStack S1,SqStack S2);//判队列是否为空算法extern int DeQueue(SqStack &S2,SqStack &S1,SElemType &x);//利用两量栈S1,S2实现元素x的出对列,成功返回1,否则返回0extern void menu();//菜单extern void TravelQueue(SqStack S1, SqStack S2);//遍历队列#endif************************************************************************************** ************************************************************************************** *****************功能函数function.h**************************************#include <stdio.h>#include <stdlib.h>#include "3.h"int InitStack (SqStack &s){//初始化顺序栈ss.base=(SElemType*)malloc(STACK_SIZE * sizeof (SElemType));if (!s.base) return 0; //存储分配失败s.top = s.base;s.stacksize = STACK_SIZE;return 1;}int POP (SqStack &s, SElemType &e) {// 出栈操作,并用e返回栈顶if (s.top == s.base) return 0; // 若栈空,返回ERRORe = *--s.top; //不空,用形参e返回其值return 1; //返回OK;}int PUSH (SqStack &s, SElemType e) {// 入栈操作if (s.top - s.base >= s.stacksize) return 0; //栈满,返回ERROR*s.top++ = e; //*S.top=e;S.top++;return 1;}int StackEmpty(SqStack s){//判断栈S是否为空,为空,返回OK,否则返回ERRORif (s.base == s.top) return 1;return 0;}void menu(){//菜单printf("\n**********************\n");printf("1:入队列\n");printf("2:出队列\n");printf("3:判空\n");printf("4:遍历\n");printf("0.退出\n");printf("\n**********************\n");}//遍历队列void TravelQueue(SqStack S1, SqStack S2){SElemType *p_S1, *p_S2;printf("队列中的元素为:\n");for( p_S2=S2.top-1; p_S2>=S2.base; p_S2--)printf("%c--",*p_S2);for(p_S1=S1.base ; p_S1<S1.top ; p_S1++)printf("%c--",*p_S1);}//利用两量栈S1,S2实现元素x的入对列int EnQueue(SqStack &S1, SqStack &S2,SElemType x){//将x入队列,若入队列成功返回1,否则返回0。
北京科技大学 2015--2016学年 第 1 学期数据结构与算法分析 试卷院(系) 班级 学号 姓名试卷卷面成绩占课程考核成绩70% 平时成绩占30% 课程考核成绩 题号 一 二 三 四 五 六 七 小计 得分一、(30分)选择题 1.设一组权值集合W={2,3,4,5,6},则由该权值集合构造的哈夫曼树中带权路径长度之和为( )。
(A) 20 (B) 30 (C) 48 (D) 452.执行一趟快速排序能够得到的序列是( )。
(A) [41,12,34,45,27] 55 [72,63] (B) [45,34,12,41] 55 [72,63,27] (C) [63,12,34,45,27] 55 [41,72] (D) [12,27,45,41] 55 [34,63,72]3. 设指针变量p 指向单链表中结点A ,若删除单链表中结点A ,则需要修改指针的操作序列为( )。
(A) q=p->next ;p->data=q->data ;p->next=q->next ;free(q); (B) q=p->next ;q->data=p->data ;p->next=q->next ;free(q); (C) q=p->next ;p->next=q->next ;free(q); (D) q=p->next ;p->data=q->data ;free(q);4.时间复杂度不受数据初始状态影响而恒为O(nlog2n)的是( )。
(A) 堆排序 (B) 冒泡排序 (C) 希尔排序 (D) 快速排序5.设二叉树的先序遍历序列和后序遍历序列正好相反,则该二叉树满足的条件是( )。
得 分装 订 线 内 不 得 答 题自觉遵 守考 试 规 则,诚 信 考 试,绝 不作 弊(A) 空或只有一个结点 (B) 高度等于其结点数(C) 任一结点无左孩子 (D) 任一结点无右孩子6.一趟排序结束后不一定能够选出一个元素放在其最终位置上的是( )。
一、1)功能描述输入数据(设为整型)建立单链表,并求相邻两节点data值之和为最大的第一节点。
2)详细设计遵循链表建立的基本思想,建立一个新的链表,H为表头,r为新节点,p为表尾节点指针,没存入一个新的数据则申请一个新的节点,知道没有数据输入,利用循环和打擂台法,比较和的大小,并输出。
3)测试分析程序调试完成后,选取两组数据进行测试,都得出了正确结果(数据以0为结束符,若有相同和,则取第一组)结果截图4)心得体会通过做第一题,学习到链表的建立以及链表里指针的使用,并且复习了比较法里面的打擂台法。
二、1)功能描述实现算术表达式求值程序(栈的运用),输入中缀表达式,可将其转换成后缀表达式2)详细设计本题目的程序是根据课本上的程序改进之后得出的,课本上有完整的程序,但是有bug,按照课本上的程序,结果会出现“烫烫烫烫烫”,原因是对于优先级的比较没有处理好,因此加了两行代码,将优先级的比较处理好,即现在的程序.3)测试分析程序调试完成后,选取题目所给的式子进行测试,得出了正确后缀表达式结果结果截图4)心得体会通过做第二题,对于课本上的知识表示得出“实践出真知”的真理,即使书上的东西也不一定就是正确的,尤其是代码,最好是个人自己真正实践一下。
三、1)功能描述实现链式队列运算程序(队列的运用)2)详细设计本题目是队列相关应用,队列和栈是相反的,队列是先进的先出,因此输入12345,先出的是1,本着队列的这一特性,根据课本所学的队列的算法,设计了如下程序。
3)测试分析程序调试完成后,选取12345进行测试,后缀加0,则一个字符出队,只输入0,则继续出队,输入@,则打印剩余全部元素。
结果截图4)心得体会通过做第三题,对于队列的特点有了更加深刻的认识,尤其区分队列与栈的不同点,需要特别注意。
四、1)功能描述①构造关于F的Huffman树;②求出并打印D总各字符的Huffman编码.2)详细设计本题目是Huffman树的应用以及Huffman编码的应用,参照课本上关于Huffman树的建立以及Huffman编码的应用的实现,将所给数据依权值最小原则建立Huffman树,并实现Huffman编码.3)测试分析程序调试完成后,给出数据abcdefgh,相应频率为12345678,运行代码得出结果如图.同时选取另一组数据测试也得出了正确结论结果截图4)心得体会通过做第四题,对于Huffman树有了更加深刻的体会,同时练习也使得对课本知识进行实践,有助于更好的理解Huffman树的算法。
数据结构实验实验一线性表的基本操作实验二栈和队列实验三二叉树的操作实验四图的遍历实验五查找实验六排序实验一线性表的基本操作(1)实验要求:分别采用线性表的两种存储结构(顺序存储结构、链式存储结构)来实现以上基本操作。
(2)实验目的:了解线性表的基本概念,掌握线性表的两种存储结构——顺序存储和链式存储,掌握在两种存储结构上实现线性表的基本操作,掌握用C上机调试线性表操作的基本方法。
(3)实验内容:a.输入一组整型元素序列,建立线性表。
b.实现该线性表的遍历。
c.在该线性表中查找某一元素,查找成功显示查找元素,否则显示查找失败。
d.在该线性表中删除或插入指定元素。
(4)参考代码:#include<stdio.h>#include<stdlib.h>#define SIZE 20#define MORE 10typedef struct{int *base; //存储空间基址int length; //当前长度int listsize; //当前存储容量}SqList;void InitList(SqList &L){//构造线性表L.base=(int *)malloc(SIZE*sizeof(int));if(!L.base)exit(0);L.listsize=SIZE;scanf("%d",&L.length);printf("输入表中元素:\n"); for(int i=0;i<L.length;i++) scanf("%d",&L.base[i]);}void Output(SqList L){//遍历for(int i=0;i<L.length;i++) printf("%5d",L.base[i]); printf("\n");}void Locate(SqList L,int &e){ //查找int i;for(i=0;i<=L.length;i++){if(L.base[i]==e){printf("查找成功\n");break;}}if(i>L.length)printf("查找失败\n");}void Delete(SqList &L,int i,int &e){ //删除第i个元素int j;if(i<1||i>L.length) exit(0);e=L.base[i-1];for(j=i-1;j<L.length;j++){L.base[j]=L.base[j+1];}L.length--;}void Insert(SqList &L,int i,int e){//插入SqList q,p;int j;if(i<1||i>L.length+1)exit(0);if(L.length>=L.listsize){int *newbase=(int *)realloc(L.base,(L.listsize+MORE)*sizeof(int)); if(!newbase) exit(0);L.base=newbase;L.listsize+=MORE;}for(j=L.length-1;j>=i-1;j--){L.base[j+1]=L.base[j];}L.base[i-1]=e;L.length++;}void main(){SqList La,Lb,Lc;int d,k,e;printf("输入表的长度:\n"); InitList(La);printf("输入要查找的数:\n"); scanf("%d",&d) ;Locate(La,d);printf("要删除第几个数?\n"); scanf("%d",&k);Delete(La,k,e);printf("删除的数为:%d\n",e); printf("删除后的表为:\n"); Output(La);int a,b;printf("输入要插入的位置和数:\n");scanf("%d%d",&a,&b);Insert(La,a,b);printf("插入后的表为:\n");Output(La);}实验二栈和队列(1)实验要求:掌握栈和队列的类型定义方法;掌握栈在两种不同的存储结构上实现的五种基本操作;掌握在循环队列上实现队列的基本操作,并能灵活运用以上栈和队列知识对现实生活中的实际问题提出解决方案。
北京科技大学2001年硕士学位研究生入学考试试题考试科目:数据结构使用专业:计算机应用技术计算机软件与理论1.若将数据结构定义为一个二元组(D,R),说明符号,D,R 应分别表示什么?2.算法的时间复杂度和空间复杂度的含义是什么?3.设双向循环链表中结点的数据域,前驱和后继指针域分别为data,pre和next,试写出在指针p所指结点之前插入一s结点的c语言描述语句。
4.设输入序列为a,b,c,d,是写出借助一个栈可得到的两个数输出序列和两各不能得到的输出序列。
5.设c语言二维数组 A[5][6]中每一个元素占6个存储单元,从首地址1000开始将其按行的顺序存储,A[3][5]的地址LOC[3,5]=?6.若一刻完全二叉树中叶字结点的个数为N,且最底层结点数≧2,则此二叉树的深度H=?7.无向图的连同分量和有向图的强连通分量分别指什么?8.在一棵B+树上一般可进行那两种方式的查找运算?9.在构造HASH表中,通常有那几种处理冲突的方法?10.组织带检索文件的到排表优点是什么?二(10分)对单链表中中元素按插入方法排序的C语言描述算法如下,其中L为链表头结点指针。
清填充算法中标出的空白处,完成其功能。
Typedef strucf node{int data;struct node *next;}linknode,*link;V oid Insertsort(link L){link p,q,r,u;p=L->next;-----1----;while(-----2---){=L;q=L->next;while(-----3---&&q->data<=p->data){r=q; q=q->next;}u=p->next;-------4---;-------5---;p=u;}}三.(10分设循环队列Q[8]的当前状态如下:Q:a1 a2 a3 a4 a5front rear其中ai(1=<i=<4)为队元素,front,rear分别为队头和队尾指针(其值为元素的下标).1.请画出往队Q中插入元素a5,a6,再删除元素a1,a2后的状态:2.写出队Q的队空,队满判定条件以及进队,出队操作C语言描述语句.四.(10分此体统考生作)已知一棵二叉数的中序和后序遍历结果如下:中序:C B_F D A G I H后序:C_E D B J_H G A其中某些元素值未给出,请画出此二叉树的逻辑结构及先序线索二叉树。
408 数据结构代码题在计算机科学中,408通常指的是中国的研究生入学考试(计算机专业全国统考)的科目代码,其中包含了数据结构、计算机组成原理、操作系统和计算机网络四个部分。
而数据结构是其中一个重要的组成部分。
在数据结构的考试中,代码题是检验学生对数据结构理解程度和应用能力的一种方式。
这些题目通常要求学生实现某种特定的数据结构或算法,或者对给定的代码进行分析和修改。
以下是一个简单的例子,展示了如何在考试中处理一个关于数据结构的代码题:题目描述:实现一个单链表,链表节点包含一个整数值。
要求实现以下功能:1.在链表尾部插入一个新节点。
2.删除链表中第一个值为给定值的节点(若存在)。
要求:请用C或C++语言编写代码实现上述功能,并给出必要的注释。
示例代码(C++):cpp复制代码#include <iostream>using namespace std;// 链表节点结构体定义struct ListNode {int val; // 节点值ListNode* next; // 指向下一个节点的指针ListNode(int x) : val(x), next(nullptr) {} // 构造函数,初始化节点值并将next指针置空};class LinkedList {private:ListNode* head; // 链表头指针public:LinkedList() : head(nullptr) {} // 构造函数,初始化头指针为空~LinkedList() { // 析构函数,释放链表所有节点内存while (head != nullptr) {ListNode* temp = head;head = head->next;delete temp;}}// 在链表尾部插入一个新节点void insertAtTail(int val) {ListNode* newNode = new ListNode(val); // 创建新节点 if (head == nullptr) { // 如果链表为空,则新节点为头节点head = newNode;} else { // 否则找到链表尾部并插入新节点ListNode* curr = head;while (curr->next != nullptr) {curr = curr->next;}curr->next = newNode;}}// 删除链表中第一个值为给定值的节点(若存在)void deleteNode(int val) {if (head == nullptr) return; // 如果链表为空,则直接返回if (head->val == val) { // 如果头节点就是要删除的节点ListNode* temp = head;head = head->next; // 更新头指针指向下一个节点delete temp; // 释放原头节点内存} else { // 在链表中查找要删除的节点并删除之ListNode* prev = head;ListNode* curr = head->next;while (curr != nullptr && curr->val != val) { // 找到值为val的节点的前一个节点prev和当前节点currprev = curr;curr = curr->next;}if (curr != nullptr) { // 如果找到了值为val的节点curr prev->next = curr->next; // 将prev的next指针绕过curr 指向curr的下一个节点,从而删除curr节点delete curr; // 释放curr节点内存}}}};在真实的408考试中,题目通常会更加复杂和详细,要求学生深入理解数据结构的内部机制和性能特性。
2020年北京科技大学871计算机综合一(含计算机组成原理、数据结构)考研精品资料说明:本套考研资料由本机构多位高分研究生潜心整理编写,2020年考研初试首选资料。
一、北京科技大学871计算机综合一(含计算机组成原理、数据结构)考研真题汇编1.北京科技大学871计算机综合一(含计算机组成原理、数据结构)2013-2014年考研真题,暂无答案。
说明:分析历年考研真题可以把握出题脉络,了解考题难度、风格,侧重点等,为考研复习指明方向。
二、2020年北京科技大学871计算机综合一考研资料2.唐朔飞《计算机组成原理》考研相关资料(1)唐朔飞《计算机组成原理》[笔记+课件+提纲]①北京科技大学871计算机综合一之唐朔飞《计算机组成原理》考研复习笔记。
说明:本书重点复习笔记,条理清晰,重难点突出,提高复习效率,基础强化阶段首选资料。
②北京科技大学871计算机综合一之唐朔飞《计算机组成原理》本科生课件。
说明:参考书配套授课PPT课件,条理清晰,内容详尽,版权归属制作教师,本项免费赠送。
③北京科技大学871计算机综合一之唐朔飞《计算机组成原理》复习提纲。
说明:该科目复习重难点提纲,提炼出重难点,有的放矢,提高复习针对性。
(2)唐朔飞《计算机组成原理》考研核心题库(含答案)①北京科技大学871计算机综合一考研核心题库之唐朔飞《计算机组成原理》选择题精编。
②北京科技大学871计算机综合一考研核心题库之唐朔飞《计算机组成原理》填空题精编。
③北京科技大学871计算机综合一考研核心题库之唐朔飞《计算机组成原理》简答题精编。
④北京科技大学871计算机综合一考研核心题库之唐朔飞《计算机组成原理》综合题精编。
说明:本题库涵盖了该考研科目常考题型及重点题型,根据历年考研大纲要求,结合考研真题进行的分类汇编并给出了详细答案,针对性强,是考研复习首选资料。
(3)唐朔飞《计算机组成原理》考研模拟题库[仿真+强化+冲刺]①2020年北京科技大学871计算机综合一之计算机组成原理考研专业课六套仿真模拟题。
北京科技大学
1998年硕士学位研究生入学考试试题
考试科目:数据结构
使用专业:计算机应用技术计算机软件与理论
(1).根据数据元素之间的逻辑关系,一般有哪几种基本数据结构?
1.集合。
2.线性结构。
3.数型结构。
4.网化结构或图化结构。
(2).元素的进栈序列为:a、b、c、d、e,运用栈操作,能否得到出栈序列b、c、a、e、d和d、
b、a、
c、e?
不行,因为栈的操作特点是后进先出,所以,只能得到e、d、c、b、a序列。
(3).设一棵完全二叉树叶子节点数为k,最后一层节点数〉2,
(4).目前内部排序的方法大致可归纳为哪几类?
(5).
Procedure delmax (:pointer);
Var p,q,r:pointer; m:integer;
Begin
R:=l, p:=l^.next;
If p<>nil then
[M:=p^.data;
( )(填空)
p:=p^.next;
while p<>nil do
[ if ( ) then
1。
北科大数据结构上机题代码《数据结构》上机题1、输入数据建立单链表,并求相邻两节点data值之和为最大的第一节点。
例如输入:26473 0,建立:所求结果=4 程序结构:类型说明;建表函数:Creatlist(L); 求值函数:Adjmax(L);main( ){ 变量说明;调用Creatlist(L)建表;调用Adjmax(L)求值;打印数据;释放链表空间;Y继续?N停止 } 上机题1:#include #include typedef int datatype;//设当前数据元素为整型 typedef struct node//节点类型 { datatype data;//节点的数据域struct node *next;//节点的后继指针域 }Linknode,*Link;//linknode为节点说明符,link为节点指针说明符 Link Createlist()//创建单链表的算法 { int a,c;float b; Link H,P,r;//H,P,r分别为表头,新节点和表尾节点指针H=(Link)malloc(sizeof(Linknode)); //建立头节点 r=H; do{ c=(fflush(stdin),scanf(\ //判断输入的是否是整数a=(int)b; if(c!=1||a!=b||a>-2^16||a-2^16||adata=a;//存入数据 r->next=P;//新节点链入表尾r=P; do { c=(fflush(stdin),scanf(\ //判断输入的是否是整数 a=(int)b; if(c!=1||a!=b||a>-2^16||a-2^16||anext=NULL;//将尾节点的指针域置空 return(H);//返回已创建的头节点 } Link Adjmax(Link H)//求链表中相邻两节点data值之和为最大的第一节点的指针的算法 { Link p,p1,q; int i,j; p=p1=H->next; if(p1==NULL) return(p1); //表空返回 q=p->next; if(q==NULL)return(p1); //表长=1时返回 i=p->data+q->data;//相邻两节点data值之和 while(q->next){ p=q;q=q->next;//取下一对相邻节点的指针j=p->data+q->data; if(j>i){p1=p;i=j;//取和为最大的第一节点指针} } return (p1); } void main()//主函数 { Link A,B,p,q; int a,b; do { printf(\请输入一组整数(以0为结束符,数之间回车):\\n\ p=A=Createlist();//创建新链表 B=Adjmax(A);//求链表中相邻两节点data值之和为最大的第一节点的指针a=(int)(B->data);//取第一节点的data值printf(\第一节点的data值为:%d\\n\ while(p->next)//释放链表空间{q=p;p=p->next;free(q);} free(p); printf(\是否继续输入下一组整数:是:1,否:0\\n\scanf(\}while(b); } 上机题2、实现算术表达式求值程序。
设操作数:0,1,2,,8,9;运算符:+,2)*3 #,将其转换成后缀表达式:542—3*+#,然后计算,本例结果为11。
程序结构:类型说明;两套:Clearstack(S)、Emptystack(S)、Getstop(S)、 Push(S)、Pop(S);中缀到后缀转换的函数:Mid-post(E[n],B[n]);后缀表达式求值的函数:Postcount(B[n]);main{变量说明;输入中缀表达式,存入E[n];调用Mid-post(E,B);调用Postcount(B);打印表达式结果;Y继续?N停止 } 上机题2:#include #include #include typedef struct node { char data; struct node *next; }snode,*slink; typedef structnode1 { int data; struct node1 *next; }snode1,*slink1;void Clearstack(slink s)//置栈空 { s=NULL; } int Emptystack(slink s)//判断栈是否为空 { if(s==NULL)return(1); //栈空返回1 else return(0);//栈非空返回0 } char Getstop(slink s)//取栈顶元素 { if(s!=NULL)return (s->data);return (0);} void Push(slink*s,char x)//元素x进栈 { slink p;p=(slink)malloc(sizeof(snode)); //生成进栈p节点 p->data=x;//存入新元素 p->next=*s;//p节点作为新的栈顶链入 *s=p; } char Pop(slink*s)//出栈 { char x; slink p; if(Emptystack(*s))return (-1); //栈空,返回-1 else { x=(*s)->data; p=*s; *s=(*s)->next; free(p); return (x);//成功 } } void Push1(slink1*s,int x)//元素x进栈 { slink1 p;p=(slink1)malloc(sizeof(snode1)); //生成进栈p节点 p->data=x;//存入新元素 p->next=*s;//p节点作为新的栈顶链入 *s=p; } int Pop1(slink1*s)//出栈 { int x; slink1 p; if(Emptystack1(*s))return (-1); //栈空,返回-1 else { x=(*s)->data; p=*s; *s=(*s)->next; free(p); return (x);//成功 } } int Emptystack1(slink1 s)//判断栈是否为空 { if(s==NULL)return(1); //栈空返回1 else return(0);//栈非空返回0 } void Clearstack1(slink1 s)//置栈空 { s=NULL; } int Getstop1(slink1 s)//取栈顶元素 { if(s!=NULL)return (s->data);return (0);} int Precede(char x,char y){ int a,b; switch(x){ case #://case (: case (:a=0;break; case +:case:b=1;break; case *: case /:b=2;break;//case 与x比较{E[j++]= ;E[j++]=Pop(&s);}//E[j++]= ;Push(&s,x);//Q1 int Ecount(char E)//后缀表达式求值 { int i=0,g=0,k=0,d=0,d1,g1; char x; int z,a,b; slink1 s=NULL; while(E[i]!=#){ x=E[i]; switch(x){case :break;case +:b=Pop1(&s);a=Pop1(&s);z=a+b;Push1(&s,z);break;caseb;Push1(&s,z);break;case *:b=Pop1(&s);a=Pop1(&s);z=a*b;Push1(&s,z);break;case /:b=Pop1(&s);a=Pop1(&s);z=a/b;Push1(&s,z);break;default:{g=0;g1=0;while(E[i]!= ){g1=E[i]-0;g=g*10+g1;i++;}Push1(&s,g);} } i++; } if(!Emptystack1(s))return(Getstop1(s)); Clearstack1(s); } int pd(char B) { int i=0,c,j,k;c=strlen(B); while(B[i]!=#){switch(B[i]){case :break;case 0:case1:case2:case3:case4:case5:case6:case7:case8:case9:{ j=i+1;if(B[j]== ){while(B[j]== )j++;switch(B[j]){case 0:case1:case2:case3:case4:case5: case6:case7:case8: case9:printf(\非法输入!请重新输入!\\n\ }}}break;case +:case1;while(B[j]== )j--;switch(B[j]){case +:case:case *:case /:case ):case #:printf(\非法输入!请重新输入!\\n\ }}break;case (:{j=i-1;while(B[j]== )j--;switch(B[j]){case 0:case1:case2: case3:case4:case5:case6:case7:case8:case #:case ):printf(\非法输入!请重新输入!\\n\ }k=i+1;while(B[k]== )k++;switch(B[k]){case +:case1;while(B[j]== )j--;switch(B[j]){case (:printf(\非法输入!请重新输入!\\n\ }k=i+1;while(B[k]== )k++;switch(B[k]){case1:case2:case3:case4:case5:case6:case7:case8: case9:printf(\非法输入!请重新输入!\\n\} }break; case \\0:break; default:printf(\非法输入!请重新输入!\\n\} i++; } if(B[0]==#){ printf(\表达式为空!请重新输入!\\n\} else if (B[c-1]!=#){ printf(\非法输入!请重新输入!\\n\ } } void main(){ int a,b,c,d; char B[100],E[100]; do { do {printf(\请输入中缀表达式:\\n\ B[100]=fflush(stdin);gets(B);while(B[0]==\\0){B[100]=fflush(stdin);gets(B);}b=pd(B);}while(b==0);Mid_post(E,B);printf(\后缀表达式为:\\n\printf(\a=Ecount(E);printf(\结果=%d\\n\printf(\是否继续?是:1否:0\\n\scanf(\}while(c==1); } 上机题3、实现链式队列运算程序。