武昊数据结构课程设计.docx
- 文档编号:8537017
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:52
- 大小:288.47KB
武昊数据结构课程设计.docx
《武昊数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《武昊数据结构课程设计.docx(52页珍藏版)》请在冰豆网上搜索。
武昊数据结构课程设计
数据结构课程设计
----个人设计报告
专业:
信息安全
班级:
计算机科学与技术0902
姓名:
武昊
学号:
091340220
指导教师:
王梅
日期:
10年10月19日至10年10月22日
1课程设计目的
1、学习获取知识的方法;
2、提高发现问题、分析问题和解决实际问题的能力;
3、加强创新意识和创新精神;
4、加强团队的分工与合作;
5、掌握面向实际背景思考问题的方法。
2课程设计内容和要求
内容:
顺序表与链表的应用
要求:
本次共有九道题,要求至少完成八道.,一道选做题.
3任务完成情况
任务完成情况介绍,如表3-1.
表3-1任务完成情况表
完成任务名称
1、顺序表的应用
2、链表的应用
3、选做题
4设计报告
顺序表的应运:
第一题:
(1)已知长度为n的线性表A采用顺序存储结构,请写一时间复杂度为0(n)、空间复杂度为0
(1)的算法,该算法删除线性表中所有值为item的数据元素。
要求:
线性表元素个数n很大,而值为item的数据元素个数很少,要求移动元素个数尽量少;删除后的数组元素与原数组元素不必保持顺序一致。
源代码:
#defineTURE1
#defineOK1
#defineFALSE0
#defineOVERFLOW-2
#defineERROR0
#include
#include
#include
//***************************************
//Initializethetypeofelemasinteger
//***************************************
typedefintElemType;
typedefintStatus;
//*******动态分配顺序储存结构**********
#defineLIST_INIT_SIZE100
#defineLISTINCREMENT10
structSqList
{
ElemType*elem;
intlength;
intlistsize;
};
//*******************************
//InitializetheSqList
//*******************************
StatusInit_SqList(SqList&l)
{
l.length=0;
l.elem=(ElemType*)malloc(sizeof(ElemType)*LIST_INIT_SIZE);
if(!
l.elem)
{
printf("OVERFLOW!
\n");
returnOVERFLOW;
}
l.listsize=LIST_INIT_SIZE;
returnOK;
}
//*******************************
//InsertanelemtoSqList
//*******************************
StatusListInsert_Sq(SqList&l,ElemTypeelem)
{
if(l.length>=l.listsize)
{
ElemType*newbase;
intle=l.listsize+LISTINCREMENT;
newbase=(ElemType*)realloc(l.elem,le*sizeof(ElemType));
if(!
newbase)
{
printf("OVERFLOE!
\n");
returnFALSE;
}
l.elem=newbase;
l.listsize+=LISTINCREMENT;
}
l.elem[l.length]=elem;
l.length++;
returnOK;
}
//**********************************
//Createrandom,theninsertSqList
//**********************************
StatusCreateRand(SqList&l)
{
srand(time(NULL));
ElemTypen=rand()%110+1;
inti=0;
//Createnrandomnumber
while(i { ElemTyperad=rand()%100+1; Statusst=ListInsert_Sq(l,rad); if(st! =OK) returnFALSE; i++; } returnOK; } //********************************* //DeletetheelemincludeinSqList //********************************* StatusListDelete(SqList&l,ElemTypeelem) { inti=0; for(i;i { if(l.elem[i]==elem) { l.elem[i]=l.elem[l.length-1]; l.length--; i--;//对i处的值重新判断,因为他是最后一个数,并没有判断过 } } returnOK; } //*********************************** //Printalltheeleminthelist //*********************************** StatusPrintList(SqList&l) { inti=0,sum=0; for(i;i { printf("%d",l.elem[i]); sum++; if(sum%8==0) printf("\n"); } returnOK; } intmain(intargv,char*argc[]) { SqListl; Init_SqList(l); CreateRand(l); PrintList(l); printf("\n"); printf("Inputtheelemyouwhichwanttodeleteit\n"); ElemTypeelem; scanf("%d",&elem); ListDelete(l,elem); PrintList(l); printf("\n"); return0; } 运行结果: 说明及感想: 此顺序链表采用动态储存结构,首先创建size为100的储存单元,扩充长度为10,引入时间函数为随机因子,随机的产生若干元素,然后删除所要删除的元素。 编写过程中因为在define中没有定义INCREMENT对应的值(实际为10)所以在编译途中总是提示错误却找不到错误根源,费了好长时间。 第二题: (2)编写一个函数将一个顺序表A(有n个元素,且任何元素均不为0)分拆成两个顺序表,使A中大于0的元素存放在B中,小于0的元素存放在C中。 感想: 首先写感想是因为觉得此题只是在第一题上做一些加工,所以只需要实现两个函数就可以搞定。 这两个函数一个是产生随机的正数和负数,可以用随机产生一个数与2之比如果余数是0则为正否则为负,这样就会在链表中产生随机的正数和负数。 第二个函数就是产生两个链表,储存正数和负数。 有了算法思想就可以实现算法,下面仅给出这两个函数、main函数和运行结果: 源代码: //**************************** //随机的让链表元素产生符号 //**************************** StatusCreatSignedNum(SqList&l) { inti=0; srand(time(NULL)); for(i;i { intrad=rand()+1; if(rad%2==1) l.elem[i]=-l.elem[i]; } returnOK; } //******************************** //将链表正数和负数分配到两个链表中 //******************************** StatusListTok(SqList&l1,SqList&l2) { inti=0,j=0; for(i;i { if(l1.elem[i]<0) { ListInsert_Sq(l2,l1.elem[i]); l1.elem[i]=l1.elem[l1.length-1]; l1.length--; i--; } } returnOK; } intmain(intargv,char*argc[]) { SqListl1,l2; Init_SqList(l1); Init_SqList(l2); CreateRand(l1); CreatSignedNum(l1); printf("原始数据\n"); PrintList(l1); printf("\n"); printf("重新分配后的数据\n"); ListTok(l1,l2); printf("\n正数\n"); PrintList(l1); printf("\n负数\n"); PrintList(l2); printf("\n"); return0; } 运行结果: 第三题 (3)假设一个算术表达式中包含圆括号,方括号和花号三种类型的括号,编写一个判别表达式中括号是否正确配对的函数correct(exp,tag);其中: exp为字符串类型量,表示被判别的表达式,tag为布尔型的变量。 源代码: #defineOK1 #defineERROR0 #defineFALSE0 #defineTRUE1 #defineOVERFLOW-2 #include #include #include typedefintStatus; typedefcharElemType; #defineSTACK_INIT_SIZE100 #defineSTACKINCREMENT10 structStack { ElemType*elem; intlength; intsize; }; //*************** //charflag //*************** structCha { charx[4],y[4]; }; StatusInitCha(Cha&c) { c.x[0]='('; c.x[1]='['; c.x[2]='{'; c.y[0]=')'; c.y[1]=']'; c.y[2]='}'; c.x[3]=0; c.y[3]=0; returnOK; } //************************* //Initializestack //************************* StatusInitStack(Stack&stack) { stack.elem=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(char)); if(! stack.elem) { printf("OVERFLOW! \n"); returnOVERFLOW; } stack.length=0; stack.size=STACK_INIT_SIZE; returnOK; } //********************************* //Pushaneleminstack //********************************* StatusPush(Stack&stack,ElemTypeelem) { if(stack.length>=stack.size) { ElemType*newbase; intle=stack.size+STACKINCREMENT; newbase=(ElemType*)realloc(stack.elem,le*sizeof(ElemType)); if(! newbase) { printf("OVERFLOE! \n"); returnFALSE; } stack.elem=newbase; stack.size+=STACKINCREMENT; } stack.elem[stack.length]=elem; stack.length++; returnOK; } //****************************** //Popaneleminstack //****************************** StatusPop(Stack&stack,ElemType&elem) { elem=stack.elem[--stack.length]; returnOK; } //***************************** //Ifstackisemptyreturntrue //***************************** StatusStackEmpty(Stack&stack) { if(stack.length==0) returntrue; returnfalse; } //********************************** //Handletheproblem //********************************** StatusHandleStack(Stack&stack,Cha&ch,chars[100],bool&tag) { inti=0; charc; for(i;i { if((s[i]=='('||s[i]==')'||s[i]=='[')||s[i]==']'||s[i]=='}'||s[i]=='{') { if(StackEmpty(stack)) { Push(stack,s[i]); } else { intj=0; for(j;j<3;++j) { if(s[i]==ch.x[j]) { Push(stack,s[i]); break; } } for(j=0;j<3;++j) { if(ch.y[j]==s[i]) { if(StackEmpty(stack)) { printf("符号不匹配\n"); returnFALSE; } Pop(stack,c); if(c! =ch.x[j]) { printf("符号不匹配\n"); tag=false; returnFALSE; } } } } } } if(StackEmpty(stack)) { tag=true; returnOK; } tag=false; returnFALSE; } intmain(intargv,char*argc[]) { Stackstack; InitStack(stack); Chach; InitCha(ch); printf("Inputthestring\n"); chars[100]; scanf("%s",&s); booltag; HandleStack(stack,ch,s,tag); if(tag) printf("Success! \n"); else printf("False\n"); return0; } 运行结果: 感想: 应运栈可以方便地判断符号匹配问题,此段代码虽然长,但实现方法简单,就是将不匹配地符号先压入栈,找到匹配的后再出栈,如果最后栈为空则符号全匹配,否则不匹配。 写程序一次通过,居然连编译错误都没有,实在兴奋。 只是并没有用到correct(exp,tag)函数,而是用了HandleStack(Stack&stack,Cha&ch,chars[100],bool&tag)其中Cha为括号字符的统计,判别是做括弧还是有括弧。 Stack是处理的栈。 第四题: (4)编写向顺序分配的循环队列QU[0,m-1]中插入一个结点的函数enqueue和从该队列中取出一个节点的dequeue函数。 源代码: #defineOK1 #defineERROR0 #defineFALSE0 #defineTRUE1 #defineOVERFLOW-2 #defineMAXSIZE100 #include #include typedefintStatus; typedefintElemType; structSqQueue { ElemType*base; intfront; intrear; }; StatusInitQueue(SqQueue&sq) { sq.base=(ElemType*)malloc(sizeof(ElemType)*MAXSIZE); if(! sq.base) { printf("OVERFLOW! \n"); returnOVERFLOW; } sq.front=sq.rear=0; returnOK; } StatusQueueLength(SqQueue&sq,int&l) { l=(sq.rear-sq.front+MAXSIZE)%MAXSIZE; returnOK; } StatusEnQueue(SqQueue&sq,ElemTypee) { if((sq.rear+1)%MAXSIZE==sq.front) { printf("There\'snotenoughspace! \n"); returnERROR; } sq.base[sq.rear]=e; sq.rear=(sq.rear+1)%MAXSIZE; returnOK; } StatusDeQueue(SqQueue&sq,ElemType&e) { if(sq.front==sq.rear) { printf("There\'snoelems\n"); returnERROR; } e=sq.base[sq.front]; sq.front+=1; sq.front=sq.front%MAXSIZE; returnOK; } //**************************** //Printtheelemsinquen //**************************** StatusPrintQueue(SqQueue&sq) { inti=sq.front,sum=0; while(i! =sq.rear) { printf("%4d",sq.base[i]); sum++; if(sum%8==0) printf("\n"); i=(i+1)%MAXSIZE; } returnOK; } intmain(intargv,char*argc[]) { SqQueuesq; InitQueue(sq); ElemTypeelem; intflag; printf("Pleaseinputtheelemsyouwanttoinsertquen\nWithanendof-1\n"); scanf("%d",&elem); while(elem! =-1) { flag=EnQueue(sq,elem); if(flag! =OK) break; scanf("%d",&elem); } DeQueue(sq,elem); printf("newqueue\n"); PrintQueue(sq); printf("\nDeleteelem: %d\n",elem); return0; } 运行结果: 感想: 队列的特点是先进先出,所以删除的时候应该从表头删除,表尾插入。 这段代码和书上的完全一样,理解起来也简单。 第五题: (5)编写一个主函数,调试上述算法。 源代码 intmain(intargv,char*argc[]) { SqListl1,l2; Init_SqList(l1); Init_SqList(l2); CreateRand(l1); PrintList(l1); printf("\n"); printf("Inputtheelemyouwhichwanttodeleteit\n"); ElemTypeelem; scanf("%d",&elem); ListDelete(l1,elem); PrintList(l1); printf("\n\n\n\n\n"); CreatSignedNum(l1); printf("原始数据\n"); PrintList(l1); printf("\n"); printf("重新分配后的数据\n"); ListTok(l1,l2); printf("\
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)