数据结构与算法实验报告各种算法都有.docx
- 文档编号:4397232
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:50
- 大小:514.33KB
数据结构与算法实验报告各种算法都有.docx
《数据结构与算法实验报告各种算法都有.docx》由会员分享,可在线阅读,更多相关《数据结构与算法实验报告各种算法都有.docx(50页珍藏版)》请在冰豆网上搜索。
数据结构与算法实验报告各种算法都有
广西科技大学
计算机学院软件学院
《数据结构与算法》
实验报告
专业名称:
软件工程
所在班级:
xxxxxxxxxxx
学号:
2011004xxxxxxx
姓名:
xxxxxxxx
日期:
2012年12月18日
实验一顺序存储结构线性表的操作
一、实验目的
顺序存储结构是最简单的数据结构,是学生必须掌握的内容。
验的目的就是要求学生熟练地掌握顺序存储结构在实现时的定义、插入、删除等基本操作。
二、实验内容与要求
在认真阅读下列算法的基础上,要求用C/C++语言完成算法的实现,也就是写出其源程序,并运行程序,给出测试结果。
源程序:
#include
#defineMAX15
intn=0;
intInsertSList(int*,int,int);
intDeleteSList(int*,int);
voidPrintSList(int*);
voidcaidan();
voidmain()
{caidan();}
intInsertSList(int*L,inti,intx)
{/*在顺序存储结构的线性表L中第i个元素之前插人元素x,n为表长*/
intj;
if(n==MAX)
{
printf("线性表已满!
!
!
\n");
return(-1);
}
elseif(i<1||i>n+1)
{
printf("参数非法!
!
!
\n");
return(0);
}
elseif(n==0)
{
L[0]=x;
n=n+1;
printf("插入成功!
插入后线性表为:
");
PrintSList(L);
return
(1);
}
else
{
for(j=n;j>=i;j--)
L[j]=L[j-1];
L[j]=x;
n=n+1;
printf("插入成功!
插入后线性表为:
");
PrintSList(L);
return
(1);
}
}
intDeleteSList(int*L,inti)
{/*在顺序存储结构的线性表L中删除第i个元素*/
intj,y;
if(n==0)
printf("线性表是空表!
!
!
\n");
elseif(i<1||i>n)
printf("参数非法!
!
!
");
else
{
y=L[i-1];
for(j=i-1;j L[j]=L[j+1]; n=n-1; printf("删除成功! 删除后的线性表为: "); PrintSList(L); return(y); } } voidPrintSList(int*L) { intj; if(n==0) printf("线性表为空。 "); else for(j=0;j printf("%d",L[j]); printf("\n"); } voidcaidan() { intL[MAX],i,x,temp,a; while (1) { printf("请选择操作\n"); printf("\t1、插入元素\n"); printf("\t2、删除元素\n"); printf("\t3、退出\n"); scanf("%d",&a); getchar(); switch(a) { case1: printf("请输入要在哪个位置之前插入和要插入的元素(i,x): \n"); scanf("%d,%d",&i,&x); InsertSList(L,i,x); break; case2: printf("请输入要删除第几个元素: \n"); scanf("%d",&i); temp=DeleteSList(L,i); break; case3: return; default: printf("参数非法! ! 请重新输入! \n"); continue; } } } 结果: 实验二堆栈(Stack)操作 1、实验目的 堆栈及其操作可以说是计算机系统利用率最高的数据结构与算法了,在算法(程序)设 计里经常用到。 本实验的目的就是要求熟练地掌握堆栈的定义、压栈操作、出栈操作等。 2、实验内容与要求 在认真阅读下列算法的基础上,要求用C/C++语言完成算法的实现,也就是写出其源程 序,并运行程序,给出测试结果。 源程序: #include #defineMAXN10 intpush(int*stack,intmaxn,int*toppt,intx) { if(*toppt>=maxn) return1; stack[*toppt]=x; ++(*toppt); return0; } intpop(int*stack,int*toppt,int*cp) { if(*toppt==0) return1; --(*toppt); *cp=stack[*toppt]; return0; } voidOutputStack(int*stack,inttoppt) { inti; for(i=toppt-1;i>=0;i--) printf("%d",stack[i]); printf("\n"); } voidmain() { ints[MAXN],i; inttop=0; intop; while (1) { printf("请选择操作,1: 进栈2: 出栈0: 退出\n"); fflush(stdin); scanf("%d",&op); switch(op) { case0: return; case1: printf("请输入进栈元素: "); scanf("%d",&i); if(push(s,MAXN,&top,i)==0) { printf("进栈成功,栈内元素为: \n"); OutputStack(s,top); } else printf("栈满\n"); break; case2: if(pop(s,&top,&i)==0) { printf("出栈元素为: [%d],栈内元素为: \n",i); OutputStack(s,top); } else printf("栈空\n"); break; } } } 结果: 若一个程序使用多个栈时,往往事先难以估计每个栈所需容量,在实际应用中一个栈发 生“上溢”,其它栈可能还留有很多空间,可以用移动元素的方法加以调整,以达到多个栈 共享存储空间的目的。 例如,当有两个栈共享大小为SMAX的内存空间时,可以把两个栈的栈底分别设在给定内存空间的两端,然后各自向中间伸展,仅当两个栈顶相遇时才产生溢出。 这种分配方法,在每个栈的动态变化过程中,使任何一个栈的可利用的最大空间均有可能超过m/2,这不仅增加了内存空间的利用率,而且也减少每个栈溢出的可能性。 试分别写出这两个栈的操作算法与程序。 源程序: #include #include #defineMAX10 structStacknode { int*node1; int*node2; int*top1; int*top2; intsize; }; intInitstack(Stacknode&s)//构造一个空的顺序栈s { if((s.node1=(int*)malloc(MAX*sizeof(int)))==NULL) { printf("申请内存错误! "); return0; } s.top1=s.node1+1; s.size=MAX; s.node2=s.node1+s.size; s.top2=s.node2-1; return1; } intempty(Stacknode&s,inti)//判断栈是否为空 { if(i==1&&s.top1==s.node1+1||i==2&&s.top2==s.node2-1) return1; elsereturn0; } intfull(Stacknode&s)//判断栈是否已经满 { if(s.top1==s.top2)return1; elsereturn0; } intpush(Stacknode&s,inti,intx)//入栈 { if(full(s)){printf("栈满/n");return0;} else{ if(i==1){printf("插入操作成功! \n\n");*s.top1++=x;} if(i==2){printf("插入操作成功! \n\n");*s.top2--=x;} }return1; } intpop(Stacknode&s,inti,int&x)//出栈 { if(empty(s,i))return0; else{ if(i==1){printf("出栈成功! 出栈元素为: ");x=*--s.top1;} if(i==2){printf("出栈成功! 出栈元素为: ");x=*++s.top2;} }return1; } intputout(Stacknodes)//输出 { if(s.top1-1>s.node1) printf("栈1元素: "); while(s.top1-1>s.node1) {s.node1++; printf("%d\t",*s.node1); } if(s.top2+1 printf("栈2元素: "); while(s.top2+1 {s.node2--; printf("%d\t",*s.node2); } printf("\n"); return1; } voidmenue()//菜单界面 { printf("****************************************\n"); printf("\t请你选择所需要的操作\n"); printf("\t1-入栈\n\t2-出栈\n"); printf("\t3-输出\n\t4-退出\n"); printf("****************************************\n"); } voidmain() { intc,x,i; Stacknodes; Initstack(s); while(c! =4) { menue(); scanf("%d",&c); switch(c) { case1: //入栈 printf("请输入插入元素的值! "); scanf("%d",&x); printf("/n选择插入哪个栈顶! (1||2): "); scanf("%d",&i); printf("\n"); push(s,i,x); break; case2: //出栈 printf("请选择出栈元素所在的栈(1||2): "); scanf("%d",&i); printf("\n"); if(empty(s,i)){printf("此栈空! \n");break;} else{ pop(s,i,x); printf("%d\n",x); printf("\n"); break; } case3: putout(s); break; case4: printf("程序结束\n"); break; default: printf("错误操作\n"); break; } } } 结果: 实验三循环队列的实现 一、实验目的 队列也是一种非常常用的数据结构。 本实验要求学生熟练地掌握循环队列的插入与删除 操作,并在计算机上实现。 二、实验内容与要求 在认真阅读下列算法的基础上,要求用C/C++语言完成算法的实现,也就是写出其源程 序,并运行程序,给出测试结果。 源程序: #include #defineMAX11 intEnQueue(int*queue,intmax,int*head,int*tail,intx) { if((*tail+1)%max==*head) return1; *tail=(*tail+1)%max; queue[*tail]=x; return0; } intDeQueue(int*queue,intmax,int*head,int*tail,int*cp) { if(*head==*tail) return1; *head=(*head+1)%max; *cp=queue[*head]; return0; } voidOutQueue(int*queue,intmax,inth,intt) { while(h! =t) { h=(h+1)%max; printf("%d",queue[h]); } printf("\n"); } voidmain() { intq[MAX]; intq_h=0,q_t=0; intop,i; while (1) { printf("请选择操作,1: 进队,2: 出队,0: 退出"); fflush(stdin); scanf("%d",&op); switch(op) { case0: return; case1: printf("请输入进队元素: "); scanf("%d",&i); if(EnQueue(q,MAX,&q_h,&q_t,i)! =0) printf("队列满! "); else { printf("入队成功,队内元素为: \n"); OutQueue(q,MAX,q_h,q_t); } break; case2: if(DeQueue(q,MAX,&q_h,&q_t,&i)==0) { printf("出队元素为: [%d],队内元素为: \n",i); OutQueue(q,MAX,q_h,q_t); } else printf("队空! "); break; } } } 结果: 实验四链式存储结构线性表的操作 一、实验目的 链式存储结构的线性表的操作相对复杂一些,主要涉及指针的运用,这是很多学生感觉 有些困难的地方。 本实验就是针对该难点,要求学生掌握链表的构造、链表的插入和删除算 法。 并且要求链表操作算法具有较好的通用性。 二、实验内容 源程序: #include #include #defineOK1 #defineERROR0 typedefintElemType; typedefstructNode { ElemTypedata; structNode*next; }Node,*LinkList; //2.以下是菜单选择函数 intmenu_select() { intsn; printf("\n"); printf("主菜单\n"); printf("*********************\n"); printf("1.单链表的建立\n"); printf("2.单链表的结点的删除\n"); printf("3.单链表的输出\n"); printf("0.退出\n"); printf("*********************\n"); printf("请选择0---3: "); for(;;) { scanf("%d",&sn); if(sn<0||sn>3) printf("\n\t输入错误,重选? 0---3: "); else break; } returnsn; } voidInitList(LinkList*L) { *L=(LinkList)malloc(sizeof(Node)); (*L)->next=NULL; } /*voidInitList(LinkListL) { L=(LinkList)malloc(sizeof(Node)); L->next=NULL; }*/ //3.通过键盘输入链表中元素值,利用头插法建单链表L。 intCreateFromHead(LinkListL) { Node*s;intc; intflag=1; L->next=NULL; while(flag) { scanf("%d,",&c); if(c! =0) { s=(Node*)malloc(sizeof(Node)); s->data=c; s->next=L->next; L->next=s; } elseflag=0; } returnOK; } //4.在带头结点的单链表L中删除第i个元素。 intDelList(LinkListL,inti) { Node*pre,*r; intk; pre=L;k=0; while(pre->next! =NULL&&k { pre=pre->next; k=k+1; } if(! (pre->next)) { printf("DELETETHELOCATIONISNOTRIGHTFULL"); returnERROR; } r=pre->next; pre->next=pre->next->next; free(r); returnOK; } //5.输出链表中的值。 voidoutput(LinkListL) {Node*p; p=L->next; while(p! =NULL) { printf("%d",p->data); p=p->next; } return; } //6.主控菜单处理调试程序。 voidmain() { LinkListL; InitList(&L); inti; for(;;){ switch(menu_select()) { case1: printf("\n单链表的建立"); printf("请输入链表中结点的值(如: 1,2,3,.....10,0isend): \n"); CreateFromHead(L); break; case2: printf("链表结点的删除\n"); printf("请输入被删除结点的序号i: "); scanf("%d",&i); DelList(L,i); printf("\n"); break; case3: printf("输出链表中结点的值: "); output(L); printf("\n"); break; case0: printf("再见\n"); return; }//switch } } 结果: 用链表实现栈 源程序: #include #include #defineDataTypeint #defineMAXSIZE1024 typedefstruct{ DataTypedata[MAXSIZE]; inttop; }SeqStack; //栈初始化 SeqStack*Init_SeqStack(){ SeqStack*s; s=(SeqStack*)malloc(sizeof(SeqStack)); if(! s){ printf("空间不足\n"); returnNULL; } else{ s->top=-1; returns; } } //判栈空 intEmpty_SeqStack(SeqStack*s){ if(s->top==-1) return1; else return0; } //入栈 intPush_SeqStack(SeqStack*s,DataTypex){ if(s->top==MAXSIZE-1) return0;//栈满不能入栈 else { s->top++; s->data[s->top]=x; return1; } } //出栈 intPop_SeqStack(SeqStack*s,DataType*x){ if(Empty_SeqStack(s)) return0;//栈空不能出栈 else { *x=s->data[s->top]; s->top--; return1; }//栈顶元素存入*x,返回 } //取栈顶元素 DataTypeTop_SeqStack(SeqStack*s){ if(Empty_SeqStack(s)) return0;//栈空 else returns->data[s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 算法 实验 报告 各种