要说课设,那是真的磨人,来贴一个简单的题,我只是提交了二十遍而已
名字叫:大爱线性表 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)最后一点其实也挺重要的,我之所以交了这么多次的原因,还是因为我的心太浮躁了。本来最后那几次我只要多测几组数据就能过,但是我没有。在最后一次交的时候,我是发现自己忽略了如果本来就是个空数组的情况。
好了,有兴趣的同学可以自己试一下用双向链表去做,然后记得销毁链表哦。如果愿意希望你可以分享下。