数据结构实验报告物联网工程.docx
《数据结构实验报告物联网工程.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告物联网工程.docx(94页珍藏版)》请在冰豆网上搜索。
数据结构实验报告物联网工程
中南大学
数据结构
实验报告
实验一线性表的操作算法
一、需求分析
1.实验要求:
分别用数组和链表作为存储结构,实现线性表的插入、删除、查找、排序、合并等操作。
2.实验分析:
1)构成线性表,且能进行排序的合法字符:
大写或者小写字母、整形(包括但不限于int、long、unsigned等数据类型)数据,浮点型(包括但不限于float、double等数据类型)数据。
2)程序以用户和计算机的对话方式进行,用户通过程序中的提示语句进入相关子程序完成相关任务。
用户可以选择顺序表和链表两种形式来进行相关操作。
另外,应要求先创建好线性表(包括顺序表和链表),再完成插入,删除,查找,二路归并,排序等功能。
3)程序执行的命令:
A.创建线性表(线性表均表示顺序表和链表两种形式的顺序表,下同),提示用户输入线性表中的数据;
注:
以下B、C、D、E、F五个步骤并无先后顺序,用户可以根据自己的需要进行相关操作。
B.进行线性表的插入操作:
提醒用户输入数据的位置信息和内容信息,并且显示线性表插入以后的结果,以检验是否正确进行了操作(之后每一步也都应有此验证步骤);
C.进行线性表的删除操作:
用户可以选择通过数据的位置信息还是内容信息进行删除;
D.进行线性表的查找操作:
用户在自己选定的线性表类型中均可以进行按值返址和按址返值两个操作;
E.进行线性表的排序操作:
这里的排序是指外部排序,而且对排序的有效性和可靠性均无较高要求,可以使用冒泡排序、简单选择排序、二路归并排序,希尔排序等各种方法。
F.进行线性表的归并操作:
进行归并合作之前应该提前进行好排序的操作,这里可以在归并操作中帮助用户再次进行排序,之后完成归并操作。
4)输入过程中能自动滤去合法字符以外的其他字符,并能在输入不当时输入相应的提示信息。
5)测试数据:
见“测试结果”
二、概要设计
1.抽象数据类型:
typedefstructDySqList{
int*elem;
intlen;
intcursize;
}*DySqPtr;
typedefstructLNode{
intdata;
structLNode*next;
}*LinkList,LNode;
ADTList{
数据对象:
D={ei|i=1,2,3,…,n;n>=0;eiAtomSet}//AtomSet为某个数据对象
数据关系:
R={|ei-1,eiD,2<=i<=n}
基本操作:
Init_List(ListPtrL);
操作结果:
创建空的顺序表,初始化DySqList中的成员。
Creat_List(ListPtrL);
初始条件:
L是已经进行了初始化的空顺序表。
操作结果:
创建一个顺序表,输入表中数据。
Display_List(ListPtrL);
初始条件:
顺序表L存在,且非空表。
操作结果:
把表中元素依次输出。
GetLct_List(ListPtrL,inti);
初始条件:
顺序表L存在,且非空表。
操作结果:
获取一个元素的内容信息在表中的位置,并返回该位置,若未找到,则返回-1。
GetElem_List(ListPtrL,inte);
初始条件:
顺序表L存在,且非空表。
操作结果:
获取一个元素的内位置信息在表中的内容,并返回该内容,若未找到,则返回-1。
GetLen_List(ListPtrL);
初始条件:
顺序表L存在。
操作结果:
返回该线性表的长度。
Delete_List_Ord(ListPtrL,inti);
初始条件:
顺序表L存在,且非空表。
操作结果:
按照元素的位置信息删除该元素。
Delete_List_Val(ListPtrL,inti);
初始条件:
顺序表L存在,且非空表。
操作结果:
按照元素的内容信息删除该元素。
Insert_List(ListPtrL,intx,inti);
初始条件:
顺序表L存在,且非空表。
操作结果:
按照元素的内容和位置信息插入该元素,这里插入的元素是在指定位置前。
Sort_List(ListPtrL):
初始条件:
顺序表L存在,且非空表。
操作结果:
对顺序表L进行排序。
Merge_List(ListPtrLa,ListPtrLb,ListPtrLc);
初始条件:
La,Lb,Lc存在,且La,Lb非空表。
操作结果:
将La和Lb合并到Lc中。
}
2.主程序:
voidmain(){
Cover();//用户欢迎界面
TypeSelection();//用户选择界面
}
voidTypeSelection(){
初始化;
选择界面;
while
(1){
scanf_s("%d",&Selection);
switch(Selection){
case1:
SqList_Selection();
break;
case2:
LkList_Selection();
break;
default:
printf("Sorry,wrongnumber,pleaseinputagain:
");
continue;
}
if(Selection==1||2)
break;
}
}
3.调用关系:
本程序中的模块包括:
其中:
def.h:
提供本程序所需要用到的宏定义。
LkList.h:
完成对链表的基本定义和操作,其中调用了def.h中的宏定义。
SqList.h:
完成对顺序表的基本定义和操作,其中调用了def.h中的宏定义。
Bkgrd.cpp:
该系统的各种界面设计和对LkList.h以及SqList.h中的函数的调用,以实现各种功能,是整个函数的入口,其中调用了LkList.h,SqList.h和def.h。
三、详细设计
1.def.h中的基本函数以及源码:
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
#defineLIST_INIT_SIZE100
#defineLIST_INCREMENT10
2.LkList.h中的基本函数以及源码:
#include
#include
#include"def.h"
typedefstructLNode{
intdata;
structLNode*next;
}*LinkList,LNode;
voidDisplay_LkLs(LinkListH){
LinkListp=NULL;
for(p=H->next;p;p=p->next)
printf("%8d",p->data);
}
voidInit_LkLs(LinkListH){
H->data=0;
H->next=NULL;
}
voidCreate_LkLs(LinkListH){
inti,n;
LinkListp=H,q=NULL;
printf("请输入您要输入的元素的个数:
");
scanf_s("%d",&n);
printf("请输入您要输入的数据,用回车隔开");
for(i=0;iprintf("\n\t\t\t\t\t");
q=(LinkList)malloc(sizeof(LNode));
scanf_s("%d",&(q->data));
q->next=p->next;
p->next=q;
p=q;//插表头生成一个单项链表
}
}
intGetElem_LkLs(LinkListH,inti){
intcount;
LinkListp=NULL;
for(p=H->next,count=1;p&&countnext,count++);
if(!
p||count>i){
returnERROR;
}
returnp->data;
}
intGetLct_LkLs(LinkListH,inte){
intcount;
LinkListp=H->next;
for(count=0;p&&p->data!
=e;count++)
p=p->next;
if(!
p)
returnERROR;
returncount+1;
}
intGetLen_LkLs(LinkListH){
intcount;
LinkListp=H->next;
for(count=0;p;count++)
p=p->next;
returncount;
}
intInsert_LkLs(LinkListH,inti,inte){
intcount;
LinkListp=H,q=NULL;
if(i<1||i>GetLen_LkLs(H)){
printf("插入位置错误!
");
returnERROR;
}
for(count=0;countp=p->next;
q=(LinkList)malloc(sizeof(LNode));
q->data=e;
q->next=p->next;
p->next=q;
returnOK;
}
intDelete_LkLs_Ord(LinkListH,inti){
intcount=0;
LinkListp=H,q=NULL;
for(count=0;countnext;count++)
p=p->next;
if(!
(p->next)||count>i-1)
returnERROR;
q=p->next;
p->next=q->next;
free(q);
returnOK;
}
intDelete_LkLs_Val(LinkListH,inte){
LinkListp=H,q=NULL;
if(!
H){
printf("链表已空,无法操作!
\n");
returnINFEASIBLE;
}
while(p){
if(e==p->data)
break;
else{
q=p;
p=p->next;
}
}
if(!
p){
printf("找不到该元素!
\n");
returnERROR;
}
else{
q->next=p->next;
free(p);
}
if(!
H){
printf("链表已空\n");
returnINFEASIBLE;
}
returnOK;
}
voidSort_LkLs(LinkListH){
inttemp=0;
LinkListp=NULL,q=NULL;//工作指针
for(p=H;p;p=p->next)
for(q=H;q->next;q=q->next){
if((q->data)>(q->next->data)){
temp=q->data;
q->data=q->next->data;
q->next->data=temp;
}
}
printf("排序完毕!
\n");
}
LinkListMerge_LkLs(LinkListLa,LinkListLb){
LinkListpa=La->next,pb=Lb->next,pc=La;
LinkListpam=La,pbm=Lb;
while(pa&&pb){
if(pa->data<=pb->data){
pc->next=pa;
pc=pa;
pa=pa->next;
}
else{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
pc->next=pa?
pa:
pb;
free(Lb);
returnLa;
}
3.SqList.h中的基本函数以及源码:
#include
#include
#include"def.h"
typedefstructDySqList{
int*elem;
intlen;
intcursize;
}*DySqPtr;
voidDisplay_DySq(DySqPtrL){
intj;
printf("\nTheresultis:
\n\t\t");
for(j=0;jlen;j++)
printf("%8d",L->elem[j]);
}
intInit_DySq(DySqPtrL){
L->elem=(int*)malloc(LIST_INIT_SIZE*sizeof(int));
if(!
L->elem)
printf("内存分配失败!
\n");
returnOVERFLOW;//分配内存失败
L->len=0;
L->cursize=LIST_INIT_SIZE;
returnOK;
}
intCreate_DySq(DySqPtrL){
inti;
int*newbase=NULL;
Init_DySq(L);
printf("请输入您要输入的元素的个数:
");
scanf_s("%d",&L->len);
if(L->len>L->cursize){
newbase=(int*)realloc(L->elem,(LIST_INIT_SIZE+L->len)*sizeof(int));
L->elem=newbase;
L->cursize=L->len+LIST_INIT_SIZE;
}
if(!
L->elem){
printf("内存分配失败!
\n");
returnERROR;
}
printf("请输入您要输入的数据,用回车隔开:
\n");
for(i=0;ilen;i++){
printf("\n\t\t\t\t\t");
scanf_s("%d",&L->elem[i]);
}
printf("\n\n\t\t\t\t建立完毕!
\n");
returnOK;
}
intGetLct_DySq(DySqPtrL,inti){
intq;
for(q=0;qlen;q++)
if(L->elem[q]==i)
returnq+1;
printf("表中不存在该元素!
\n");
returnERROR;
}
intGetElem_DySq(DySqPtrL,inte){
if(e<-1||e>L->len)
returnERROR;
returnL->elem[e-1];
}
intGetLen_DySq(DySqPtrL){
returnL->len;
}
intDelete_DySq_Ord(DySqPtrL,inti){
intj=0;
if(i-1<1||i-1>L->len-1){
printf("删除位置不合理!
\n");
returnFALSE;//删除位置不合理
}
if(L->len==0){
printf("顺序表已空,无法删除!
\n");
returnINFEASIBLE;//顺序表空,无法执行删除
}
for(j=i-1;j<=L->len-1;j++)
L->elem[j]=L->elem[j+1];//每个元素后移一个单元格
--L->len;
printf("删除完毕!
\n");
returnOK;
}
intDelete_DySq_Val(DySqPtrL,inti){
intj;
j=GetLct_DySq(L,i);
if(j!
=ERROR){
if(Delete_DySq_Ord(L,j)==OK)
returnOK;
else
returnERROR;
}
else
returnERROR;
}
intInsert_DySq(DySqPtrL,intx,inti){
intj;
int*newbase=NULL;
if(i-1<0||i-1>L->len+1){
printf("插入位置不合理!
\n");
returnERROR;
}
if(L->len>=L->cursize){
newbase=(int*)realloc(L->elem,(L->cursize+LIST_INCREMENT)*sizeof(int));//增加动态分配的内存,即cursize
if(!
newbase){
printf("内存分配失败!
\n");
returnOVERFLOW;
}
L->elem=newbase;
L->cursize+=LIST_INCREMENT;
}
for(j=L->len-1;j>=i-1;j--)
L->elem[j+1]=L->elem[j];
L->elem[i-1]=x;
L->len++;
printf("插入完毕!
\n");
returnOK;
}
intSort_DySq(DySqPtrL){
inti,j,temp;
for(j=0;jlen-1;j++)
for(i=0;ilen-1-j;i++)
if(L->elem[i]>L->elem[i+1]){
temp=L->elem[i];
L->elem[i]=L->elem[i+1];
L->elem[i+1]=temp;
}
printf("\n排序完毕!
\n");
returnOK;
}
voidMerge_DySq(DySqPtrLa,DySqPtrLb,DySqPtrLc){
inti=0,j=0,k=0;
Lc->len=La->len+Lb->len;
Lc->cursize=2*LIST_INIT_SIZE;
while(ilen&&jlen){
if(La->elem[i]<=Lb->elem[j])
Lc->elem[k++]=La->elem[i++];
else
Lc->elem[k++]=Lb->elem[j++];
}
while(ilen){
Lc->elem[k++]=La->elem[i++];
}
while(jlen){
Lc->elem[k++]=Lb->elem[j++];
}
printf("\n归并完毕!
\n");
}
4.Bkgrd.cpp中的基本函数以及源码:
#include
#include
#include"SqList.h"
#include"LkList.h"
DySqPtrL=NULL;
voidTypeSelection();
voidSqList_Selection();
///////////////////////////////////////////////////////////////////////////////////////////////////////
voidCreate_Sq(){
system("cls");
inttag;
L=(DySqPtr)malloc(sizeof(DySqList));
Init_DySq(L);
printf("================================================================================\n\n");
while
(1){
tag=Create_DySq(L);
if(tag==ERROR){
printf("SystemError\n");
printf("PleaseInputthelistsyouwanttocreateagain\n");
}
if(tag==OK)
break;
}
printf("================================================================================\n\n");
Display_DySq(L);
printf("\nPressanykeytoreturntotheSequenceListMenu.");
getchar();
getchar();
SqList_Selection();
}
voidGetLct_Sq(){
intnum,tag;
system("cls");
printf("================================================================================\n\n\n\n\n\n");
printf("Pleaseinputtheelementyouwanttofind:
\n\n