数据结构上机试题.docx
《数据结构上机试题.docx》由会员分享,可在线阅读,更多相关《数据结构上机试题.docx(18页珍藏版)》请在冰豆网上搜索。
数据结构上机试题
数据结构上机试题
一、顺序表的操作
(1)插入元素操作:
将新元素x插入到顺序表a中第i个位置。
(2)删除元素操作:
删除顺序表a中第i个元素。
#include
#include
#defineMAX100;
typedefstruct{
intdata[100];
intlength;
}sqlist;
voidinit(sqlist&a)//线性表初始化
{
a.length=0;
}
voidinsert(sqlist&a,inti,intx)//插入元素操作
{
intj;
if(i<0||i>a.length+1||a.length==100)
;
else{
for(j=a.length+1;j>i;j--)
a.data[j]=a.data[j-1];
a.data[j]=x;
a.length++;
}
}
voiddeleted(sqlist&a,inti)//删除元素操作
{
intj;
if(i<0&&i>a.length)
;
else
{
for(j=i;ja.data[j]=a.data[j+1];
a.length--;
}
}
voidmain()
{
sqlista;//线性表为a
inti,e,x,n,j,s;//i插入位置,e动态建线性表要用,X插入元素,n表长
init(a);//构造一个空表
cout<<"输入表长n:
";
cin>>n;
cout<<"输入表长为"<";
for(j=0;j{
cin>>e;
insert(a,j,e);
}
cout<<"插入前:
";
for(j=0;jcout<cout<<"输入要插入位置i:
";
cin>>i;
cout<<"输入要插入的元素x:
";
cin>>x;
cout<<"打算在第"<
insert(a,i-1,x);//由于从0开始,要构造显示从一开始,所以减1
cout<<"插入后结果:
";
for(j=0;jcout<cout<<"输入要删除的位置s:
";
cin>>s;
deleted(a,s-1);//由于从0开始,要构造显示从一开始,所以减1
cout<<"删除后结果:
";
for(j=0;jcout<}
二、单链表的操作
(1)创建一个带头结点的单链表;
(2)插入元素操作:
将新元素x插入到单链表中第i个元素之后;
(3)删除元素操作:
删除单链表中值为x的元素;
#include
#include
typedefstructLNode
{
intdata;
structLNode*next;
}LNode;
//创建一个带头结点的长度长度长度为n的链表L;
voidcreatelist(LNode*&L,intn)
{
inti;
LNode*p;
L=(LNode*)malloc(sizeof(LNode));
L->next=NULL;
for(i=1;i<=n;i++)
{
p=(LNode*)malloc(sizeof(LNode));
cout<<"请输入链表第"<
cin>>p->data;
p->next=L->next;
L->next=p;
}
}
//插入元素操作:
将新元素x插入到单链表L中第i个元素之后
voidinsert(LNode*&L,inti,intx)
{
intj=0;
LNode*p,*q;
p=L;
while(p->next!
=NULL)
{
j++;
if(j==i)
{
q=(LNode*)malloc(sizeof(LNode));//找到位置
q->data=x;//放入数据
q->next=p->next;
p->next=q;
break;
}
p=p->next;
}
if(p->next==NULL)
{
q=(LNode*)malloc(sizeof(LNode));//找到位置
q->data=x;//放入数据
q->next=p->next;
p->next=q;
}
}
//删除元素操作:
删除单链表中值为x的元素;
voiddeleted(LNode*&L,intx)
{
LNode*p,*q;
p=L;
while(p->next!
=NULL)
{
if(p->next->data==x)
{
q=p->next;
p->next=p->next->next;
free(q);
}
p=p->next;
}
}
voidprint(LNode*&L)
{
LNode*p;
p=L->next;
while(p!
=NULL)
{
cout<data<<"";
p=p->next;
}
}
voidmain()
{
LNode*L,*p;//节点为L
inti,x,y,s,n;//i插入位置,X插入元素,y为删除元素,n表长
cout<<"输入表长n:
";
cin>>n;
createlist(L,n);
cout<<"输出插入之前:
";
print(L);
cout<<"请输入插入的位置i:
";
cin>>i;
cout<<"请输入插入的元素x:
";
cin>>x;
insert(L,i,x);
cout<<"输出插入后:
";
print(L);
cout<<"请输入删除的元素y:
";
cin>>y;
deleted(L,y);//删除元素操作:
删除单链表中值为y的元素;
cout<<"输出删除后:
";
print(L);
}
三、在顺序栈上实现将非负十进制数转换成二进制数
#include
#include
#defineMAX100
//在顺序栈上实现将非负十进制数x转换成二进制数
voidconversion(int&x)
{
intstack[MAX];
inttop=-1;
intt;
while(x)
{
stack[++top]=x%2;
x=x/2;
}
while(top!
=-1)
{
t=stack[top--];
cout<}
}
voidmain()
{
intx,t;
cout<<"请输入你要转换的非负十进制数x:
"<cin>>x;
cout<<"输出转换后的二进制数:
";
conversion(x);
cout<}
四、在顺序表中采用顺序查找算法和折半查找算法寻找关键字X在顺序表中的位置。
#include
#include
#defineMAX100
//在顺序表中采用顺序查找算法和折半查找算法寻找关键字X在顺序表中的位置
typedefstruct
{
intdata[MAX];
intlength;
}sqlist;
voidinit(sqlist&a)//线性表初始化
{
a.length=0;
}
voidinsert(sqlist&a,inti,intx)//插入元素操作
{
intj;
if(i<0||i>a.length+1||a.length==100)
;
else{
for(j=a.length+1;j>i;j--)
a.data[j]=a.data[j-1];
a.data[j]=x;
a.length++;
}
}
intsearch(sqlist&sq,intx)//顺序查找算法
{
inti;
for(i=0;iif(sq.data[i]==x)
returni;
}
inthsearch(sqlist&sq,intlow,inthigh,intx)//折半查找算法
{
intmid;
while(low<=high)
{
mid=(low+high)/2;
if(sq.data[mid]==x)
returnmid;
elseif(sq.data[mid]>x)
high=mid-1;
elseif(sq.data[mid]low=mid+1;
}
}
voidmain()
{
sqlistsq;//线性表为sq
inti,e,x,y,n;//i插入位置,x,y要查找元素,n表长
init(sq);//构造一个空表
cout<<"输入表长n:
";
cin>>n;
cout<<"输入表长为"<";
for(i=0;i{
cin>>e;
insert(sq,i,e);
}
cout<<"查找前(便于判断):
"<for(i=0;icout<cout<cout<<"采用顺序查找算法:
"<cout<cout<<"输入要查找元素关键字x";
cin>>x;
cout<cout<<"关键字"<cout<<"采用折半查找算法:
"<cout<cout<<"输入要查找元素关键字y";
cin>>y;
cout<cout<<"关键字"<}
五、将无序数列使用直接插入排序算法和快速排序算法将其排成递增有序数列。
#include
#include
#defineMAX100
//将无序数列使用直接插入排序算法和快速排序算法将其排成递增有序数列
typedefstruct
{
intdata[MAX];
intlength;
}sqlist;
voidinit(sqlist&a)//线性表初始化
{
a.length=0;
}
voidinsert(sqlist&a,inti,intx)//插入元素,构造无序数列
{
intj;
if(i<0||i>a.length+1||a.length==100)
;
else{
for(j=a.length+1;j>i;j--)
a.data[j]=a.data[j-1];
a.data[j]=x;
a.length++;
}
}
//将哨兵放在a.data[n]中,被排序的记录放在a.data[0..n-1]中,直接插入排序算法。
voidinsertsort(sqlist&a)//直接插入排序算法
{
inti,j;
intn=a.length;
for(i=n-2;i>=0;i--)
if(a.data[i]>a.data[i+1])
{
a.data[n]=a.data[i];//a.data[n]是哨兵
j=i+1;
do{
a.data[j-1]=a.data[j];
j++;
}while(a.data[j]a.data[j-1]=a.data[n];
}
}
intPartition(sqlist&a,inti,intj)
{
intpivot=a.data[i];
while(i{
while(i=pivot)
j--;
if(ia.data[i++]=a.data[j];
while(ii++;
if(ia.data[j--]=a.data[i];
}
a.data[i]=pivot;
returni;
}
voidQuickSort(sqlist&a,intlow,inthigh)//快速排序
{
intpivotpos;//划分后的基准记录的位置
if(low{//仅当区间长度大于1时才须排序
pivotpos=Partition(a,low,high);
QuickSort(a,low,pivotpos-1);
QuickSort(a,pivotpos+1,high);
}
}
voidmain()
{
sqlistsq1,sq2;//线性表为sq1,sq2
inti,e,x,n1,n2;//n表长
init(sq1);//构造一个空表
cout<<"输入表长n1:
";
cin>>n1;
cout<<"输入表长为"<";
for(i=0;i{
cin>>e;
insert(sq1,i,e);//插入元素,构造无序数列
}
cout<<"无序数列为:
"<for(i=0;icout<cout<insertsort(sq1);
cout<<"直接插入排序后数列为:
"<for(i=0;icout<cout<cout<cout<init(sq2);//构造一个空表
cout<<"输入表长n2:
";
cin>>n2;
cout<<"输入表长为"<";
for(i=0;i{
cin>>e;
insert(sq2,i,e);//插入元素,构造无序数列
}
cout<<"无序数列为:
"<for(i=0;icout<cout<QuickSort(sq2,0,n2-1);
cout<<"快速排序后数列为:
"<for(i=0;icout<cout<}