读书人

关于线性表操作 的一道 ACM题

发布时间: 2013-03-06 16:20:31 作者: rapoo

求助 关于线性表操作 的一道 ACM题
本帖最后由 tall913 于 2011-03-16 22:08:10 编辑 题目地址:http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1004


描述


线性表是n个元素的有序集合(n30),n是线性表中元素的个数,称为线性表的长度。可以用一组地址连续的存储单元依次存储线性表中元素,采用这种存储方式的线性表称为顺序表。

请在顺序表上实现运算,实现顺序表的逆置,删除表中所有元素值等于x的元素。


输入


三组数据,顺序表元素类型分别为整型、字符型和实型。

每一组第一行给出元素数目n(0<n≤1000),第二行给出元素数值,第三行给出待删除的元素。


输出


三组数据,每一组第一行为逆置后的顺序表元素,第二行是在此基础上删除指定元素后的顺序表元素


样例输入

8
1 2 3 7 5 6 7 8
7
3
a c m
h
4
1.2 3.4 5.6 7.8
1.2

样例输出

8 7 6 5 7 3 2 1
8 6 5 3 2 1
m c a
m c a
7.8 5.6 3.4 1.2
7.8 5.6 3.4


我的代码:

/*  HELLO.C -- Hello, world */

#include "stdio.h"
#include "conio.h"
#include "string.h"

main()
{
int a1[1000];
char a2[100];
float a3[100];
int i,j,delElement1;
int n1,n2,n3;
int temp1;
char temp2;
float temp3;
char delElement2;
float delElement3;

scanf("%d",&n1);

for(i=0;i<n1;i++)
{
scanf("%d",&a1[i]);
}
scanf("%d",&delElement1);

scanf("%d ",&n2);
for(i=0;i<n2;i++)
{
if(i<n2-1)
scanf("%c ",&a2[i]);
else
scanf("%c",&a2[i]);
}


scanf(" %c",&delElement2);


scanf("%d",&n3);
for(i=0;i<n3;i++)


{
scanf("%f",&a3[i]);
}
scanf("%f",&delElement3);



for(i=0;i<n1/2;i++)
{
temp1=a1[i];
a1[i]=a1[n1-1-i];
a1[n1-1-i]=temp1;
}
for(i=0;i<n1;i++)
{ printf("%d ",a1[i]);
}
printf("\n");


for(i=0;i<n1;i++)
{
if(delElement1 == a1[i])
{
if(i<n1-1)
{
for(j=i;j<n1-1;j++)
{
a1[j]=a1[j+1];
}
}
else
{
a1[n1-1]=0;
}
n1--;
}
}
for(i=0;i<n1;i++)
{ printf("%d ",a1[i]);
}
printf("\n");



for(i=0;i<n2/2;i++)
{
temp2=a2[i];
a2[i]=a2[n2-1-i];
a2[n2-1-i]=temp2;
}
for(i=0;i<n2;i++)
{
printf("%c ",a2[i]);

}
printf("\n");
for(i=0;i<n2;i++)
{
if(delElement2 == a2[i])
{
if(i<n2-1)
{
for(j=i;j<n2-1;j++)
{
a2[j]=a2[j+1];


}
}
else
{
a2[n2-1]=0;
}
n2--;
}
}
for(i=0;i<n2;i++)
{ printf("%c ",a2[i]);

}
printf("\n");



for(i=0;i<n3/2;i++)
{
temp3=a3[i];
a3[i]=a3[n3-1-i];

a3[n3-1-i]=temp3;
}
for(i=0;i<n3;i++)
{
printf("%g ",a3[i]);

}
printf("\n");
for(i=0;i<n3;i++)
{
if(delElement3 == a3[i])
{
if(i<n3-1)
{
for(j=i;j<n3-1;j++)
{
a3[j]=a3[j+1];
}
}
else
{
a3[n3-1]=0;
}
n3--;
}
}
for(i=0;i<n3;i++)
{ printf("%g ",a3[i]);

}
printf("\n");


getch();

}


我自己在winTc下测试可以实现题目的要求,但是评测系统总是提示 Time Limit Exceed ,也就是超时。。。

请高人修改或者另外写一个评测系统可以测试通过的代码。。。
[解决办法]
算法方面:if (i < n - 1)的情况下,a[n - 1]未删除。
再一个,每次调用 scanf () 处理输入流中的一个单位,如一个%d,造成回车浮遗落在输入流中,给下次 scanf () 调用使用。

读书人网 >C语言

热点推荐