数据结构实验报告报告+C语言源代码.docx

上传人:b****5 文档编号:7652436 上传时间:2023-01-25 格式:DOCX 页数:24 大小:360.45KB
下载 相关 举报
数据结构实验报告报告+C语言源代码.docx_第1页
第1页 / 共24页
数据结构实验报告报告+C语言源代码.docx_第2页
第2页 / 共24页
数据结构实验报告报告+C语言源代码.docx_第3页
第3页 / 共24页
数据结构实验报告报告+C语言源代码.docx_第4页
第4页 / 共24页
数据结构实验报告报告+C语言源代码.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

数据结构实验报告报告+C语言源代码.docx

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

数据结构实验报告报告+C语言源代码.docx

数据结构实验报告报告+C语言源代码

目录

前言2

概要设计3

1.1数据结构设计3

2.1算法设计3

2.1.1建立链表的算法3

2.1.2链表插入一个元素的算法3

2.1.3链表删除一个元素的算法3

3.1ADT描述4

4.1详细设计……………………………………………………………………………4

4.1.1数据存储结构………………………………………………………………4.

4.1.2主要伪代码…………………………………………………………………4

软件测试7

心得体会11

源代码12

参考文献………………………………………………………………………...21

前言

数据结构是计算机程序设计的重要理论技术基础,它不仅是计算机学科的核心课程,而且已经成为其他理工专业的热门选修课。

随着计算机科学的技术和发展,计算机的功能和运算速度不断地提高,其应用于信息处理的范围日益扩大。

与之相应的,计算机的加工处理对象也从简单的数据发展到一般的符号,进而发展到更复杂的数据结构。

数据结构是计算机程序设计的重要理论技术基础,数据结构的表示和操作都涉及到算法,如何描述数据的结构和讨论有关的算法,又涉及到程序设计语言。

因此,它不仅是计算机学科的核心课程,而且已经成为其他理工专业的热门选修课。

我们通过对这门基础课程的学习,要学会分析研究计算机加工的数据结构的特性,以便为应用涉及的数据选择适合的逻辑结构,储存结构及其相应的算法,并初步掌握算法时间分析和空间分析的技术。

通过实际操作去了解数据结构原理,练习编写代码的能力,以及抽象能力。

从课程性质上讲,“数据结构”是一门专业技术基础课。

它的要求是学会分析研究计算机加工的数据结构的特性,以便为应用涉及的数据选择适当的逻辑结构,存储结构及相应的算法,并初步掌握算法的时间分析和空间分析的技术。

另一方面,数据结构的学习过程也是复杂程序设计的训练过程,要求编写的程序结构清楚和正确易读,符合软件工程的规范。

概要设计

1.1数据结构设计

采用链式储存结构。

typedefstructLNode{

ElemTypedata;

structLNode*next;

}LNode,*LinkList;

2.1算法设计

2.1.1建立链表的算法

(1)算法思想分析

首先从表尾到表头逆向建立单链表,然后再建立的单链表基础上进行对链表上的元素进行查询,删除,插入的操作。

(2)要点描述

首先建立一个带头结点的单链表,通过申请内存,先建立一个空链表。

然后结点的插入,建立一个有多个结点的链表。

在进行查询等操作。

(3)时间和空间复杂度分析

程序的时间复杂度为O(n)。

2.1.2链表插入一个元素的算法

(1)算法思想分析

要生成一个新数据域为X的结点,然后插入在单链表中。

(2)要点描述

在链表中插入结点只需要修改指针。

若要在第i个结点之前插入元素,修改的是第i-1个结点的指针。

(3)时间和空间复杂度分析

时间复杂度O(n)

2.1.3链表删除一个元素的算法

(1)算法思想分析

要删除一个结点,必须修改指针并且释放空间。

(2)要点描述

找到线性表中第i-1个结点,修改其指向后继的指针。

(3)时间和空间复杂度分析

时间复杂度O(n)

3.1ADT描述

ADTLinkList{

数据对象:

D={e|e∈LNode}

数据关系:

R1={|e∈LNode,e>0}

基本操作:

GreateList_L(&L,n)

操作结果:

构造了一个长为n的数据链表

ListDelete_L(&L,i,&e)

初始条件:

链表L已存在而且非空

操作结果:

删除L的第i个数据,并且用e返回其值

ListInsert_L(&L,i,e)

初始条件:

链表L已存在

操作结果:

在L的第i个位置插入数据e

GetElem(L,i,e)

初始条件:

链表L已存在

操作结果:

用e返回L中的第i个数据

}ADTLinkList

 

4.1详细设计

4.1.1数据存储结构设计

采用单链式线性表实现

4.1.2主要伪代码

StatusGetElem(LinkListL,inti,ElemType*e)

{

intj=0;

intd;

LinkListp=L;

while(p&&j

{

p=p->next;

j++;

}

if(!

p||j>i)

returnERROR;

printf("您要查询的元素是:

\n");

d=p->data;

printf("%d",d);

printf("\n");

}

 

voidInitList(LinkList*L)

{

*L=(LinkList)malloc(sizeof(structLNode));

if(!

*L)

exit(OVERFLOW);

(*L)->next=NULL;

}

 

StatusListInsert(LinkListL,inti,ElemTypee)

{

intj=0;

LinkListp=L,s;

while(p&&j

{

p=p->next;

j++;

}

if(!

p||j>i-1)

returnERROR;

s=(LinkList)malloc(sizeof(structLNode));

s->data=e;

s->next=p->next;

p->next=s;

returnOK;

}

 

StatusListDelete(LinkListL,inti,ElemType*e)

{

intj=0;

LinkListp=L,q;

while(p->next&&j

{

p=p->next;

j++;

}

if(!

p->next||j>i-1)

returnERROR;

q=p->next;

p->next=q->next;

*e=q->data;

free(q);

returnOK;

}

 

voidListTraverse(LinkListL,void(*vi)(ElemType))

{

LinkListp=L->next;

while(p)

{

vi(p->data);

p=p->next;

}

printf("\n");

}

 

voidListPrint(LinkListL)

{

LinkListp=L->next;

while(p)

{

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

p=p->next;

}

printf("\n");

}

voidprintInt(intdata)

{

printf("%d",data);

}

.

 

软件测试

图一(主界面)

图二(插入学生信息)

图三(显示所有学生信息)

图四(查询个人信息)

图五(统计信息)

图六(修改信息)

图七(保存数据)

图八(删除信息)

心得体会

通过本程序的设计,我对数据结构作了以下总结:

要解决一道程序题必须先要认真捕捉改程序中的有用信息,找出解决方法。

先规划好,程序需要什么样的数据结构,什么函数,对程序有什么要求。

然后从整体把握对程序设计进行分工,相应地把程序分成若干模块,具体实现各部分实行相应的功能。

一个程序要顺利地进行设计,一是要对程序的功能有全面的了解,如果漏了某些部分,都会使得这个程序调试不出来或者是令该程序没有达到预想的效果。

其次,在程序的编译中,必须注重程序设计过程中的细节,像单链表的程序,就要理解链表的概念,理解链表的数据特点,要清楚知道数据域和指针域的作用,否则,很容易会浪费大量时间在检测错误上面。

要说到解题的思考方向,如果要总结成规律,我认为要灵活的进行方法的设计,通过不同的方法来实现不同的功能,如通过结点的插入来实现链表的创建。

同时应该注意各种语句的选择,要先预想好需要什么样的语句来实现函数定义,尽量简单快捷地完成,避免出错。

要规范面向对象程序设计师的书写协管,在这次课程设计中,我们再次感受到,规范的程序书写,可以更好的进行后期的差错补漏。

还应该注意各种面向对象语言语法的运用,例如继承的方法,都要严格按照语法来进行,否则很容易就会出现错误,甚至严重影响课程设计的进度。

 

源代码

#include"stdio.h"

#include"stdlib.h"

#include"string.h"

intshoudsave=0;//

structstudent

{

charnum[10];//学号

charname[20];

charsex[4];

intcgrade;

intmgrade;

integrade;

inttotle;

intave;

charneartime[10];//最近更新时间

};

typedefstructnode

{

structstudentdata;

structnode*next;

}Node,*Link;

intmenu()

{

charm[3];

intn;

printf("************************欢迎进入学生成绩管理系统******************************\n\n");

printf("\t欢迎使用本学生管理系统,本系统将为您提供历史学生信息查询,学生成绩信息管理功能。

\n");

printf("********************************************************************************");

printf("\t1输入学生资料\t\t\t\t\t2删除学生资料\n");

printf("\t3查询学生资料\t\t\t\t\t4修改学生资料\n");

printf("\t5显示学生资料\t\t\t\t\t6统计学生成绩\n");

printf("\t7保存学生资料\n");

printf("\t\tpleasechooseaoperation(1-7):

\n");

printf("********************************************************************************\n");

scanf("%s",m);

n=atoi(m);

return(n);

}

voidprintstart()

{

printf("-----------------------------------------------------------------------\n");

}

voidWrong()

{

printf("\n=====>提示:

输入错误!

\n");

}

voidNofind()

{

printf("\n=====>提示:

没有找到该学生!

\n");

}

voidprintc()//本函数用于输出中文

{

printf("学号\t姓名性别英语成绩数据库成绩数据结构成绩总分平均分\n");

}

voidprinte(Node*p)//本函数用于输出英文

{

printf("%-12s%s\t\t%s\t%d\t\t%d\t%d\t%d\t%d\n",p->data.num,p->data.name,p->data.sex,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data.totle,p->data.ave);

}

Node*Locate(Linkl,charfindmess[],charnameornum[])//该函数用于定位连表中符合要求的接点,并返回该指针

{

Node*r;

if(strcmp(nameornum,"num")==0)//按学号查询

{

r=l->next;

while(r!

=NULL)

{

if(strcmp(r->data.num,findmess)==0)

returnr;

r=r->next;

}

}

elseif(strcmp(nameornum,"name")==0)//按姓名查询

{

r=l->next;

while(r!

=NULL)

{

if(strcmp(r->data.name,findmess)==0)

returnr;

r=r->next;

}

}

return0;

}

voidAdd(Linkl)//增加学生

{

Node*p,*r,*s;

charnum[10];

r=l;

s=l->next;

while(r->next!

=NULL)

r=r->next;//将指针置于最末尾

while

(1)

{

printf("请你输入学号(以'0'返回上一级菜单:

)");

scanf("%s",num);

if(strcmp(num,"0")==0)

break;

while(s)

{

if(strcmp(s->data.num,num)==0)

{

printf("=====>提示:

学号为'%s'的学生已经存在,若要修改请你选择'4修改'!

\n",num);

printstart();

printc();

printe(s);

printstart();

printf("\n");

return;

}

s=s->next;

}

p=(Node*)malloc(sizeof(Node));

strcpy(p->data.num,num);

printf("请你输入姓名:

");

scanf("%s",p->data.name);

getchar();

printf("请你输入性别:

");

scanf("%s",p->data.sex);

getchar();

printf("请你输入数据结构成绩:

");

scanf("%d",&p->data.cgrade);

getchar();

printf("请你输入数据库成绩:

");

scanf("%d",&p->data.mgrade);

getchar();

printf("请你输入英语成绩:

");

scanf("%d",&p->data.egrade);

getchar();

p->data.totle=p->data.egrade+p->data.cgrade+p->data.mgrade;

p->data.ave=p->data.totle/3;

//信息输入已经完成

p->next=NULL;

r->next=p;

r=p;

shoudsave=1;

}

}

voidQur(Linkl)//查询学生

{

charfindmess[20];

Node*p;

if(!

l->next)

{

printf("\n=====>提示:

没有资料可以查询!

\n");

return;

}

printf("请你输入要查找的学号:

");

scanf("%s",findmess);

p=Locate(l,findmess,"num");

if(p)

{

printf("\t\t\t\t查找结果\n");

printstart();

printc();

printe(p);

printstart();

}

else

Nofind();

}

voidDel(Linkl)//删除

{

Node*p,*r;

charfindmess[20];

if(!

l->next)

{

printf("\n=====>提示:

没有资料可以删除!

\n");

return;

}

printf("\n=====>确定进行删除操作请按1,按其他按键退出该操作\n\n\n\n");

if(menu()==1)

{

printf("请你输入要删除的学号:

");

scanf("%s",findmess);

p=Locate(l,findmess,"num");

if(p)

{

r=l;

while(r->next!

=p)

r=r->next;

r->next=p->next;

free(p);

printf("\n=====>提示:

该学生已经成功删除!

\n");

shoudsave=1;

}

else

Nofind();

}

else

exit;

}

voidModify(Linkl)//修改函数

{

Node*p;

charfindmess[20];

if(!

l->next)

{

printf("\n=====>提示:

没有资料可以修改!

\n");

return;

}

printf("请你输入要修改的学生学号:

");

scanf("%s",findmess);

p=Locate(l,findmess,"num");

if(p)

{

printf("请你输入新学号(原来是%s):

",p->data.num);

scanf("%s",p->data.num);

printf("请你输入新姓名(原来是%s):

",p->data.name);

scanf("%s",p->data.name);

getchar();

printf("请你输入新性别(原来是%s):

",p->data.sex);

scanf("%s",p->data.sex);

printf("请你输入新的数据结构成绩(原来是%d分):

",p->data.cgrade);

scanf("%d",&p->data.cgrade);

getchar();

printf("请你输入新的数据库成绩(原来是%d分):

",p->data.mgrade);

scanf("%d",&p->data.mgrade);

getchar();

printf("请你输入新的英语成绩(原来是%d分):

",p->data.egrade);

scanf("%d",&p->data.egrade);

p->data.totle=p->data.egrade+p->data.cgrade+p->data.mgrade;

p->data.ave=p->data.totle/3;

printf("\n=====>提示:

资料修改成功!

\n");

shoudsave=1;

}

else

Nofind();

}

voidDisp(Linkl)//显示函数

{

intcount=0;

Node*p;

p=l->next;

if(!

p)

{

printf("\n=====>提示:

没有资料可以显示!

\n");

return;

}

printf("\t\t\t\t显示结果\n");

printstart();

printc();

printf("\n");

while(p)

{

printe(p);

p=p->next;

}

printstart();

printf("\n");

}

voidTongji(Linkl)//统计函数

{

Node*pm,*pe,*pc,*pt,*pa;//用于指向分数最高的接点

Node*r=l->next;

if(!

r)

{

printf("\n=====>提示:

没有资料可以统计!

\n");

return;

}

pm=pe=pc=pt=pa=r;

while(r!

=NULL)

{

if(r->data.cgrade>=pc->data.cgrade)

pc=r;

if(r->data.mgrade>=pm->data.mgrade)

pm=r;

if(r->data.egrade>=pe->data.egrade)

pe=r;

if(r->data.totle>=pt->data.totle)

pt=r;

if(r->data.ave>=pa->data.ave)

pa=r;

r=r->next;

}

printf("------------------------------统计结果--------------------------------\n");

printf("总分最高者:

\t%s%d分\n",pt->data.name,pt->data.totle);

printf("平均分最高者:

\t%s%d分\n",pa->data.name,pa->data.ave);

printf("英语最高者:

\t%s%d分\n",pe->data.name,pe->data.egrade);

printf("数据库最高者:

\t%s%d分\n",pm->data.name,pm->data.mgrade);

printf("数据结构最高者:

\t%s%d分\n",pc->data.name,pc->data.cgrade);

printstart();

}

 

voidSave(Linkl)//保存函数

{

FILE*fp;

Node*p;

intflag=1,count=0;

fp=fopen("c:

\\student","wb");

if(fp==NULL)

{

printf("\n=====>提示:

重新打开文件时发生错误!

\n");

exit

(1);

}

p=l->next;

while(p)

{

if(

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

当前位置:首页 > 教学研究 > 教学计划

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

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