数据结构线性表作业.docx
- 文档编号:5274783
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:16
- 大小:19.01KB
数据结构线性表作业.docx
《数据结构线性表作业.docx》由会员分享,可在线阅读,更多相关《数据结构线性表作业.docx(16页珍藏版)》请在冰豆网上搜索。
数据结构线性表作业
1.实验目的
⑴熟悉线性表的定义和基本操作;
⑵掌握线性表的顺序存储结构设计与基本操作的实现。
2.实验内容与要求
⑴定义线性表的顺序存储表示;
⑵基于所设计的存储结构实现线性表的基本操作;
⑶编写一个主程序对所实现的线性表进行测试;
⑷线性表的应用:
1使用菜单方式实现顺序表的各种操作,包括创建、插入、删除、显示。
2已知n个人用编号1..n表示,围坐在一张圆桌周围,编号为k的人从1开始报数数到m的那个人出列,他的下一个人又从1开始继续报数,数到m的那个人出列,。
。
。
,依次重复下去,直到圆桌周围的人全部出列。
要求,主函数里面实现n、k、m的录入,以及函数调用JOSEPHU(n,k,m)。
程序必须输出整个的出列编号顺序。
3.数据结构设计
实验一:
逻辑结构:
线性结构
存储结构:
顺序存储结构
实验二:
逻辑结构:
线性结构
存储结构:
链式存储结构
4.算法设计
实验一:
////////////////////////////////////////////////////////////////
//文件名称:
demo.c
//创建者姓名:
Dick
//班级:
信计1001班
//学号:
xxxxxxxxxx
//创建时间:
2012.2.26
//修改时间:
2012.3.2
////////////////////////////////////////////////////////////////
//文件中所定义的函数的名称和主要功能:
//
//voidmenu()实现菜单的显示
//intInitList(SqList*L)生成一个顺序表
//intinsert(SqList*L)向已经生成的表中插入一个数据
//intdel(SqList*L)向已经生成的表中删除一个数据
//intdisplay(SqList*L,k)显示一个顺序表
//voidmain()主函数
////////////////////////////////////////////////////////////////
//文件中所定义的全局变量的变量名和主要功能
//
//暂无
////////////////////////////////////////////////////////////////
//文件中用到的他处定义的全局变量及其出处
//
//暂无
////////////////////////////////////////////////////////////////
//与其他文件的依赖关系
//
//暂无
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
//代码和资料的出处
//
//<数据结构>清华大学出版社
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
#include
#include
#include
#include
#defineLIST_INIT_SIZE100//一开始分配给数组的基础大小
#defineLISTINCREMENT50//数据溢出的时候重新多分配的大小
typedefstruct//定义结构体
{
int*elem;//用于存放数据
intlength;//存放有数据的长度
intlistsize;//存放数组的大小
}SqList;
////////////////////////////////////////////////////////////////
//函数名称:
菜单函数
//函数主要功能:
实现窗口的显示功能
//函数调用之前的预备条件:
无
//函数的返回值:
无
//函数的输入参数:
无
//函数的输出参数:
无
//该函数与其它函数的调用和被调用关系:
被主函数调用
////////////////////////////////////////////////////////////////
voidmenu()
{
printf("*********************************************\n");
printf("*作者:
Dick*\n");
printf("*信计1001xxxxxxxxxx*\n");
printf("*********************MENU********************\n");
printf("1创造数组\n");
printf("2插入数据到数组\n");
printf("3删除数组中数据\n");
printf("4显示数组数据\n");
printf("5退出程序\n");
}
//除了menu函数外别的函数结尾必须clrscr();
////////////////////////////////////////////////////////////////
//函数名称:
生成函数
//函数主要功能:
生成一个顺序表
//函数调用之前的预备条件:
无
//函数的返回值:
无
//函数的输入参数:
SqList*L
//函数的输出参数:
无
//该函数与其它函数的调用和被调用关系:
被主函数调用
////////////////////////////////////////////////////////////////
intInitList(SqList*L)
{
inti,j,k=1;
int*newbase;
externintdisplay(SqList*L,intk);
srand(time(0));//设置随机种子
printf("请输入需要生成数字的数量\n");
scanf("%d",&j);
(*L).elem=(int*)malloc(LIST_INIT_SIZE*sizeof(int));//动态分配大小
(*L).length=j;//提前确定数组的长度
(*L).listsize=LIST_INIT_SIZE;
if(!
(*L).elem)//如果没有申请下来。
。
。
{
printf("生成错误\n");
return0;
}
while((*L).length>=(*L).listsize)//防止溢出语句
{
newbase=(int*)realloc((*L).elem,((*L).listsize+LISTINCREMENT)*sizeof(int));
if(!
newbase)
{
printf("生成错误\n");
return0;
}
(*L).elem=newbase;
(*L).listsize+=LISTINCREMENT;
}
for(i=0;i (*L).elem[i]=rand()%100; printf("数组生成完毕\n");//结束的几行程序,显示结果,等待,清屏,返回,后面一样 printf("生成的数组是: \n"); display(L,k); system("CLS"); return0; } //////////////////////////////////////////////////////////////// //函数名称: 插入函数 //函数主要功能: 向已经生成的表中插入一个数据 //函数调用之前的预备条件: 无 //函数的返回值: 无 //函数的输入参数: SqList*L //函数的输出参数: 无 //该函数与其它函数的调用和被调用关系: 被主函数调用 //////////////////////////////////////////////////////////////// intinsert(SqList*L) { inti,j,k=1; int*newbase; int*p,*q; externintdisplay(SqList*L,intk); if((*L).length<0)//容错语句 { printf("数组为空,请先生成数组\n"); Sleep(1000); system("CLS"); return0; } printf("现在的数组是: \n");//居然要显示数组 display(L,k); do//防止出现错误的输入,强令位置输入正确,后面都一样 { printf("请输入要插入的位置\n"); scanf("%d",&i); if(i<1||i>(*L).length+1) printf("输入错误,请重新输入\n"); }while(i<1||i>(*L).length+1); do { printf("请输入要插入的数字(0~100)\n"); scanf("%d",&j); if(j<0||j>100) printf("请重新输入\n"); }while(j<0||j>100); while((*L).length>=(*L).listsize)//防止溢出语句 { printf("数据溢出,分配新数组\n"); Sleep(1000); newbase=(int*)realloc((*L).elem,((*L).listsize+LISTINCREMENT)*sizeof(int)); if(! newbase) { printf("生成错误\n"); return0; } (*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=j; ++(*L).length; printf("数组插入完毕\n"); printf("现在的数组是: \n");//居然要显示数组 display(L,k); system("CLS"); return0; } //////////////////////////////////////////////////////////////// //函数名称: 删除函数 //函数主要功能: 向已经生成的表中删除一个数据 //函数调用之前的预备条件: 无 //函数的返回值: 无 //函数的输入参数: SqList*L //函数的输出参数: 无 //该函数与其它函数的调用和被调用关系: 被主函数调用 //////////////////////////////////////////////////////////////// intdel(SqList*L) { inti,k=1; int*p,*q; externintdisplay(SqList*L,intk); if((*L).length<0) { printf("数组为空,请先生成数组\n"); Sleep(1000); system("CLS"); return0; } printf("现在的数组是: \n");//居然要显示数组 display(L,k); do { printf("请输入要删除的位置\n"); scanf("%d",&i); if(i<1||i>(*L).length) printf("输入错误,请重新输入\n"); }while(i<1||i>(*L).length); p=&(*L).elem[i-1];//从前往后循环,后面的盖住前面的 q=(*L).elem+(*L).length-1; for(++p;p<=q;++p) *(p-1)=*p; (*L).length--; printf("删除完毕\n"); printf("现在的数组是: \n");//居然要显示数组 display(L,k); system("CLS"); return0; } //////////////////////////////////////////////////////////////// //函数名称: 显示函数 //函数主要功能: 显示一个顺序表 //函数调用之前的预备条件: 无 //函数的返回值: 无 //函数的输入参数: SqList*L //函数的输出参数: 无 //该函数与其它函数的调用和被调用关系: 被主函数调用 //////////////////////////////////////////////////////////////// intdisplay(SqList*L,intk) { inti,j=0; if((*L).length<0) { printf("数组为空,请先生成数组\n"); Sleep(1000); system("CLS"); return0; } for(i=0;i<(*L).length;i++)//按顺序输出数组 { printf("%d\t",(*L).elem[i]); j++; if(j==5)//输出五个数字后换行 { printf("\n"); j=0; } } printf("\n"); printf("按任意键返回\n"); getchar(); getchar(); if(k==0) system("CLS"); return0; } voidmain() { inti,k=0; SqListList; SqList*p; p=&List; while (1) { menu(); do//这里循环直到你输入正确的数字为止 { scanf("%d",&i); if(i<1||i>5) printf("错误数字,请重新输入\n"); }while(i<1||i>5); switch(i) { case1: InitList(p);break; case2: insert(p);break; case3: del(p);break; case4: display(p,k);break; case5: exit(0);break; } } } 实验二: ///////////////////////////////////////////////////////////////////////////////////////////////////////////// //文件名称: 约瑟夫.c //创建者姓名: Dick //班级: 信计1001班 //学号: xxxxxxxxxx //创建时间: 2012.3.1 //修改时间: 2012.3.1 ///////////////////////////////////////////////////////////////////////////////////////////////////////////// //文件中所定义的函数的名称和主要功能: // //voidJOSEPHU(intpeople_Number,intstart_Point,intjudge_Number)求解约瑟夫问题 //voidmain()主函数 ///////////////////////////////////////////////////////////////////////////////////////////////////////////// //文件中所定义的全局变量的变量名和主要功能 // //暂无 ///////////////////////////////////////////////////////////////////////////////////////////////////////////// //文件中用到的他处定义的全局变量及其出处 // //暂无 ///////////////////////////////////////////////////////////////////////////////////////////////////////////// //与其他文件的依赖关系 // //暂无 ///////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////// //代码和资料的出处 // //<数据结构>清华大学出版社 //第二章线性表2.28老师的课件 ///////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////// #include #include #include typedefstructnode { intdata;//结点值 structnode*next;//存储下一个结点的地址 }LinkList; //////////////////////////////////////////////////////////////// //函数名称: JOSEPHU函数 //函数主要功能: 求解约瑟夫问题 //函数调用之前的预备条件: 无 //函数的返回值: 无(这样的话只能在函数进行输出了) //函数的输入参数: 无 //函数的输出参数: 无 //该函数与其它函数的调用和被调用关系: 被主函数调用 //////////////////////////////////////////////////////////////// voidJOSEPHU(intpeople_Number,intstart_Point,intjudge_Number) { inti,j=0; LinkList*p,*head,*create,*startpoint;//指针,head肯定是头指针了 head=(LinkList*)malloc(sizeof(LinkList));//生成动态链表 p=head; if(! head) { printf("无内存空间可分配\n"); printf("按任意键退出程序\n"); getchar(); exit(0); } head->data=1; head->next=head;//循环链表的尾指针一定指向头指针 for(i=1;i { create=(LinkList*)malloc(sizeof(LinkList)); create->data=i+1; p->next=create; p=p->next; create->next=head; } //先把需要的指针移动到开始的人的位置 startpoint=head; for(i=0;i { startpoint=startpoint->next; } //这里就可以输出了 printf("nowoutputtheorder: \n"); while(head! =head->next) { j++; for(i=0;i { startpoint=startpoint->next; } p=startpoint->next; if(p! =head) { startpoint->next=p->next; if(j! =5) printf("%d\t",p->data); else { j=0; printf("%d\n",p->data); } free(p); startpoint=startpoint->next; } else { head=startpoint->next=p->next;//不得已移动头指针,据说头指针不能动? if(j! =5) printf("%d\t",p->data); else { j=0; pr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 线性 作业