数据结构上机试题.docx
《数据结构上机试题.docx》由会员分享,可在线阅读,更多相关《数据结构上机试题.docx(21页珍藏版)》请在冰豆网上搜索。
数据结构上机试题
数据结构实验报告
姓名:
张盈武
学号:
5
数据结构上机试题
一、顺序表的操作
(1)插入元素操作:
将新元素x插入到顺序表a中第i个位置。
(2)删除元素操作:
删除顺序表a中第i个元素。
#include<>
#include<>
#include<>
#defineoverflow0
#definelist_size100
#defineok1
#definemaxsize80
#definelistincrement10
#defineerror1
typedefintelemtype;
typedefstruct
{
int*elem;
intlength;
intlistsize;
}list;
intinit(list&l)
{
=(int*)malloc(maxsize*sizeof(int));
if(!
return(overflow);
=0;
=list_size;
returnok;
}
voidcreate(list*l)
{
inti,n;
printf("创建一个有序表:
\n");
printf("输入元素个数:
");
scanf("%d",&n);
l->length=n;
for(i=0;i{
printf("输入第%d个元素:
",i+1);
scanf("%d",&l->elem[i]);
printf("\n");
}}
intinsert(list&l,inti,elemtype&e)
{
if(i<1||i>+1)returnerror;
elemtype*q,*p;
q=&[i-1]);
p=&[]);
for(p;p>=q;--p)*(p+1)=*p;
*q=e;
++;
returnok;}
intprintflist(listl)
{
for(inti=0;i<=;i++)
{
printf("%d",[i]);}
returnok;}
intdeletelist(list&l,inti,elemtype&e)
{
if((i<1)||(i>)returnerror;
for(i;i<=;i++)[i]=[i+1];
;
returnok;
}
intmain(){
listla;
init(la);
create(&la);
printflist(la);
printf("是否要插入元素:
(输入1为是,0否)");
ints;
scanf("%d",&s);
if(s==1)
{
printf("输入要插入的位置:
");
inti;
scanf("%d",&i);
printf("输入要插入的元素:
");
inta;
scanf("%d",&a);
insert(la,i,a);
}
printflist(la);
printf("是否要删除元素:
(1为是,0为否)");
intn;
scanf("%d",&n);
if(n==1)
{
printf("输入要删除的位置:
");
intm;
scanf("%d",&m);
printf("输入要删除的元素:
");
intw;
scanf("%d",&w);
deletelist(la,n,m);
printflist(la);
}
returnok;
}
二、单链表的操作
(1)创建一个带头结点的单链表;
(2)插入元素操作:
将新元素x插入到单链表中第i个元素之后;
(3)删除元素操作:
删除单链表中值为x的元素;
#include<>
#include<>
#include<>
#include<>
#defineerror0
#defineok1
#defineequal1
#defineoverflow-1
#definelist_size100
#definelistincrement10
#definenull0
typedefintelemtype;
typedefstructlnode
{
elemtypedata;
structlnode*next;
lnode*head;
}lnode,*linklist;
linklistinit(linklist&head)
{inti=1;
intj;
linklistl;
head=(lnode*)malloc(sizeof(lnode));
head->next=null;
l=head;
do
{
printf("请输入第%d个数:
\n",i);
l=(lnode*)malloc(sizeof(lnode));
scanf("%d",&l->data);
l->next=head->next;
head->next=l;
++i;
printf("还输吗(1位输入;0为不。
)");
scanf("%d",&j);
}while(j==1);
returnhead;}
intinsert(linklist&head,inti,inte)
{linklistp=head->next;
intj=0;
while(p&&j{
p=p->next;
++j;
}
if(!
p||j>i-1)
{
printf("error!
\n");
return0;}
linklists;
s=(linklist)malloc(sizeof(linklist));
s->data=e;
s->next=p->next;
p->next=s;
returnok;
}
intdeletenode(linklist&head,inti,elemtype&e)
{linklists;
s=head->next;
linklistq;
intj=0;
while(s->next&&j{
s=s->next;
++j;
}
if(!
s||j>i-1)
{
printf("该元素不存在!
");
return0;
}
q=s->next;
e=q->data;
s->next=q->next;
free(q);
returnok;
}
intprint(linklist&head)
{linklistl;
l=head->next;
do
{
printf("%d",l->data);
l=l->next;}while(l!
=null);
printf("\n");
returnok;}
main()
{linklistla;
init(la);
print(la);
printf("输入要插入的位置:
\n");
inti;
scanf("%d",&i);
printf("请输入该元素:
\n");
inte;
scanf("%d",&e);
insert(la,i,e);
print(la);
printf("输入要删除的元素位置:
\n");
inta;
scanf("%d",&a);
printf("输入要删除的元素:
\n");
intk;
scanf("%d",&k);
deletenode(la,a,k);
print(la);
}
三、在顺序栈上实现将非负十进制数转换成二进制数。
#include<>
#include<>
#defineok1
#defineerror0
#definenull0
typedefintelemtype;
staticintk=0;
typedefstructsnode
{
elemtypedata;
snode*next;
}snode,*linkstack;
linkstackpush(linkstack&top,elemtypee)
{top=(linkstack)malloc(sizeof(snode));
top->next=null;
snode*p;
p=(snode*)malloc(sizeof(snode));
p=top;
p->data=e;
top->next=p;
returntop;}
linkstackpop(linkstack&top)
{
if(!
top->next)
{
printf("error");
returnerror;
}
inte=top->data;
linkstackh=top;
top=top->next;
printf("%d",e);
free(h);
returntop;
}
intter(linkstack&top,inti)
{intj=0,f=0;
do{
j=i%2;
i=i/2;
push(top,j);
f++;
}while(i!
=0);
returnok;}
main()
{linkstackla;
printf("输入一个十进制的数:
\n");
inti;
scanf("%d",&i);
ter(la,i);
pop(la);
pop(la);
}
四、在顺序表中采用顺序查找算法和折半查找算法寻找关键字X在顺序表中的位置。
#include<>
typedefstruct
{
charkey;
intdata;
}sequenlist;
intsequensearch(sequenlistl[],intn,charkey)
{
inti=1;
intposition;
intcounter=1;
while(i<=n)
{
if(l[i-1].key==key)
{
position=i;
break;
}
elseposition=-1;
i++;
counter++;
}
returnposition;
}
voidmain()
{
sequenlists[4];
chartemp;
s[0].key='b';
s[0].data='1';
s[1].key='a';
s[1].data='2';
s[2].key='c';
s[2].data='3';
s[3].key='d';
s[3].data='4';
printf("输入关键字:
(a,b,c,d)\n");
scanf("%c",&temp);
intpos=sequensearch(s,4,temp);
if(pos!
=-1)
printf("该数位置为%d,值为:
%c",pos,s[pos-1].data);
elseprintf("没有");
}
#include<>
#include<>
typedefstruct
{
int*elem;
intlength;
}st;
intsearch(stl,intkey)
{
intlow=1;
intmid;
inthigh=;
while(low<=high)
{
mid=(low+high)/2;
if(key==[mid])
returnmid;
else{
if(key<[mid])
high=mid-1;
elselow=mid+1;
}}
return0;
}
voidmain()
{intkk;
stl;
=(int*)malloc(10*sizeof(int));
=10;
for(inti=0;i<10;i++){
printf("输入第%d个数:
\n",i+1);
scanf("%d",&[i]);}
printf("输入要查找的数:
\n");
scanf("%d",&kk);
intpos=search(l,kk);
if(pos)printf("位置为:
%d,值为:
%d",pos+1,[pos]);
elseprintf("没有");
}
五、将无序数列使用直接插入排序算法和快速排序算法将其排成递增有序数列。
#include<>
voidinputdata(intlist[],intn)
{
printf("输入数据:
\n");
for(inti=0;iscanf("%d",&list[i]);
}
voidoutputdata(intlist[],intn)
{
printf("当前序列为:
\n");
for(intk=0;kprintf("%d\n",list[k]);
}
voidsort(intlist[],intn)
{
inti,j;
inttemp;
for(i=0;i{
temp=list[i];
j=i-1;
while(temp{
list[j+1]=list[j];
j--;
}
list[j+1]=temp;
}
}
voidquicksort(intlist[],intstart,intend)
{
inti=start;
intj=end;
inttemp;
intvalue=list[start];
if(start{
do
{
while(i<=end&&list[i]<=value)i++;
while(j>start&&list[j]>=value)j--;
if(i{
temp=list[i];
list[i]=list[j];
list[j]=temp;
}
}while(itemp=list[start];
list[start]=list[j];
list[j]=temp;
quicksort(list,start,j-1);
quicksort(list,j+1,end);
}
}
voidmain()
{
intnum;
intlist[20];
printf("输入数据长度(少于20)\n");
scanf("%d",&num);
inputdata(list,num);
printf("输入排序方式:
(1为简单排序,2为快速排序)\n");
intk;
scanf("%d",&k);
if(k=1){
sort(list,num);
}else
quicksort(list,0,num-1);
outputdata(list,num);
}