7-1 顺序表的建立及遍历
读入n值及n个整数,建立顺序表并遍历输出。
输入格式:
读入n及n个整数
输出格式:
输出n个整数,以空格分隔(最后一个数的后面没有空格)。
输入样例:
在这里给出一组输入。例如:
4
-3 10 20 78
输出样例:
在这里给出相应的输出。例如:
-3 10 20 78
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int a[n];
int i;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
if(i==n-1)
printf("%d",a[i]);
else printf("%d ",a[i]);
}
}
7-2 递增有序顺序表的插入
实验目的:1、掌握线性表的基本知识 2、深入理解、掌握并灵活运用线性表。3、熟练掌握线性表的存储结构及主要运算的实现
已知顺序表L递增有序,将X插入到线性表的适当位置上,保证线性表有序。。
输入格式:
第1行输入顺序表长度,第2行输入递增有序的顺序表,第3行输入要插入的数据元素X。
输出格式:
对每一组输入,在一行中输出插入X后的递增的顺序表。
输入样例:
在这里给出一组输入。例如:
5
1 3 5 7 9
6
输出样例:
在这里给出相应的输出。例如:
1,3,5,6,7,9,
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int a[n+1];
int i,x,j,t;
for(i=0;i<n+1;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n+1;i++)
{
for(j=0;j<n-i;j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
for(i=0;i<n+1;i++)
{
printf("%d,",a[i]);
}
return 0;
}
7-3 顺序表(删除)
已知一组数据,采用顺序存储结构存储,其中所有的元素为整数。设计一个算法,删除元素值在[x,y]之间的所有元素
输入格式:
输入包含三行数据,第一行是表中元素个数,第二行是顺序表的各个元素,第三行是区间x和y。
输出格式:
删除元素值在[x,y]之间的所有元素后,输出新的顺序表。(最后无空格)
输入样例:
在这里给出一组输入。例如:
10
55 11 9 15 67 12 18 33 6 22
10 20
输出样例:
在这里给出相应的输出。例如:
55 9 67 33 6 22
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int a[n];
int i,flag[n],x,y;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
flag[i]=0;
}
scanf("%d %d",&x,&y);
for(i=0;i<n;i++)
{
if(a[i]>=x&&a[i]<=y) flag[i]=1;
}
int k=0,b[n];
for(i=0;i<n;i++)
{
if(flag[i]==0)
{
b[k]=a[i];
k++;
}
}
for(i=0;i<k;i++)
{
if(i==k-1)printf("%d",b[i]);
else printf("%d ",b[i]);
}
return 0;
}
7-4 数组元素循环右移n位
从键盘接收两个整数m和n,分别表示一维整型数组的元素个数,和要向移动的位数。已知0<m<=100,以及n>0。
在用户输入m和n后,第二行输入相应个数的数组元素。
程序要实现的功能是,让数组元素往右移动n位。
例如,数组的5个元素是:1,2,3,4,5。
往右移动1位后:5,1,2,3,4
往右移动2位后:4,5,1,2,3
输入格式:
第一行输入两个整数,第二行输入数组元素。
输出格式:
移动后,数组的每一个元素,注意每个数组元素后有且仅有一个空格。
输入样例:
第一行的数据5和2,表示数组容量为5,让数组元素往右移动2个位置。
第二行是数组的每一个元素的值。
5 2
1 2 3 4 5
输出样例:
输出移动后的数组元素值,注意每个元素后有且仅有一个空格。
4 5 1 2 3
#include<stdio.h>
void inversion(int *a,int s,int e)
{
int i,j,t;
int m=(s+e)/2;
for(i=s,j=e;i<m,j>m;i++,j--)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
int main()
{
int n,m,i;
scanf("%d %d",&n,&m);
int a[n];
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
if(n>=m)
{
inversion(a,1,n);
inversion(a,1,m);
inversion(a,m+1,n);
}
if(n<m)
{
int l;
l=m%n;
inversion(a,1,n);
inversion(a,1,l);
inversion(a,l+1,n);
}
for(i=1;i<=n;i++) printf("%d ",a[i]);
return 0;
}
7-5 单词逆置
输入一个可能包含若干(至少1个)单词的句子(可以假设每个单词之间有且仅有一个空格,标点符号视为单词的组成部分),输出每个单词逆置后的英文句子(参看样例输出)。
输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据输入一个字符串(长度不超过80),表示英文句子。
输出格式:
对于每组测试,输出每个单词逆置后的英文句子。
输入样例:
1
emoclew era uoY
输出样例:
welcome are You
#include<stdio.h>
#include<string.h>
void inversion(char *a,int s,int e)
{
int i,j;
char t;
int m=(s+e)/2;
for(i=s,j=e;i<m,j>m;i++,j--)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
int main()
{
int t;
scanf("%d",&t);
getchar();
while(t--)
{
int n;
char a[81];
gets(a);
n=strlen(a);
int i,begin=0;
for(i=0;i<n;i++)
{
if((a[i]==' ')&&i!=n-1)
{
inversion(a,begin,i-1);
begin=i+1;
}
if(i==n-1)
{
inversion(a,begin,i);
}
}
puts(a);
}
return 0;
}
7-6 最大子列和问题
给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+1, ..., Nj },其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。
本题旨在测试各种不同的算法在各种数据情况下的表现。各组测试数据特点如下:
- 数据1:与样例等价,测试基本正确性;
- 数据2:102个随机整数;
- 数据3:103个随机整数;
- 数据4:104个随机整数;
- 数据5:105个随机整数;
输入格式:
输入第1行给出正整数K (≤100000);第2行给出K个整数,其间以空格分隔。
输出格式:
在一行中输出最大子列和。如果序列中所有整数皆为负数,则输出0。
输入样例:
6
-2 11 -4 13 -5 -2
输出样例:
20
#include<stdio.h>
int a[100001]={0};
int sum=0;
int max(int a,int b)//max函数比较大小
{
if(a>b) return a;
else return b;
}
int max_function(int l,int r)//分治求最大字段和函数
{
if(l==r)//若左等于右,表示递归结束
{
if(a[l]>0)//如果数据大于零,就将sum初始化为此数据
sum=a[l];
else
sum=0;//如果小于0,和为0
}
else//分治函数的主要部分
{
int mid=(l+r)/2;//将数组一分为二进行分治,mid为数组下标中间值
int leftres=max_function(l,mid);//左半部分遍历
int rightres=max_function(mid+1,r);//右半部分遍历
int s=0;
for(int i=l;i<=r;i++)//遍历结束后,从最左边开始,到最右边,不断将sum与s进行比较
{
if(s+a[i]>0)//s相当于从最左加到最右,分治法需要有三个结果进行比较,左半部分的sum,右半部分的sum,以及一部分处于左边,一部分处于右边的子段构成的子段和s
sum=max(sum,s=s+a[i]);
else
s=0;
}
sum=max(sum,leftres);//sum与s比较完之后与左半部分比较
sum=max(sum,rightres);//sum与左半部分比较完后与右半部分比较
}
return sum;//返回最大值
}
int main()
{
int n,res;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
res=max_function(0,n-1);
printf("%d",res);
return 0;
}
7-7 一元多项式的乘法与加法运算
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0
。
输入样例:
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
输出样例:
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0
#include<stdio.h>
#define max 10000
int a1[max];
int a2[max];
int mul[max];
int sum[max];
int main(){
int t,f;//以下操作实现以指数值为数组底数,以相应系数为数组值
scanf("%d",&t);
int xi,mi;
while(t--){
scanf("%d %d",&xi,&mi);
a1[mi]=xi;
}
scanf("%d",&f);
while(f--){
scanf("%d %d",&xi,&mi);
a2[mi]=xi;
}
for(int i=0;i<max;i++){//以下操作实现相同叠加指数系数乘积之和
if(a1[i]){
for(int j=0;j<max;j++){
if(a2[j]){
mul[i+j]=mul[i+j]+a1[i]*a2[j];
}
}
}
}
for(int i=0;i<max;i++){//以下操作实现相同指数系数加和
if(a1[i])
sum[i]+=a1[i];
}
for(int i=0;i<max;i++){
if(a2[i])
sum[i]+=a2[i];
}
int count=0;//判定条件
for(int i=max-1;i>=0;i--){//一定要从大到小输出,因为要求指数递降
if(mul[i]){
if(count!=0)//如果mul存在且count不为0,输出空格
printf(" ");
printf("%d %d",mul[i],i);
count++;//相当于实现了第一组数字前提无空格,后续输出空格+数字+空格+数字的形式
}
}
if(count==0)
printf("0 0");//0多项式输出0 0
printf("\n");
count=0;
for(int i=max-1;i>=0;i--){//加法解释与乘法差不多
if(sum[i]){
if(count!=0)
printf(" ");
printf("%d %d",sum[i],i);
count++;
}
}
if(count==0)
printf("0 0");
return 0;
}
7-8 合并有序数组
分数 10
全屏浏览题目
切换布局
作者 伍建全
单位 重庆科技学院
给定2个非降序序列,要求把他们合并成1个非降序序列。假设所有元素个数为N,要求算法的时间复杂度为O(N)。
输入格式:
输入有4行。
第1行是一个正整数m,表示第2行有m个整数,这些整数构成一个非降序序列,每个整数之间以空格隔开。第3行是一个正整数n,表示第4行有n个整数,这些整数也构成一个非降序序列,每个整数之间以空格隔开。
输出格式:
把第2行的m个整数和第4行的n个整数合并成一个非降序序列,输出这个整数序列。每个数之间隔1个空格。
输入样例:
6
1 3 6 6 8 9
4
2 4 5 7
输出样例:
1 2 3 4 5 6 6 7 8 9
#include<stdio.h>
void quick(int a[],int l,int r)
{
int i=l,j=r,k=a[l];
if(i>=j) return ;
while(i<j)
{
while(i<j&&k<=a[j]) j--;
a[i]=a[j];
while(i<j&&k>=a[i]) i++;
a[j]=a[i];
}
a[i]=k;
quick(a,l,i-1);
quick(a,i+1,r);
}
int main()
{
int m,n;
scanf("%d",&m);
int c[m];
for(int i=0;i<m;i++)
{
scanf("%d",&c[i]);
}
scanf("%d",&n);
int b[n];
for(int i=0;i<n;i++)
{
scanf("%d",&b[i]);
}
int a[m+n];
for(int i=0;i<m;i++)
{
a[i]=c[i];
}
for(int i=0;i<n;i++)
{
a[m+i]=b[i];
}
quick(a,0,m+n-1);
for(int i=0;i<n+m;i++)
{
printf("%d ",a[i]);
}
return 0;
}
c语言虽然熟悉,但还是得玩好链表(我以前说的话都是xx)