数据结构及算法试验参考指导书样本Word格式.docx
《数据结构及算法试验参考指导书样本Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构及算法试验参考指导书样本Word格式.docx(36页珍藏版)》请在冰豆网上搜索。
printf("
请输入x的值:
"
);
scanf("
%d"
&
x);
p=locate(&
b,x);
if(p==-1)
printf("
no!
else
position=%d\n"
p);
时间复杂度T(n)=O(n);
2、#include<
/*编写函数,实现在顺序表中删除第i个位置上的元素,编写主函数验证此算法,并分析算法的时间复杂度*/
intdelete(list*l,inti)
intj,k,p;
//定义一个用来保存被删原素;
if(i>
=0&
&
last)//只接受有效输入
{
for(j=0;
j<
j++)//遍历数组
if(j==i-1)//匹配
{
p=l->
data[j];
//保存被删原素;
for(k=j;
k<
k++)//前进一位;
{
l->
data[k]=l->
data[k+1];
}
break;
//退出循环
}
l->
last=l->
last-1;
returnp;
//对于此题来说可以输出p;
}
return0;
intx,i;
if(delete(&
b,x)!
=0)
for(i=0;
printf("
%3d"
[i]);
Error!
//时间复杂度T(n)=O(n);
3、#include<
/*编写函数,实现在顺序表中第i个位置上插入值为x的元素,编写主函数验证此算法,并分析算法的时间复杂度*/
intinsert(list*l,intx,inti)
intj,k;
if(i<
=l->
last+1&
i>
0)
if(i==l->
last+1)//特殊值last+1要插入到整个数组之后
{
data[l->
last]=x;
}
else
for(j=0;
j++)
if(j==i-1)//匹配
for(k=l->
k>
j;
k--)//将所选插入位置之后原素后移
{
l->
data[k-1];
}
data[j]=x;
//把x赋值给所选位置
break;
}
l->
last+1;
//数值长度加一
return1;
//无效位置
if(insert(&
b,66,x)!
4、
#include<
/*编写函数,实现在顺序表中将所有偶数排在所有奇数前面,编写主函数验证此算法,并分析算法的时间复杂度*/
voidfun(list*l)
{//这个代码有点晦涩,但空间时间复杂度是鸡儿低
inti,ou=0,temp;
//i计数,ou代表偶数个数
i++)//循环
data[i]%2==0)//判断是不是偶数,如果是偶数的话和当前第ou个位置的原素交换位置
{
temp=l->
data[ou];
data[ou]=l->
data[i];
data[i]=temp;
ou+=1;
//偶数个数加一
当前数组中偶数有%d个,奇数有%d个:
\n"
ou,l->
last-ou);
inti=0,m=0;
请输入数组元素的值:
[%d]="
i);
scanf("
[i]);
fun(&
b);
//时间复杂度为T(n)=O(n);
四、实验报告要求
1、撰写实验报告;
2、对实验中出现的问题和结果进行总结。
实验二链表的实现和应用
1、掌握链表的定义;
2、掌握链表的基本操作,如查找、插入、删除、排序等。
1、单链表的创建
2、单链表的查找
3、单链表的排序
4、单链表的删除
5、链表的应用--约瑟夫环问题
1、//创建单链表,要求:
结点个数为n个,每个节点数据域的值必须小于m。
编辑主函数验证之。
typedefstructaa
{intdata;
structaa*next;
}NODE;
NODE*Creatlink(intn,intm)
NODE*tou,*p;
//tou头结点
tou=(NODE*)malloc(sizeof(NODE));
//创建并初始化头结点
tou->
next=NULL;
tou->
data=n;
请输入%d个小鱼%d的数,中间用空格隔开:
n,m);
n;
i++)//头插法
p=(NODE*)malloc(sizeof(NODE));
p->
data);
if(p->
data>
=m)
输入的第%d个数据大于%d,GG\n"
i+1,m);
exit(0);
//程序强制中断,
p->
next=tou->
next;
tou->
next=p;
returntou;
outlink(NODE*h)
{NODE*p;
p=h->
\n\nTHELIST:
\n\nHEAD"
while(p)
{printf("
->
%d"
p->
p=p->
{NODE*head;
head=Creatlink(8,22);
outlink(head);
2、//查找值为ch的节点在链表中是否出现,如果存在,返回在链表中位序,如果不存在返回0
#defineN8
typedefstructlist
structlist*next;
}SLIST;
SLIST*creatlist(char*);
voidoutlist(SLIST*);
intfun(SLIST*h,charch)
SLIST*p;
//p赋值为寿元节点
N;
data==ch)
p=p->
{SLIST*head;
intk;
charch;
chara[N]={'
m'
'
p'
g'
a'
w'
x'
r'
d'
};
head=creatlist(a);
outlist(head);
Enteraletter:
%c"
ch);
k=fun(head,ch);
if(k==0)printf("
\nNotfound!
elseprintf("
Thesequencenumberis:
%d\n"
k);
SLIST*creatlist(char*a)
SLIST*tou,*p;
tou=(SLIST*)malloc(sizeof(SLIST));
//创建并初始化头结点
data=N;
i++)//前叉法
p=(SLIST*)malloc(sizeof(SLIST));
data=a[i];
voidoutlist(SLIST*h)
{SLIST*p;
if(p==NULL)printf("
\nThelistisNULL!
\nHead"
do
while(p!
=NULL);
End\n"
3、//去偶操作,链表中各节点按数据域递增有序链接,函数fun的功能是,删除链表中数据域值相同的节点,使之只保留一个
voidfun(SLIST*h)
SLIST*p,*shanchu;
//用于遍历的指针p,用于删除的指针shanchu
/p为寿元节点
while(p->
next!
=NULL)//终止条件
data==p->
next->
data)//判断是否有重复原素
shanchu=p->
p->
next=shanchu->
free(shanchu);
p=p->
SLIST*creatlist(int*a)
{SLIST*h,*p,*q;
h=p=(SLIST*)malloc(sizeof(SLIST));
i<
i++)
{q=(SLIST*)malloc(sizeof(SLIST));
q->
p->
next=q;
p=q;
next=0;
returnh;
do{printf("
}while(p!
main()
inta[N]={1,2,2,3,4,4,4,5};
\nThelistbeforedeleting:
fun(head);
\nThelistafterdeleting:
4、//在main函数中多次调用fun函数,每调用一次fun函数,输出链表尾部节点中的数据,并释放该节点,使得链表缩短。
voidfun(SLIST*p)
SLIST*bianli,*shanchu;
//遍历,删除
bianli=p;
while(bianli->
=NULL)
bianli=bianli->
}
bianli->
//输出
shanchu=bianli->
//释放
free(shanchu);
bianli->
inta[N]={11,12,15,18,19,22,25,29};
\nOutputfromhead:
\nOutputfromtail:
\n"
while(head->
next!
=NULL){
\n\n"
\nOutputfromheadagain:
5、实现约瑟夫环函数(选做)
SLIST*creatlist(intm)
{
SLIST*tou,*p,*wei;
//头指针生成节点指针尾指针
//头节点
wei=tou;
请输入%d个数用空格隔开:
m);
m;
i++)//尾插法
wei->
wei=p;
wei->
//令最后一个原素指向首元结点成环
voidoutlist(SLIST*h,intm,intc)
//用于遍历的指针p,用于删除的指针shanchu
//p指向首元结点
=p->
next)//当环中只剩下一个原素时结束
for(i=1;
c-1;
i++)//根据输入的c剔除节点
shanchu=p->
//shanchu指向当前要剔除的节点
shanchu->
//将shanchu指针指向的节点出环
free(shanchu);
//输出最后的一个节点的内容
free(p);
free(h);
intm,c;
请分别输入m和c的值:
%d,%d"
m,&
c);
head=creatlist(m);
outlist(head,m,c);
实验三栈的实现和应用
1、掌握栈的建立方法;
2、掌握栈的基本操作,如入栈、出栈、判断空栈等;
3、栈的应用。
1、顺序栈的初始化
2、判断栈是否为空
3、顺序栈出栈
4、顺序栈入栈
5、栈的应用--汉诺塔
1、栈的基本操作,按提示将函数补充完整
#defineSTACK_MAX100
inttop;
intdata[STACK_MAX];
}stack;
voidinit(stack*st)/*初始化顺序栈*/
st->
top=0;
intEmpty(stack*st)/*判断栈是否为空*/
if(st->
top==0)
return0;
//空0
else
//非空1
intpop(stack*st)/*出栈*/
returnst->
data[--st->
top];
voidpush(stack*st,intdata)/*入栈*/
data[st->
top++]=data;
intmain(void)
stackst;
init(&
st);
push(&
st,5);
st,6);
pop(&
st));
voidmain()
voidhanoi(intn,charone,chartwo,charthree);
/*对hanoi函数的声明*/
intm;
inputthenumberofdiskes:
m);
Thesteptomoveing%ddiskes:
hanoi(m,'
A'
B'
C'
voidhanoi(intn,charone,chartwo,charthree)
/*定义hanoi函数,将n个盘从one座借助two座,移到three座*/
statick=1;
//定义静态变量k用来标明走了多少步
voidmove(charx,chary);
//因为move函数定义在该函数的后边且之前咩有声明在此需要提前声明才能使用
if(n==1)//当第一个座上仅剩一个盘的时候将此盘移到第三个上
第%d步:
k++);
//输出是第多少步
move(one,three);
//移动
hanoi(n-1,one,three,two);
//将前n-1个盘从第一个座移到二个座上,第三个座当桥