数据结构第一次上机作业
数据结构上机作业答案

作业1. 线性表编程作业:1.将顺序表逆置,要求用最少的附加空间。
参考答案#include <stdio.h>#include <malloc.h>#include <process.h>#define LIST_INIT_SIZE 100#define LISTINCREMENT 10#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status;typedef int ElemType;typedef struct{ ElemType *elem;int length;int listsize;}SqList;//创建空顺序表Status InitList_Sq( SqList &L ){L.elem = (ElemType*) malloc (LIST_INIT_SIZE*sizeof(ElemType));if (!L.elem)exit(OVERFLOW);L.length = 0;L.listsize = LIST_INIT_SIZE;return OK;}//顺序表在第i个元素之前插入eStatus ListInsert_Sq( SqList &L, int i, ElemType e){ ElemType *newbase,*q,*p;if(i<1 || i>L.length+1) //插入位置非法return ERROR;if(L.length>=L.listsize)//溢出,动态追加空间{ newbase= (ElemType *)realloc(L.elem, (L.listsize+ LISTINCREMENT) *sizeof(ElemType));if(!newbase) exit(OVERFLOW);L.elem=newbase;L.listsize+=LISTINCREMENT;}q=&(L.elem[i-1]);for(p=&(L.elem[L.length-1]);p>=q;p--) //元素后移*(p+1)=*p;*q=e; //完成元素插入++L.length;return(OK);}//顺序表遍历显示Status ListTraverse_Sq(SqList L){ int i=0;if(!L.elem)return ERROR;while(i<L.length)printf("%d ",L.elem[i++]);printf("\n");return OK;}//顺序表逆置void Reverse_Sq(SqList &L){int i,j;ElemType temp;for(i=0,j=L.length-1; i<j; i++,j--){temp=L.elem[i];L.elem[i]=L.elem[j];L.elem[j]=temp;}}void main(){SqList L;char flag;int i;ElemType e;if(InitList_Sq(L)==OK){printf("建立空顺序表成功!\n");do{printf("当前线性表长度为:%d\n",L.length);printf("请输入要插入元素的位置:");scanf("%d",&i);printf("请输入要插入的元素值:");scanf("%d",&e);if(ListInsert_Sq(L,i,e)==OK){printf("插入成功,插入后顺序表长度为:%d\n",L.length);printf("插入后的顺序表为:");ListTraverse_Sq(L);}elseprintf("插入失败");printf("\n继续插入元素?(y/n) ");fflush(stdin);scanf("%c",&flag);}while(flag=='y');Reverse_Sq(L);printf("顺序表逆置后为:\n");ListTraverse_Sq(L);}elseprintf("顺序表初始化失败!\n");}2.从键盘读入n个整数(升序),请编写算法实现:(1)CreateList():建立带表头结点的单链表;(2)PrintList():显示单链表,(形如:H->10->20->30->40);(3)InsertList():在有序单链表中插入元素x;(4)ReverseList():单链表就地逆置;(5)DelList():在有序单链表中删除所有值大于mink且小于maxk的元素。
数据结构第一次 第一次作业讲评 作业讲评

if( n >= max ) max = n;
} else{
if( root->right )
//如果有右枝,则向右继续递归
SearchBranch( root->right, n+1 );
if( root->left )
评分标准
第一题
– 写了给5分(包括只写了一个“无”字) – 没写扣1分
第二题
– 缺一项功能扣1分 – 没有注释扣1分(由于没有算法,所以没有
算法思路这项标准) – 注释太过简单扣0.5分
典型错误
获得和修改实部、虚部的函数
– 定义成获取和修改复数的函数 – 将输入输出流当成获得和修改实部、虚部
p[10] = 0;//非法地址访问
2
2008-4-28
指针链表注意事项
尽量避免在多个对象中存储指向同一地 址空间的指针
O1
O2
O3
O4
p
p
p
p
有可能出现多少麻烦?
指针链表注意事项
使用内存空间拷贝函数是拷贝长度一定要做 判断
– 首先判断长度是否小于等于0 – 尽量使用简单的大小判断,减少复杂的四则运算
i ++;
if (i == length(A) && i < length(B))
return 0;//若A’=B’=空表,则A=B
if (i == length(A)) return -1; //若A’=空表,B’≠空表,则A<B
if (i == length(B)) return 1; //若A’≠空表,B’=空表,则 A>B
作业内容
1.2 试用C++的类声明定义“复数”的抽象数 据类型。要求:
上机作业第一次

1.编写一个程序,用来分别求2个整数、3个整数、2个双精度和3个双精度数的最大值。
要求使用重载函数来实现。
2.编写一个程序,任意从键盘输入两个字符,能将他们按由大到小的顺序输出。
要求程序中有一个交换两个字符的函数,其形参是变量的引用。
3.编写一个程序,对一个整形数组的元素求和,结果使用全局变量sum存储,另外对数组元素中的奇数求和,结果使用局部变量sum存储,在主程序中将两个结果输出。
本题要求体会和理解作用域运算符的概念与基本使用方法。
4.编写一个程序,声明一个双精度指针变量,使用运算符new动态分配一个double型存储区,将首地址赋给该指针变量,并输入一个数到该存储区。
计算以该数为半径的圆的面积,并在屏幕上显示出来,最后使用运算符delete释放该空间。
数据结构第1章(第1次)作业答案

(1)一个算法应该是()。
A)程序B) 问题求解步骤的描述C) 要满足五个基本属性D) A 和C(2)算法指的是()。
A)计算机程序B) 解决问题的计算方法C) 排序算法D)解决问题的有限运算序列。
(3)与数据元素本身的形式、内容、相对位置、个数无关的是数据的()。
A)存储结构B)逻辑结构C) 算法D)操作(4)从逻辑上可以把数据结构分为()两大类。
A)动态结构、静态结构B) 顺序结构、链式结构C) 线性结构、非线性结构D) 初等结构、构造型结构(5)下列叙述中正确的是( )。
A)一个逻辑数据结构只能有一种存储结构B)数据的逻辑结构属于线性结构,存储结构属于非线性结构C)一个逻辑数据结构可以有多种存储结构,且各种存储结构不影响数据处理的效率D)一个逻辑数据结构可以有多种存储结构,且各种存储结构影响数据处理的效率(6)数据的基本单位是()。
A)数据项B) 数据类型C) 数据元素D) 数据变量(7)下列程序的时间复杂度为()。
i=0;s=0;while(s<n){ i++;s=s+i;}2nA)O ()B) O()C) O(n)D) O(n2)(8)下列程序段的渐进时间复杂度为()。
for( int i=1;i<=n;i++)for( int j=1;j<= m; j++)A[i][j] = i*j ;A)O(m2) B)O(n2) C)O(m*n) D)(m+n) (9)程序段如下:sum=0;for(i=1;i<=n;i++)for(j=1;j<=n;j++)sum++;其中n 为正整数,则最后一行的语句频度在最坏情况下是()。
2 A )O(n ) B) O(nlogn) C) O(n 3)D) O(n 2)(10) 在下面的程序段中,对 x 的赋值语句的频度为()for( i=1;i<=n ; i++) for ( j=1;j<=n ; j++)x:=x+1;A) O(2n)B)O(n) C) O(n 2) D) O(log n)(11) 程序段 for ( i:=n-1; i>=1; i--)for ( j:=1;j<=i ; j++)if (a[j]>a[j+1]){ t=a[j]; a[j]= a[j+1]; a[j+1]= t; }其中 n 为正整数,则最后一行的语句频度在最坏情况下是( )。
上机实践1

数据结构上机实践1实践目的在进一步理解线性表的顺序存储结构和基本操作的基础上,能灵活运用并解决具体问题。
预备知识1.顺序存储结构typedef struct{ElemType elem[MAXSIZE];int len;}SqList;2.基本算法(1)建立算法void creat_list(SqList *L,int n){int k;printf("\n请输入元素:");for(k=1;k<=n;k++) scanf(&L->elem[k]);L->len=n;}(2)插入算法int Insert_Sq (SqList *L ,int i, ElemType x){/* 在线性表的第i-1和第i元素之间插入一个新元素x*/if (i<1 || i>L->len+1) return 0; /* 不合理的插入位置 i */if ( L->len== MAXSIZE-1) return -1; /* 表已满 */for (j=L->len;j>=i;--j)L->elem[j+1]=L->elem[j]; /* 插入位置及之后的元素右移*/L->elem[i]=x; /*插入x */++L->len; /*表长加1 */return 1;}(3)删除算法int Delete_Sq (SqList *L ,int i ){/* 删除线性表中第个i元素 */if (i<1 || i>L->len) return 0; /*不合理的删除位置 i*/if (L->len==0) return -1; /* 表已空*/for (j=i;j<=L->len-1;j++)L->elem[j]=L->elem[j+1]; /*被删除元素之后的元素左移 */--L->len; /*表长减1*/return 1;}应用范例--合并线性表1 任务描述设有两个线性表La和Lb,现要求将线性表Lb中的元素逐一并到线性表La的表尾,若Lb中有与原La中相同的元素,则不把该元素合并进去。
数据结构上机题

数据结构上机题数据结构上机题1.简介数据结构是计算机科学中的一个重要概念,它定义了如何组织和存储数据,以及如何访问和操作这些数据。
在实际编程中,数据结构的选择直接影响代码的效率和易读性。
本文将介绍一些常见的数据结构上机题,并提供相应的解题思路和代码示例。
2.线性数据结构2.1 数组2.1.1 求解最大子数组和问题给定一个整数数组,我们需要找到一个连续的子数组,使得子数组的和最大。
该问题可以使用动态规划算法或者分治算法来解决。
2.1.2 求解两数之和问题给定一个整数数组和一个目标值,在数组中找出两个数的和等于目标值的组合。
可以使用哈希表来存储每个数的下标,然后遍历数组找到满足条件的数对。
2.2 链表2.2.1 反转链表给定一个单链表,我们需要将其反转。
可以通过递归或者迭代的方式来实现。
2.2.2 删除链表中的重复元素给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
可以使用迭代的方式来删除重复元素。
3.树形数据结构3.1 二叉树3.1.1 求解二叉树的最大深度给定一个二叉树,我们需要求解其最大深度,即从根节点到叶子节点的最长路径上节点的个数。
3.1.2 判断二叉树是否是平衡二叉树给定一个二叉树,我们需要判断该二叉树是否是平衡二叉树。
平衡二叉树定义为任意节点的左右子树的高度差不超过1.3.2 堆3.2.1 在数组中查找第K大的元素给定一个无序数组,我们需要查找其中第K大的元素。
可以使用堆排序来解决该问题。
3.2.2 合并K个有序链表给定K个有序链表,我们需要将这些链表合并为一个有序链表。
可以使用堆来实现。
4.图4.1 深度优先搜索(DFS)4.1.1 图的遍历给定一个无向图,我们需要遍历所有的节点。
可以使用深度优先搜索算法来实现。
4.1.2 判断是否存在环路给定一个有向图,我们需要判断其中是否存在环路。
可以使用深度优先搜索算法和标记法来解决。
4.2 广度优先搜索(BFS)4.2.1 最短路径问题给定一个有向图和起点,我们需要找到起点到终点的最短路径。
数据结构上机作业

数据结构上机作业1.已知输⼊x、y、z三个不相等的整数,试设计⼀个算法,使这三个数按从⼩到⼤的顺序进⾏排序并输出,并考虑此算法的⽐较次数和元素的移动次数。
2.猴⼦吃桃⼦问题。
猴⼦第⼀天摘下若⼲个桃⼦,当即吃了⼀半,还不过瘾,⼜多吃了⼀个;第⼆天早上⼜将剩下的桃⼦吃掉了⼀半,⼜多吃了⼀个;以后每天早上都吃了前⼀天剩下的⼀半加⼀个,到第⼗天早上再想吃时,发现只剩下⼀个桃⼦了。
求第⼀天共摘了多少个桃⼦。
3.给定⼀个数组,要求在此数组中插⼊⼀个元素、删除⼀个元素,并显⽰每次操作之后的输出。
4.验证课本P11程序2-1和P13程序2-2,体会顺序存储结构下线性表的插⼊和删除操作。
5.有顺序存储结构下的线性表A和B,其元素均按从⼩到⼤的升序排列,编写⼀个算法将它们合并成⼀个顺序表C,要求C的元素也是从⼩到⼤升序排列。
如:线性表A为:1、5、9、12、18、25线性表B为:2、3、6、10、16、19、20、26、28、30、35合并之后的线性表C为:1、2、3、5、6、9、10、12、16、18、19、20、25、26、28、30、356. 试写出在顺序存储结构下逆转线性表的算法,要求使⽤最少的附加空间。
7.试编程实现,在⼀个有序线性表中(顺序存储结构)插⼊⼀个元素后仍然是有序线性表。
8.设顺序存储结构下线性表中有多个0元,编程实现所有⾮零元依次移到线性表的前端。
9.验证课本P16程序2-3和P17程序2-4,体会线性链表的建⽴和查找操作。
10.思考题:将程序2-4稍作修改,改为“在单链表中查找指定结点的前⼀个结点”,为将来的插⼊和删除操作做准备。
11.试编写⼀个在单链表中数据域值为a的结点之后,插⼊⼀个新结点的算法。
若原链表中⽆数据域值为a的结点,则把新结点插⼊到表尾。
设新结点数据域值为x。
12.已知线性单链表,试编写⼀个删除表中所有值⼤于min且⼩于max的元素(若表中存在这样的元素)的算法。
13.设有两个有序线性单链表,头指针分别为AH和BH。
数据结构第一次作业

int j=0;
linklist *p,*s,*q;
p=head;
j=0;
while((p->next!=NULL)&&(j<i-1))
{p=p->next; j++;}
if(p->next!=NULL)
{
q=p->next;
p->next=p->next->next;
free(q);
}
else
return NULL;
char Pnumber[20];
char QQ[20];
char sex[50];
} student; //学生信息的类型
typedef student elemptype;
typedef struct node
{
elemptype data;
struct node *next;
}linklist; //定义单链表
printf(" 2、用顺序表来创建\n");
printf(" 3、返回\n");
printf(" **************************************************\n");
printf("\n\n\n\t\t");
}
void Menu_two_2()
//次菜单
{
}
void Menu_one()
//主菜单
{
printf("\n\n\n\n\n\n\n");
printf(" *************************************************\n");
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构第一次上机作业一.上机时间:2010年9月9日二.报告时间:2010年9月13日三.摘要1.试验目的:熟悉线性表的基本操作2.实验方法:(下面)3.实验结果(下面)四.内容(1)问题重新陈述题目的要求是随机的给四个人发牌,要求(斗地主为例,这个不用处理花色和王)1.每人手里要有13张牌(不用大小王,)2.每人每次手里的牌不能都是一样的(即:手中的牌是没有固定规律的)3.每轮每张牌只能出现一次,每个花色各有13张4.每人手中的牌要按照花色的顺序出现,再在同种花色中按照从小到大的顺序放置(2)验证:看是否满足上面的要求1.由于每张牌具有唯一性,则看每种花色的每张牌是否都出现过一次2.总数要是523.测试的方法:做差法(排序,就行做差,b[i+1]-b[i])4.测试的内容:差值是否为15.判别标准:把花色转化成数字(分别用13乘以0,1,2,3在加上拍死的数字),看是否52个数字全出现了五.所用技术1.排序方法:由于每副扑克有54张牌,但是桥牌之需要出去大小王的52张。
因此用1-52同52个数字代替每张牌2.J,Q,K,A的处理:让J相当于11,Q相当于12,K相当于13,A相当于13.花色及大小的处理:52张牌除以13所得的商1,2,3和4分别表示四种花色,所得的余数表示牌的数字(A(1),2,3,4,5,6,7,8,9,10,11(J),12(Q),13(K))或者4.随机化洗牌及发牌的方法:运用srand(time(0)), rand()或者#include<stdlib.h>, #include <time.h>例如:#include<stdlib.h>#include<time.h>#include<stdio.h>main(){int r;srand((unsigned)time(NULL));r=random(10);printf("%d\n" ,r);r=random(10);printf("%d\n" ,r);getch();}还有int random(int a,int b)//产生一个它们之间并包括它们的随机数{if(a>b){a^=b^=a^=b;}//交换a,b值,使a小,b大int x=rand()%(b-a+1)+a;}5.洗牌程序void ordinary_shuffle(struct puke pk[52]){for(i=0;i<52;i++){ int t;int tds=0,ths=0;t=rand()%52;/*取随机数*/tds=pk[i].dianshu;/*进行牌与牌之间的随机替换*/ ths=pk[i].huase;pk[i].dianshu=pk[t].dianshu;pk[i].huase=pk[t].huase;pk[t].dianshu=tds;pk[t].huase=ths;}}或者void reset(){produce_seed();for(int i=1;i<=54;i++)v.push_back(i);}void random(){for(int i=0;i<random(m,n);i++)//mn为具体的数字{int index=random(1,53);v[index]^=v[0]^=v[index]^=v[0];}6.六.存在问题1.在验证程序输入时不知道花色怎么处理2.排序时不知道怎么用C语言进行描述3.关于时间和空间复杂度的计算比较混乱4.不能正确的使用C语言编译自己所想七.解决方法1.进行二维数组进行输入用a[j][i]表示某一具体的牌,其中j表示花色,i表示牌数(A,2,3,4,5,6,7,8,9,10,J,Q,K)2.八.设计程序#include <string>#include <iostream>#include <vector>#include <Windows.h>using namespace std;vector<int> v;//储存扑克的容器void produce_seed()//产生种子{SYSTEMTIME sys;GetLocalTime( &sys );srand(sys.wMilliseconds*sys.wSecond*sys.wMinute);//这样理论上能得到3600*1000种牌型}int random(int a,int b)//产生一个它们之间并包括它们的随机数{if(a>b){a^=b^=a^=b;}//交换a,b值,使a小,b大int x=rand()%(b-a+1)+a;return x;}/*产生54张打乱顺序的扑克*/void reset(){produce_seed();for(int i=1;i<=54;i++)v.push_back(i);}void random(){for(int i=0;i<random(200,300);i++)//洗牌200至300次{int index=random(1,53);v[index]^=v[0]^=v[index]^=v[0];}}void paint(const vector<int>& v,bool type=false)//type=false不显示花型{for(int i=0;i<v.size();i++){cout<<" ";if(v[i]==53)cout<<(char)1;else if(v[i]==54)cout<<(char)2;else{if(type)cout<<(char)((v[i]+2)%4+3);if((v[i]+3)/4==13)cout<<"K";else if((v[i]+3)/4==12)cout<<"Q";else if((v[i]+3)/4==11)cout<<"J";else if((v[i]+3)/4==1)cout<<"A";else cout<<(v[i]+3)/4;}//cout<<"="<<v[i];}cout<<endl<<endl;}void sort(vector<int>& v){for(int i=0;i<v.size()-1;i++)for(int j=i+1;j<v.size();j++){if(v[i]<v[j])v[i]^=v[j]^=v[i]^=v[j];if(v[i]<53&&v[j]<53)if(((v[i]+3)/4+10)%13<((v[j]+3)/4+10)%13)v[i]^=v[j]^=v[i]^=v[j];}}void main(){reset();random();vector<int> v1(v.begin(),v.begin()+17);vector<int> v2(v.begin()+17,v.begin()+34);vector<int> v3(v.begin()+34,v.begin()+51);vector<int> v4(v.begin()+51,v.end());sort(v1);sort(v2);sort(v3);sort(v4);paint(v1,/n);paint(v2,/n);paint(v3,/n);paint(v4,/n);system("pause");}九.验证程序#include<stdio.h>void main(){int i,j,m,n;int a[4][13],b[52];flag=0;printf(“Iuput number:/n”);for(i=0;i<13;i++)for(j=0;j<4;j++){Scanf(“%d”,&a[j][i]); /*进行输入*/if(j==0) b[i]= a[j][i];else if(j==1) b[i+j*13]=a[j][i];else if(j==2) b[i+j*13]= a[j][i];else(j==3) b[i+j*13]= a[j][i];}for(i=0;i<52) /*进行验证*/{m=b[i+1]-b[i];if(m!=1) printf(“thit it wrong/n”); break;elso i=i+1;}}十.运行结果十一.。