1、数据结构课程设计报告学院专业: 软件工程 班 级: 学 号: 学生姓名: 指导老师: 彭伟民 日 期: 2016.01.01 目录1 猴子吃桃子问题 31.1 需求分析 31.2 程序设计思想 31.3 程序源代码 31.4 程序运行结果 52 进制数转化问题 52.1 需求分析 52.2 程序设计思想 62.3 程序源代码 62.4 程序运行结果 73 长整数运算 83.1 需求分析 83.2 程序设计思想 83.3 程序源代码 83.4 程序运行结果 124 学生成绩管理系统 134.1 需求分析 134.2 程序设计思想 134.3 程序源代码 144.4 程序运行结果 205 哈夫曼编
2、码应用 225.1 需求分析 225.2 程序设计思想 225.3 程序源代码 235.4 程序运行结果 246 学校超市选址问题 266.1 需求分析 266.2 程序设计思想 266.3 程序源代码 266.4 程序运行结果 307 学生成绩管理系统 307.1 需求分析 307.2 程序设计思想 307.3 程序源代码 307.4 程序运行结果 368 排序综合 378.1 需求分析 378.2 程序设计思想 388.3 程序源代码 388.4 程序运行结果 469 课程设计总结 471 猴子吃桃子问题1.1 需求分析有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第
3、 10 天就只余下一个桃子。用多种方法实现求出原来这群猴子共摘了多少个桃子。1.2 程序设计思想已知第十天只余下 1 个桃子,第一天开始每天都吃当前桃子一半再多一个,那么就只需要从第十天开始倒推即可,用链表、数组、递推、常规方法都可以采用这种思路实现计算第一天桃子数量。1.3 程序源代码#includeusing namespace std;/有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第 10 天就只余下一个桃子。用多种方法实现求出原来这群猴子共摘了多少个桃子。/链表方法实现typedef structint *base;int *top;Stack;void Ini
4、tStack(Stack if(s.base) s.top=s.base;elseprintf(“空间分配错误!n“);exit(0);/入栈void PushStack(Stack /出栈int PopStack(Stack int main()int peach=0;void shuZu();int digui(int i,int j);int changgui();shuZu();peach=digui(1,1);cout1)data=PopStack(s);/出栈一个元素保存在 data 中PushStack(s,2*(data+1);/再将 2*(data+1)入栈/最后栈中剩余的那
5、个元素就是第 1 天摘的桃子数cout=0;i-)peachi=(peachi+1+1)*2;cout#include #include #include void TransIntoDec(double M, int X)void TransIntoAny(int X);char *p = NULL;int len = 0;int i;int sum = 0;int by = 1;printf(“十进制数为: “);p = (char*)malloc(32);itoa(X, p, 10);len = strlen(p);for(i = 0; i m)break;if(i = length)T
6、ransIntoDec(m, x);elseprintf(“Input errorn“);return;2.4 程序运行结果3 长整数运算3.1 需求分析设计一个程序实现两个任意长的整数求和运算。提示:可利用双项循环链表实现长整数的存储,每个结点含一个整型变量。3.2 程序设计思想定义双链表的节点结构,每个节点存储一个 4 位的数,比如1,0031,0056 存入链表后就是 1,31,56 三个节,输出的时候再补 0 输出,由此完成长整数加法或减法运算。3.3 程序源代码#include #include #include /以下是双链表的节点结构,每个节点存储一个 4 位的数,比如1,003
7、1,0056 存入链表后就是 1,31,56 三个节,输出的时候再补 0 输出!typedef struct nodeint n;struct node *next;struct node *prev; node;node *p;char num11024,num21024;int conv(char *a)int n=0,i;for(i=0;ai;+i)n*=10;n+=(ai-0);return n;int main()char c2;int i,f;node *q;p=(node*)malloc(sizeof(node);p-next=p-prev=0;q=p;num10=num20=,
8、;printf(“请输入第一个数字 :n“);scanf(“%s“,num1+1);for(i=strlen(num1);i=0;-i)if(num1i=,)num1i=0;q-next=(node*)malloc(sizeof(node);q-next-prev=q;q-next-next=0;q=q-next;q-n=conv(num1+i+1);q-next=p;p-prev=q;printf(“请输入运算符号 :n“);scanf(“%s“,c);*c=*c=+?0:1;printf(“请输入第二个数字 :n“);scanf(“%s“,num2+1);q=p;f=0;if(!*c) /
9、+for(i=strlen(num2);i=0;-i)if(num2i=,)num2i=0;if(q-next=p)q-next=(node*)malloc(sizeof(node);q-next-next=p;q-next-prev=q;q-next-n=0;p-prev=q-next;q=q-next;q-n+=(conv(num2+i+1)+f);if(q-nn-=10000;if(f)if(q-next=p)q-next=(node*)malloc(sizeof(node);q-next-next=p;q-next-prev=q;q-next-n=1;elsewhile(q-next!
10、=p)q=q-next;q-n+=1;if(q-nn=0;f=1;if(f)q-next=(node*)malloc(sizeof(node);q-next-next=p;q-next-prev=q;q-next-n=1;printf(“%d,“,p-prev-n);for(q=p-prev-prev;q!=p;q=q-prev)printf(“%04d,“,q-n);else /-for(i=strlen(num2);i=0;-i)if(num2i=,)num2i=0;if(q-next=p)q-next=(node*)malloc(sizeof(node);q-next-next=p;q-
11、next-prev=q;q-next-n=0;p-prev=q-next;q=q-next;q-n-=(conv(num2+i+1)+f);if(q-n=0)f=0;elsef=1;q-n+=10000;if(f)if(q-next=p)q-n-=10000;elsewhile(q-next!=p)q=q-next;q-n-=1;if(q-n=0)f=0;break;elseq-n+=10000;f=1;if(f)q-n-=10000;printf(“%d,“,p-prev-n);for(q=p-prev-prev;q!=p;q=q-prev)printf(“%04d,“,q-n);retur
12、n 0;3.4 程序运行结果4 学生成绩管理系统4.1 需求分析现有学生成绩信息文件 1(1.txt) ,内容如下(数据可以自拟)姓名 学号 语文 数学 英语 张明明 01 67 78 82李成友 02 78 91 88张辉灿 03 68 82 56王露 04 56 45 77陈东明 05 67 38 47. 学生成绩信息文件 2(2.txt),内容如下:姓名 学号 语文 数学 英语 陈果 31 57 68 82李华明 32 88 90 68张明东 33 48 42 56李明国 34 50 45 87陈道亮 35 47 58 77. 试编写一管理系统,要求如下:1) 实现对两个文件数据进行合并
13、,生成新文件 3.txt2) 抽取出三科成绩中有补考的学生并保存在一个新文件 4.txt3) 对合并后的文件 3.txt 中的数据按总分降序排序(至少采用两种排序方法实现)4) 输入一个学生姓名后, 能查找到此学生的信息并输出结果(至少采用两种查找方法实现)5) 要求使用结构体,链或数组等实现上述要求。4.2 程序设计思想建立学生信息保存在文本文档中,具体对学生信息进行插入删除查询操作时,将保存在文本文档中的学生信息提取出来保存在自己定义的数据结构中,然后再对该数据结构进行操作,所有操作完成后或者在相应的命令后再将学生信息保存到文本文档中。数据类型主要是char、int、float 等数据类型
14、,内容包括学号、姓名等数据。4.3 程序源代码#include#include#includeusing namespace std;char top50; /成绩文件顶部的标题用 top 保存typedef struct student /单个学生成绩的记录char name10; /姓名int number; /学号int chinese; /语文int math; /数学int english; /英语struct student *next;student,*gradelist;gradelist fileread(char *adress) /读取成绩文件FILE * fp;if(f
15、p=fopen(adress,“r“)=NULL) /打开文件printf(“文件打开出错 “);exit(0);gradelist file=(student *)malloc(sizeof(student); /申请空间file-next=NULL; student * p=file; /操作指针int n=0; /循环标记,具体作用是在第一次循环时方便处理标题while(!feof(fp) if(n=0) fgets(top,50,fp); /处理标题,并且文件指针移到第二行if(n=1) /申请空间p-next=(student *)malloc(sizeof(student);p=p
16、-next;p-next=NULL;fscanf(fp,“%s%d%d%d%d“,p-name, /将文件的数据输入到链表中n=1;if(fclose(fp)/关闭文件printf(“文件关闭失败 “);exit(0);return file;void FilePrint(gradelist file)/将成绩文件打印到屏幕上student *p=file;printf(“%sn“,top); /打印标题while(p-next!=NULL) printf(“%6s %2d %d %d %dn“,p-name,p-number,p-chinese,p-math,p-english); /循环打
17、印p=p-next;void merger() /合并文件char * address1=“F:/1.txt“,*address2=“F:/2.txt“,*address3=“F:/3.txt“;gradelist file1=fileread(address1),file2=fileread(address2);FILE *fp;if(fp=fopen(“F:3.txt“,“w+“)=NULL) /先新建一个 3.txt,然后将 1.txt 和 2.txt 的内容输入到里面printf(“合并成绩文档失败,原因:建立文档出错“);exit(0);student *p1=file1,*p2=f
18、ile2;fprintf(fp,“%s“,top); /先输入标题while(p1-next!=NULL) fprintf(fp,“%6s %2d %d %d %dn“,p1-name,p1-number,p1-chinese,p1-math,p1-english); /输入 1.txtp1=p1-next;while(p2-next!=NULL) fprintf(fp,“%6s %2d %d %d %dn“,p2-name,p2-number,p2-chinese,p2-math,p2-english); /输入 2.txtp2=p2-next;if(fclose(fp) printf(“文
19、件关闭失败 “);exit(0);void extract() /抽取补考的成绩记录char * address4=“F:/4.txt“,*address3=“F:/3.txt“;FILE *fp;if(fp=fopen(“F:/4.txt“,“w+“)=NULL) /新建文件 4.txtprintf(“抽取补考学生成绩记录建立新文件失败“);exit(0);gradelist file3=fileread(address3);student *p=file3;fprintf(fp,“%s“,top); /先输入标题while(p-next!=NULL) if(p-chinese)math)e
20、nglish)name,p-number,p-chinese,p-math,p-english);p=p-next;if(fclose(fp) printf(“文件关闭失败 “);exit(0);void sort(int i) char * address3=“F:/3.txt“;gradelist file3=fileread(address3); /先将 3.txt 读入链表student *p=file3;if(remove(“F:/3.txt“) /由于排序后的内容也要保存到 3.txt,故删除 3.txtprintf(“删除文件出错 “);exit(0);int n=0; /学生个
21、数FILE *fp;if(fp=fopen(“F:/3.txt“,“w+“)=NULL) /新建一个空的 3.txtprintf(“新建文件出错 “);exit(0);fprintf(fp,“%s“,top); /标题先输入while(p-next!=NULL) n+;p=p-next;typedef structint totalgrade;char name10;int number;int chinese;int math;int english;gradenote; /成绩记录typedef struct gradenote r100; /只初始化了 100 了空间,学生人数超过100
22、 就不能了,懒得动态分配了grade_list; /待排序成绩表grade_list L;p=file3;int t,k,j,k1,j1;for(t=1;tnext) /将链表的内容复制到结构数组里strcpy(L.rt.name,p-name);L.rt.number=p-number;L.rt.chinese=p-chinese;L.rt.math=p-math;L.rt.english=p-english;L.rt.totalgrade=p-chinese+p-math+p-english;if(i=1) /直接插入排序for(k=2;k=high+1;-j1)L.rj1+1=L.rj1
23、;L.rhigh+1=L.r0;int q;for(q=n;q=1;q-)/将排序好的内容输入到 3.txtfprintf(fp,“%6s %2d %d %d %dn“,L.rq.name,L.rq.number,L.rq.chinese,L.rq.math,L.rq.english);if(fclose(fp) printf(“文件关闭失败 “);exit(0);void search(char *name) /按姓名查找gradelist file=fileread(“F:/3.txt“);student * p=file;while(p-next!=NULL) if(strcmp(nam
24、e,p-name)=0) printf(“%6s %2d %d %d %dn“,p-name,p-number,p-chinese,p-math,p-english);return;p=p-next;printf(“查无此人, 请确定名字输入正确n“);exit(0);void main(void)int chioce;gradelist file1=fileread(“F:/1.txt“),file2=fileread(“F:/2.txt“);printf(“现有成绩记录文件 1n“);printf(“*n“);FilePrint(file1);printf(“*n“);printf(“现有
25、成绩记录文件 2n“);printf(“*n“);FilePrint(file2);printf(“*n“);printf(“第一步,合并成绩记录文件 n“);merger();printf(“合并成功n“);system(“PAUSE“);printf(“现有合并后的成绩记录文件 3n“);printf(“*n“);gradelist file3=fileread(“F:/3.txt“);FilePrint(file3);printf(“*n“);printf(“第二步,抽取补考成绩记录 n“);extract();system(“PAUSE“);printf(“现有补考成绩记录文件 4n“
26、);printf(“*n“);gradelist file4=fileread(“F:/4.txt“);FilePrint(file4);printf(“*n“);printf(“第三步,对文件 3 进行排序n“);printf(“请输入排序方式 (1/2)n1:直接插入排序n2:折半插入排序n“);scanf(“%d“,if(chioce=1) sort(1);else if(chioce=2) sort(2);else printf(“输入不合理 ,程序默认采用 1 方式n“);sort(1);file3=fileread(“F:/3.txt“);printf(“现有按总分降序的成绩记录
27、3n“);printf(“*n“);FilePrint(file3);printf(“*n“);printf(“第四步,查找学生信息 n“);char name100;printf(“请输入学生姓名 n“);scanf(“%s“,name);search(name);printf(“按任意键结束程序 n“);getchar();4.4 程序运行结果5 哈夫曼编码应用5.1 需求分析问题要求:找一篇英文文章,统计出每个字符出现的次数,然后以他们为权值,对每个字符进行编码,编码完成后对其编码进行译码。要求: a) 输入一篇英文文章,根据字符出现的次数给出哈夫曼编码方式。 b) 对英文文章进行编码;
28、 c) 对编码进行译码核对正确性d) 采用哈夫曼编码的思想,实现该文件的压缩和恢复功能,并提供压缩前后的占用空间之比。5.2 程序设计思想初始化:程序自动统计文章中的字符出现次数并赋予权值. 编制哈夫曼码:根据权值选出两个权值最小值最为叶节点,其权值之和为根节点,哈弗曼树从叶到根总体按照小到大原则生长,最终实现哈弗曼树.编码:输入字符,输出哈夫曼码. 译码:输入哈夫曼,输出字符代码. 退出:结束进程,退出程序.5.3 程序源代码#include #include “5_1.h“using namespace std;int main()cout #include #include #inclu
29、de “malloc.h“#include using namespace std;#define TURE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -1#define INF 32767const int MAXVEX=100;typedef char Vextype;typedef structVextype vexsMAXVEXMAXVEX; /单位名称(顶点信息) ;int adjMAXVEXMAXVEX; /单位之间的相通情况(是否有边) ;int disMAXVEXMAXVEX; /单位间距离(边的长度
30、) ;int fMAXVEX; /各单位去超市的频率;int n; /顶点数和边数;int e;Mgraph;void CreatMgraph(Mgraph *G) int i,j,k;printf(“请输入单位个数:n“);scanf(“%d“,printf(“请输入单位间的路径数:n“);scanf(“%d“,printf(“请输入单位名称:n“);for(i=0;in;i+)printf(“请输入第%d 个单位名称:n“,i);scanf(“%s“,for(i=0;in;i+) /结构体的初始化;for(j=0;jn;j+)G-adjij=0;G-disij=0;G-fi=0;for(k
31、=0;ke;k+)printf(“请输入相通的两单位 (输入格式:i,j):n“);scanf(“%d,%d“,/在距离上体现为无向;printf(“请输入相同两个单位间的距离( 格式: dis):n“);scanf(“%d“,G-adjij=1;G-adjji=1;G-disji=G-disij;for(k=0;kn;k+)printf(“请输入第%d 个单位去超市的相对频率:n“,k);scanf(“%d“,for(i=0;in;i+) /以距离和频率之积作为权值;for(j=0;jn;j+)G-disij*=G-fi; /最终权值非完全无向; if(G-adjij=0void Floye
32、d(Mgraph *G) /带权有向图求最短路径floyd 算法int AMAXVEXMAXVEX,pathMAXVEXMAXVEX;int i,j,k,pre;int countMAXVEX;for(i=0;in;i+) /初始化 A和path数组for(j=0;jn;j+) /置初值;Aij=G-disij;pathij=-1;counti=0;for(k=0;kn;k+) /k 代表运算步骤for(i=0;in;i+)for(j=0;jn;j+)if(Aij(Aik+Akj) /从 i 经 j 到 k 的一条路径更短Aij=Aik+Akj;pathij=k;coutn;i+)for(j=
33、0;jn;j+)if(i!=j)cout“n;i+)for(j=0;jn;j+)if(Aij=INF)counti=0;elsecounti=1;for(i=0;in;i+)if(counti)for(j=0;jn;j+)Ai0+=Aij;for(i=0;in;i+)k=0;if(counti)if(Ak0Ai0)k=i;coutvexsk#include #include #include “SeqList.cpp“using namespace std;class Studentpublic:string num; /学号string name; /姓名string sex; /性别string born; /出生日期string p; /政治面貌string addr; /住址;/ 学籍管理类定义class gxxjglpublic:gxxjgl() gxxjgl() void Insert();void Delete1();void Update();int Locate();void Display(); private:SeqList stu; void Info(int i);void gxxjgl:Insert()