注意:现在偷的懒以后都要补回来的!
希望大家认真学好数据结构,不希望后悔!
- 顺序表基础练习
【问题描述】
要求使用插入元素方法建立顺序表,通过查询方法找到输入的元素值,并删除第一个等于输入值的元素,最后输出表中元素。
【输入形式】
第一行输入顺序表长度N,
第二行输入N个元素
第三行输入待查找删除的元素。
【输出形式】
输出删除元素后的顺序表。
【样例输入1】
5
10 12 14 18 12
12
【样例输出1】
10 14 18 12
【样例输入2】
3
10 18 12
13
【样例输出2】
10 18 12
#include <stdio.h>
int main()
{
int n,m;
scanf("%d",&n);
int b[n];
for(int i=0;i<n;i++){
scanf("%d",&b[i]);
}
scanf("%d",&m);
int k,flag=0;
for (int i = 0; i < n; i++){
if (m==b[i]){
k=i;
flag=1;
break;
}
}
if (flag){
for (int i = k; i < n; i++){
b[i]=b[i+1];
}
n--;
}
for(int i=0;i<n;i++){
printf("%d ",b[i]);
}
return 0;
}
- 顺序表实现集合差集
【问题描述】
设两个集合A、B用顺序表表示,求A-B。
【输入形式】
第一行输入两个整数N、M(大于0小于100),分别表示两个集合的长度;
第二行输入第一个集合的N个元素;
第三行输入第二个集合的M个元素;
【输出形式】
输出第一个集合和第二个集合的差集。(若差集为空集,则输出*)
【样例输入1】
5 4
4 23 -9 30 6
23 45 6 2
【样例输出1】
4 -9 30
【样例输入2】
4 6
10 20 30 40
10 20 30 40 50 60
【样例输出2】
*
#include <stdio.h>
int main()
{
int n,m;
scanf("%d %d",&n,&m);
int a[n],b[m];
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<m;i++){
scanf("%d",&b[i]);
}
int flag=0,count=1;
for (int i = 0; i < n; i++){
int j;
for(j=0;j<m;j++){
if (a[i]==b[j]){
flag++;
count=0;
break;
}
}
if(count){
printf("%d ",a[i]);
}
count=1;
}
if (flag==n){
printf("*");
}
return 0;
}
- 将顺序表非零元素依次移到表的前端
【问题描述】
将顺序表中所有非零元素依次移到表的前端。
【输入形式】
第一行输入整数N表示表长;
第二行输入N个整数,可包含零。
【输出形式】
输出将非零元素移到前端的表中元素,以空格作为分隔。
【样例输入】
6
2 0 -1 0 5 8
【样例输出】
2 -1 5 8 0 0
【评分标准】
用一个函数实现该方法。
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<n;i++){
if(a[i]==0){
for(int j=i;j<n-1;j++){
a[j]=a[j+1];
}
a[n-1]=0;
}
}
for (int i = 0; i < n; i++){
printf("%d ",a[i]);
}
return 0;
}
- 递增顺序表插入
【问题描述】
设有递增有序顺序表,实现其插入元素后依然有序。
【输入形式】
第一行输入一个N(N不大于100);
第二行输入N个整数(假设输入序列按照递增顺序,以空格分隔);
第三行输入一个整数M(欲插入数据);
【输出形式】
输出插入M后的顺序表。
【样例输入】
5
12 25 35 98 125
77
【样例输出】
12 25 35 77 98 125
【评分标准】
功能实现要求写成算法函数形式,并利用顺序表基本操作。
#include<stdio.h>
int main(){
int n,i,k,t;
scanf("%d",&n);
int sum[n];
for(i=0;i<n;i++){
scanf("%d",&sum[i]);
}
scanf("%d",&k);
if(k<=sum[n-1]){
for(i=0;i<n;i++){
if(k<=sum[i]){
t=i;
break;
}
}
for(i=n;i>=t;i--){
sum[i]=sum[i-1];
}
n++;
sum[t]=k;
}
else{
sum[n]=k;
n++;
}
for(i=0;i<n;i++){
printf("%d ",sum[i]);
}
}
- 约瑟夫环问题(顺序表实现)
【问题描述】
约瑟夫环问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀的顺序是:5,4,6,2,3,1。
【输入形式】
输入两个正整数N和M,N表示N个人,M表示报数到M;
【输出形式】
输出依次出列的序号。以空格作为分隔。
【样例输入1】
6 5
1 2 3 4 5 6
【样例输出1】
5 4 6 2 3 1
【样例输入2】
3 3
3 2 1
【样例输出2】
1 3 2
#include<stdio.h>
int main()
{
int n,m,r;
int i,j=0,s=0,l;
scanf("%d %d",&n,&m);
int a[n],b[n];
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
a[n]=-1;
for(i=0;j!=n;i++){
if(a[i]==-1){
i=0;
}
if(a[i]!=0 && a[i]!=-1){
s++;
}
if(s==m){
b[j]=a[i];
a[i]=0;
j++;
s=0;
}
}
for(i=0;i<n;i++){
printf("%d ",b[i]);
}
return 0;
}