课设日志第N天

要说课设,那是真的磨人,来贴一个简单的题,我只是提交了二十遍而已

 名字叫:大爱线性表 R、D,R代表逆转,D代表删除元素

#include<stdio.h>
#include<string.h>
void sz(int *a,int n)
{
    char c;int i;
    getchar();
    scanf("%c",&c);
    for( i=0;i<n;i++)
    {
        if(i==n-1)
        {
            scanf("%d",&a[i]);
        }
        else scanf("%d,",&a[i]);
    }
    getchar();
}
int main()
{
   int n,i,x,j,k,b=0,length;
   scanf("%d",&n);
   for(i=0;i<n;i++)
   {
       char c[200005];
       int a[200002],*L,t,*rear,*p;
       int d=0;
       int flag=0,m=0;
       k=0;b=0;
       scanf("%s",c);
       scanf("%d",&x);
       length=x;
       sz(a,x);
       L=a;rear=a+x-1;
       for(j=0;c[j]!='\0';j++)
       {
           if(c[j]=='R')
           {
               m++;
               p=L;
               L=rear;
               rear=p;
           }
           else
           {
               if(!length)
               {
                   printf("error\n");
                   flag=1;
                   break;
               }
               else
               {
                  if(m%2) L--;
                  else L++;
                  length--;
               }
           }
       }
       if(!flag)
      {
           printf("[");
           if(m%2==0)
       {
           for(k=0;k<length;k++)
       {if(k==length-1)
           {printf("%d",*(L+k));}
          else printf("%d,",*(L+k));

       }
       printf("]\n");

      }
      else
      {
          for(k=0;k<length;k++)
          {if(k==length-1)
              printf("%d",*(L-k));
              else
              printf("%d,",*(L-k));
          }
          printf("]\n");
      }
      }
   }
   return 0;
}

交二十遍不是因为题目太难,它反映出来我的基础不牢,对于我这种小菜鸡,我想总结还是有点必要的。

来现在来分析下问题:

(1)scanf(“%d%c", &a,&b);

此题极其骚气,它在输入数字的时候有‘ [ ] '这么个东西。我起初一位我只要写scanf("%d",&a[i])就好了,结果答案给我的感觉就很奇怪我就费劲千辛万苦找到了问题所在,我把输入就改成了是残废(”%d%c");那样,但事实上这是有问题的,不可以这么些。因为如果输入的是两位数,就不知道后面那一位是字符还是数字,于是乎我在后面加了个getchar()(这是老师发现的),前面加了输入字符的形式但依旧不对。最后我意识到在输入数据的上一行有个换行,具体情况是这样的

scanf("%c")应该是吃掉了它,于是我又在前面又加了getchar(),终于,结果出来了,但是依旧存在问题。

(2)因为它要逆转,我觉得我链表写得不咋地,就决定用双向链表写的,然而当我的测试结果是对的时候,提交却显示我内存超限,气得我口吐芬芳

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct num  //双向链表
{
    int data;
    struct num *prior,*next;//指向直接前驱、后继
} num;
int main()
{
    int n,m,i,j,x,o,flag;
    num L,*p,*pre;
    scanf("%d",&n);
    for(i=0; i<n; i++)
    {
        flag=0;
        x=0;
        L.next=L.prior=NULL;
        char c[100000],y;
        scanf("%s",c);
        scanf("%d",&m);
        pre=&L;
        getchar(); //要记得接受换行
        scanf("%c",&y);
        for(j=0; j<m; j++) //构建双向链表 记得加输入[
        {
            p=(struct num*)malloc(sizeof(num));
            if(j==m-1)
               {
                   scanf("%d",&o);
               }
            else if(j==0)
                {
                    scanf("%d,",&o);
                }
            else
                {
                    scanf("%d,",&o);
                }
            p->data=o;
            p->next=NULL;
            pre->next=p;
            p->prior=pre;
            pre=pre->next;
        }
        scanf("%c",&y);
        for(j=0; c[j]!='\0'; j++)
        {
            if(c[j]=='R')
            {
                p=L.next;
                L.next=pre; //交换头尾指针,并记录次数
                pre=p;
                x++;
            }
            if(c[j]=='D')
            {
                if(!L.next)
                {
                    printf("error\n");
                    flag=1;
                    break;
                }
                if(x%2==1)
                {
                    p=L.next;
                    L.next=L.next->prior;
                }
                else
                {
                    p=L.next;
                    L.next=L.next->next;
                }
                free(p) ;
            }
        }
        if(!L.next&&!flag) printf("error\n");
        if(L.next)
        {
            printf("[");
            if(x%2)
            {
                for(p=L.next;pre; p=p->prior)
                {
                    if(p==pre)
                    {
                        printf("%d",p->data);
                        break;
                    }
                    printf("%d,",p->data);
                }
            }
            else
            {
                for(p=L.next;pre; p=p->next)
                {
                    if(p==pre)
                    {
                        printf("%d",p->data);
                        break;
                    }
                    printf("%d,",p->data);
                }
            }
            printf("]\n");
        }
    }
    return 0;
}

我知道问题应该是我没有销毁链表,但是我已经没有这个心了(心累了,我是真的累了),而且我感觉还是不会过,我就用了数组做。

(3) 那数组的毛病是非常之多,我就交换值嘛,结果时间超限,(但是我同学交却可以通过,可能真的是人品差了点),我就想着换一下数组的地址。

  (4)最后一点其实也挺重要的,我之所以交了这么多次的原因,还是因为我的心太浮躁了。本来最后那几次我只要多测几组数据就能过,但是我没有。在最后一次交的时候,我是发现自己忽略了如果本来就是个空数组的情况。

好了,有兴趣的同学可以自己试一下用双向链表去做,然后记得销毁链表哦。如果愿意希望你可以分享下。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值