首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2013-03-06 
求助 关于线性表操作 的一道 ACM题本帖最后由 tall913 于 2011-03-16 22:08:10 编辑题目地址:http://acm.n

求助 关于线性表操作 的一道 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 () 调用使用。

热点排行