NOJ1004线性表操作

/*线性表操作
时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 3107            测试通过 : 661 
描述

线性表是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 


提示


该题属于南京邮电大学《数据结构A》实验一中的内容,验证的是课本代码,每一个输出元素后均有一个空格(包括最后一个元素),请慎重解答。

题目来源

CHENZ

*/


#include<stdio.h>
#include<string.h>
void opp(char a[],int i,int n);
void OPP(char a[],char b[],int i,int n,int I);
const int N = 5000;

int main()
{
    int i=0,n,I=0,P=3;
    char a[N],b[100],ch;
   
     while(P--)
        
    {	
		scanf("%d",&n);
        i=0,I=0;
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        getchar();
        while((ch=getchar())!='\n')
		a[i++]=ch;
       	do
	    if(a[i-1]==' ') a[--i]=0;
	    while(a[i-1]==' ');
        
        i--;
        //printf("%c",*(i+a));
        opp(a,i,n);
        while((ch=getchar())!='\n')
        b[I++]=ch;
        OPP(a,b,i,n,I);
    }

    return 0;
}

void opp(char a[],int i,int n)
{
    char*p=a+i;
    char*temp=p;
    int j,first=1;
    while(n--)
    {
        //temp=p;
        for(j=0;;)
        {
            j++;
            if(temp==a||*(--temp)==' ')break;
        }
        if(first) 
        {
            first=0;
            for(;j>=1;j--)
            printf("%c",*(p-j+1));
            
        }
        else for(;j>=0;j--)
                printf("%c",*(p-j));
        p=(--temp);
        
    }
    printf(" ");
    //printf("*");
    printf("\n");

}

void OPP(char a[],char b[],int i,int n,int I)
{
    char*p=a+i;
    char*temp=p;
    int j,first=1,o=0,J,NP,ok=1;
    while(n--)
    {
        
        //temp=p;
        o=0;
        //printf("%d",b[1]);
        for(j=0;;)
        {
            j++;
            if(temp==a||*(--temp)==' ')break;
        }
        J=j;
        NP=0;
        //printf("%d%d!",I,J);
        
        while(J--)
            {
            
            if(j!=I||*(p-J)!=b[o++]){NP=1;break;}
            
            }
            //printf("%d!",NP); 
        //printf("%d",NP);        
        if(NP==1)
        {
            
        if(first) 
        {
            first=0;
            for(;j>=1;j--)
            printf("%c",*(p-j+1));
            //printf("");
        }
        
        else if(ok==1)
            for(;j>=0;j--)
                printf("%c",*(p-j));
        else if(ok==0)
        {
            for(;j>=1;j--)
                printf("%c",*(p-j+1));
            //    printf("*");
                ok=1;
        }
            
        p=(--temp);
        }
        else if(NP==0)
        {
            if(first) 
            first=0,ok=0;
            //printf("ok=%d",ok);
        
            p=(--temp);
        }
    }
    printf(" ");
    //printf("*");    
    printf("\n");

}
//WA了,不知道为什么,测了很多很多数据怀疑是NOJ数据有问题。。有输入数据末空格之类的情况,写这么麻烦是,试图用getchar读浮点型,整型,char型,一步到位,练练能力。。的确写了4个小时。
//没救了,noj样例输入第二行多了一个空格。。。 结果注意到了这点我也无法保证其他数据的坑。。。反正还是wa在test 1 了。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值