数据结构课程实验报告.docx

上传人:b****7 文档编号:9035583 上传时间:2023-02-02 格式:DOCX 页数:24 大小:115.33KB
下载 相关 举报
数据结构课程实验报告.docx_第1页
第1页 / 共24页
数据结构课程实验报告.docx_第2页
第2页 / 共24页
数据结构课程实验报告.docx_第3页
第3页 / 共24页
数据结构课程实验报告.docx_第4页
第4页 / 共24页
数据结构课程实验报告.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

数据结构课程实验报告.docx

《数据结构课程实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构课程实验报告.docx(24页珍藏版)》请在冰豆网上搜索。

数据结构课程实验报告.docx

数据结构课程实验报告

实验报告

专业班级:

08级管理科学一班

小组成员:

吴蓓蕾裴倩茹

白雪贾真真

完成日期:

2010年7月7日

小组分工情况

题目一:

基础题

完成人员:

白雪

题目二:

应用题

完成人员:

吴蓓蕾

题目三:

综合题

完成人员:

裴倩茹

题目四:

拓展题

完成人员:

贾真真吴蓓蕾

短学期小结

完成人员:

白雪

题目一

基本题:

数制的转换(十进制到m进制转换)

1解题思路(较详细说明)

十进制转化即为栈的应用。

首先定义栈的结构体,入栈函数,出栈函数。

再添加转换函数。

转换函数思路:

用栈暂存低位值(n/m循环取余,依次压入栈中,直到余数为0时,循环终止。

最后,将余数逆序输出,即出栈。

2、函数调用图及各函数的功能(简要说明)函数中用到三个函数:

conversion函数,pop函数,push函数

Conversion函数为将十进制数n转化为m进制

Pop函数为出栈函数

Push函数为入栈函数;

函数调用图

Main函数

Conversion函数

 

Pop函数

Push函数

3、三组测试数据(原始数据,预期结果,实际结果)第一组数据

原始数据:

取10,2

预期结果:

1010

实际结果:

第二组数据

原始数据;取15,2

预期结果:

1111实际结果:

 

第三组数据

原始数据:

64,8

预期结果:

100

实际结果:

4、含注释的源程序(说明主要变量的作用,函数段的功能)

#inelude

#include

#includestructLstack{

intdata;

structLstack*next;};

//定义链栈的结构体

structLstack*push(structLstack*top,intk){

structLstack*p;

p=(structLstack*)malloc(sizeof(structLstack));p->data=k;

p_>next=top;top=p;

returntop;

}

//定义入栈函数

//新分配一个空间

〃栈顶top指针上移

structLstack*pop(structLstack*top){intx;

〃定义出栈函数

 

x=top->data;printf("%d",x);top=top->next;

〃数据输出

//栈顶top指针下移

}

returntop;

}

voidconversion(intn,intm){

structLstack*s=NULL;

while(n){s=push(s,n%m);n=n/m;}

while(s!

=NULL)s=pop(s);

}

voidmain(){

intn,m;

printf("Input十进制数,转换进制数:

”);

scanf("%d",&n);scanf("%d",&m);

conversion(n,m);

printf("\n");

}

5、编译与运行情况(存在的问题)

#include

#include添加语句

#include

structLstack{

intdata;

structLstack*next;

};

〃十进制数n与m进制数的转换

structLstack*push(structLstack*top,intk){

structLstack*p;

p=(structLstack*)malloc(sizeof(structLstack));p->data=k;

p_>next=top;top=p;

returntop;

}

未对malloc进行定义,不能应用。

structLstack*pop(structLstack*top){intx;

while(top!

=NULL){

x=top->data;printf("%d",x);

top=top->next;

}

returntop;

 

voidconversion(intn,intm){

structLstack*s=NULL;

while(n){s=push(s,n%m);n=n/m;}

while(s!

=NULL)s=pop(s);

}

voidmain(){

intn,m;

printf("Input十进制数,转换进制数:

”);

scanf("%d",&n);scanf("%d",&m);

conversion(n,m);

printf("\n");

}

题目二

并去掉重复元素

应用题:

将两个有序线性表合并成一个有序线性表,

1解题思路(较详细说明)

算法分析

算法主要包括:

搜索、比较、插入三个操作。

搜索:

需要两个指针搜索两个链表;

ASCII值的比较);

比较:

比较结点数据域中数据的大小(实际上是

插入:

将两个结点中数据小的结点插入新链表

2、函数调用图及各函数的功能(简要说明)

该程序用到了三个函数:

CreateListR函数:

功能:

建立链表

MergeList函数:

功能:

合并链表

PrintList函数:

功能:

输出链表

函数调用图:

3、三组测试数据(原始数据,预期结果,实际结果)

第一组数据测试:

实际结果:

原始数据:

1564828379预期结果:

123456789

第二组数据测试:

实际结果:

原始数据:

14582349预期结果:

1234589

 

第三组数据测试:

原始数据:

15682349预期结果:

12345689

实际结果:

]c、*C:

\DOCUBEUTSANDSETTIFGSX日

-||

I1&68讪轴轆*10

SET:

2349

12345689

ant/k住ycontinue

d

HI1

 

 

第四组数据测试:

实际结果:

 

4、含注释的源程序(说明主要变量的作用,函数段的功能)

#include

#inelude

#include

typedefstructLnode{〃结构体定义

chardata;//数据域

structLnode*next;〃指针域

}ListNode;

ListNode*CreateListR(){//尾插法建立链表

charch;ListNode*head,*s,*r;

head=r=NULL;

while((ch=getchar())!

='\n'){

s=(ListNode*)malloc(sizeof(ListNode));

s->data=ch;s->next=NULL;

if(head==NULL)head=s;

elser->next=s;

r=s;

returnhead;

structLnode*MergeList(structLnode*ha,structLnode*hb){〃合并链表

structLnode*pa=ha,*pb=hb,*hc=NULL,*r=hc;〃两个指针pb,pc从两个链表

ha,hb的表头开始搜索,指针r指向新链表hc的头

while(pa&&pb){//两个链表都不为空时

if(pa->data<=pb->data){

if(hc==NULL)hc=pa;

elser->next=pa;

r=pa;pa=pa->next;}〃将较小的结点插入新链表

else{if(hc==NULL)hc=pb;

elser->next=pb;

r=pb;pb=pb->next;}

}

if(hc!

=NULL)r->next=pa?

pa:

pb;

elsehc=pa?

pa:

pb;

returnhc;}

//打印合并后链表

//当p指向的非空时

//取出数据域中的值,并输出

PrintList(structLnode*c){

structLnode*p;

p=c;

while(p!

=NULL)

{

printf("%c",p->data);p=p->next;

}

printf("\n");

}

main()//主程序

{

structLnode*a,*b,*c;

a=CreateListR();//建立链表

b=CreateListR();

c=MergeList(a,b);〃合并链表

PrintList(c);//输出链表

5、编译与运行情况(存在的问题)第一组数据中:

运行时输出的是没有意义的字符

原程序部分代码:

PrintList(structLnode*c){II打印合并后链表structLnode*p;

p=c->next;修改:

p=c;//原因:

merge函数建立的是没有空头结点的链表

while(p!

二NULL){

printf("%d",p->data):

修改:

%c//原因:

结构体定

义数据类型为字符型

p=p->next;}

printf("\n");}

第二组数据中:

运行输出的字符串并没有按从小到达的顺序排列。

原因:

建立链表的时候采用的是头插法,与合并函数取较小结点插入新链表的思想有冲突,故修改时改为尾插法建立链表。

题目四

扩展题:

学生成绩管理系统

1解题思路(较详细说明)

利用结构体定义及c语言知识将学生成绩这一实体转化为数组类型的记录,其中包括学生

学号、姓名、分数三类数据项,利用记录中的关键字,通过输入、显示、排序、插入、删除、

查询、统计等函数对学生数据结构课程的成绩进行管理分析。

2、函数调用图及各函数的功能(简要说明)

函数调用图:

Input()

Display()

Sort_by_num()

Main()

1

F

menu_select()

Insert_a_record()

Statistic。

Query_a_record()

Delete_a_record()

 

功能:

提供交互界面,供用户选择该系统的各个功能和选项。

功能:

交互输入若干条记录、信息。

功能:

显示所有输入的符合定义的记录。

功能:

交互式插入一条记录,再利用冒泡排序法对记录进行排序

Delete_a_record()

功能:

按姓名进行交互式查找,删除一条查找到的记录

Query_a_record()

功能:

按姓名进行交互式输入,查找并显示一个记录

 

Statistic()功能:

新增功能,输出统计信息

3、程序运行演示及检验

(1)在“菜单”中选择Inputrecords,输入四条记录

(2)选择DisplayAllRrcords,显示输入的记录

(3)选择Sort,显示排序成功

 

选择DisplayAllRrcords,查看排序后的结果

(4)选择InsertaRecords输入需要插入的记录

 

选择DisplayAllRrcords,查看输入的记录

(5)选择DeleteaRecord输入删除记录中的学生姓名

 

删除后的结果

(6)选择Query,输入所要查询记录中学生的姓名,显示出查询结果

 

(7)选择Statistic,显示所有的记录数量、最高分者的记录、最低分

者的记录和平均分

(8)选择Quit,结束程序

 

4、含注释的源程序(说明主要变量的作用,函数段的功能)

#include/*引用库函数*/

#include

#include

#include

typedefstruct/*定义结构体数组*/

{

charnum[10];/*学号*/

charname[20];/*姓名*/

intscore;/*成绩*/

}Student;

Studentstu[80];/*结构体数组变量*/

intmenu_select()/*菜单函数*/

{

charc;

do{

printf("\t**Students'GradeofDataStrutureCourseManagementSystem**\n");/*菜单选择*/

printf("\t|1.1nputRecords|\n");

printf("\t|2.DisplayAllRecords|\n");

printf("\t|3.Sort|\n”);

printf("\t|4.InsertaRecord|\n");

printf("\t|5.DeleteaRecord|\n");

printf("\t|6.Query|\n");

printf("\t|7.Statistic|\n");

printf("\t|0.Quit|\n");

printf("\t*

**************************************

**\n");

printf("\t\tGiveyourChoice(0-7):

");c=getchar();/*读入选择*/}while(c<'0'||c>'7');

return(c-'O');/*返回选择*/}

intInput(Studentstud[],intn)/*输入若干条记录*/{inti=0;

charsign,x[10];/*x[10]为清除多余的数据所用*/while(sign!

='n'&&sign!

='N')/*判断*/

{printf("\t\t\tstudent'snum:

");/*交互输入*/

scanf("\t\t\t%s",stud[n+i].num);

printf("\t\t\tstudent'sname:

");

scanf("\t\t\t%s",stud[n+i].name);

printf("\t\t\tstudent'sscore:

");

scanf("\t\t\t%d",&stud[n+i].score);gets(x);/*清除多余的输入*/printf("\t\t\tanymorerecords?

(Y/N)");scanf("\t\t\t%c",&sign);/*输入判断*/i++;

}

return(n+i);

}

voidDisplay(Studentstud[],intn)/*显示所有记录*/

{inti;

printf("\t\t\t\n");/*格式头*/

printf("\t\t\tnumbernamescore\n");

printf("\t\t\t\n");

for(i=1;i

{printf("\t\t\t%-8s%-6s%d\n",stud[i-1].num,stud[i-1].name,stud[i-1].score);

if(i>1&&i%10==0)/*每十个暂停*/

{printf("\t\t\t\n");/*格式*/

printf("\t\t\t");

system("pause");

printf("\t\t\t\n");

}

}

printf("\t\t\t");

system("pause");

}

voidSort_by_num(Studentstud[],intn)/*按学号排序*/

{inti,j,*p,*q,s;

chart[10];

for(i=0;i

for(j=0;j

if(strcmp(stud[j].num,stud[j+1].num)>0)

{strcpy(t,stud[j+1].num);

strcpy(stud[j+1].num,stud[j].num);

strcpy(stud[j].num,t);

strcpy(t,stud[j+1].name);

strcpy(stud[j+1].name,stud[j].name);

strcpy(stud[j].name,t);

p=&stud[j+1].score;

q=&stud[j].score;

s=*p;

*p=*q;

*q=s;

}

}

intInsert_a_record(Studentstud[],intn)/*插入一条记录*/

{charx[10];/*清除多余输入所用*/

printf("\t\t\tstudent'snum:

");/*交互式输入*/

scanf("\t\t\t%s",stud[n].num);

printf("\t\t\tstudent'sname:

");

scanf("\t\t\t%s",stud[n].name);

printf("\t\t\tstudent'sscore:

");

scanf("\t\t\t%d",&stud[n].score);

gets(x);

n++;

Sort_by_num(stud,n);/*调用排序函数*/

printf("\t\t\tInsertSuccessed!

\n");/*返回成功信息*/

return(n);

}

intDelete_a_record(Studentstud[],intn)/*按姓名查找,删除一条记录*/

{chars[20];

inti=0,j;

printf("\t\t\ttellmehis(her)name:

");/*交互式问寻*/

scanf("%s",s);

while(strcmp(stud[i].name,s)!

=0&&i

if(i==n)

{printf("\t\t\tnotfind!

\n");/*返回失败信息*/

return(n);

}

for(j=i;j

{

strcpy(stud[j].num,stud[j+1].num);

strcpy(stud[j].name,stud[j+1].name);

stud[j].score=stud[j+1].score;

}

printf("\t\t\tDeleteSuccessed!

\n");/*返回成功信息*/

return(n-1);

}

voidQuery_a_record(Studentstud[],intn)/*查找并显示一个记录*/

{chars[20];

inti=0;

printf("\t\t\tinputhis(her)name:

");/*交互式输入*/

scanf("\t\t\t%s",s);

while(strcmp(stud[i].name,s)!

=0&&i

if(i==n)

{printf("\t\t\tnotfind!

\n");/*输入失败信息*/

return;

}

printf("\t\t\this(her)number:

%s\n",stud[i].num);/*输出该学生信息*/

printf("\t\t\this(her)score:

%d\n",stud[i].score);

}

voidStatistic(Studentstud[],intn)/*新增功能,输出统计信息*/

{inti,j=0,k=0,sum=0;

floataver;/*成绩平均值*/

for(i=0;i

{

sum+=stud[i].score;

if(stud[j].score>stud[i].score)j=i;

if(stud[k].score

}

aver=1.0*sum/n;

printf("\t\t\tthereare%drecords.\n",n);/*总共记录数*/

printf("\t\t\tthehignestscore:

\n");/*最高分*/

printf("\t\t\tnumber:

%sname:

%sscore:

%d\n",stud[j].num,stud[j].name,stud[j].score);

printf("\t\t\tthelowestscore:

\n");/*最低分*/

printf("\t\t\tnumber:

%sname:

%sscore:

%d\n",stud[k].num,stud[k].name,stud[k].score);

printf("\t\t\ttheaveragescoreis%5.2f\n",aver);/*平均分*/

}

voidmain()/*主函数*/

{

intn=0;

for(;;)

{

switch(menu_select())/*选择判断*/

{

case1:

printf("\t\t\tInputRecords'n");/*输入若干条记录*/

n=Input(stu,n);

break;

case2:

printf("\t\t\tDisplayAllRecords'n");/*显示所有记录*/

Display(stu,n);

break;

case3:

printf("\t\t\tSort\n");

Sort_by_num(stu,n);/*按学号排序*/

printf("\t\t\tSortSuceessed!

\n");

printf("\t\t\t");

system("pause");

break;

case4:

printf("\t\t\tInsertaRecord\n");

n=lnsert_a_record(stu,n);/*插入一条记录*/

printf("\t\t\t");

system("pause");

break;

case5:

printf("\t\t\tDeleteaRecord\n");

n=Delete_a_record(stu,n);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 法语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1