倚天照海花无数,流水高山心自知。
谢谢你,我考虑还不够周到
已经改过来了
else if(*(p+i)=='#')
{
if(*(p+i-1)=='\n' && outlen==0)
continue;
else
outlen--;
}//里面的&& 改成|| 就行了
谢谢你,真的很感谢你,你帮我发现了不少问题了,现在已经改过来了,同时,我在调试的时候又发现了一个bug:当处理的时候,要是当前行已经删除完了(所有字符都废弃)最后还留下一个回车,最后也让我改过来了,值得庆祝
请大家在帮忙看看还有什么bug,程序在46楼,谢谢
现在把修改的部分在这再说一下:
else if(*(p+i)=='#') //处理退格符
{
if(*(p+i-1)=='\n' || outlen==0) //行首出现#的情况
continue;
else
outlen--; //一般情况
}
//该部分改为
else if(*(p+i)=='#')
{
if(outlen-1==enter || outlen==0)
//同是对行首的识别,但现在是从输出上判断,原先的是从输入上判断
continue;
else
outlen--;
}
///////////////////////////////////////////////////////////////////////////////
if(*(p+i)!='#'&&*(p+i)!='@') //把普通字符和特殊功能字符区分
{
if(*(p+i)=='\n')
{
enter=outlen; //记录最近一行结束的位置(即回车的地方)
//退行符将会用到
}
*(p+outlen++)=*(p+i); //用有用的字符覆盖掉应删除的字符
}
//修改以克服废弃整行字符却还留下回车符的情况(如123456@回车)
if(*(p+i)!='#'&&*(p+i)!='@')
{
if(*(p+i)=='\n')
{
if(outlen-1==enter)//判断此行是否已经为空
continue;
else
{
enter=outlen;
*(p+outlen++)=*(p+i);
}
}
else *(p+outlen++)=*(p+i);
}
希望大家帮忙改进一下
[此贴子已经被作者于2007-3-13 17:04:42编辑过]
比第一个思路好点,能快些,但是看结果而得来的,是不是巧合,我试了很多次都跟第一个的结果一样。
这里就不用换算成3的次方了,大家改正下
#include "math.h"
#include "stdio.h"
struct st
{
int i;
struct st *next;
struct st *qian;
}*st1,*a,*b;
printxulie(struct str *xulie) //输出最后结果集
{
struct str *pa;
pa=xulie;
if(pa->qian==0) printf("%d ",pa->i);
else
for(;pa!=0;pa=pa->qian)
printf("%d ",pa->i);
printf("\n");
}
quchu(struct st *xulie,int n)
{
struct st *pa,*pb;
pb=xulie;
if(pb->i==n) //当要去掉的是链表头一个时
{
st1=pb->next;
pb->next->qian=st1;
st1->qian=0;
pb->qian=0;
pb->next=0;
free(pb);
}
else
while(pb->next!=0)
{
if(pb->next->i==n)
{
pa=pb->next;
pb->next=pb->next->next;
pb->next->qian=pb;
pa->next=0;
pa->qian=0;
free(pa);
break;
}
else pb=pb->next;
}
}
main()
{
int i;
long cha,wei,n;
scanf("%ld",&wei);
while(wei>1)
{
for(cha=wei,i=0;cha>pow(2,i-1);i++) //cha小与wei的情况下,纪录i到链表st1中
{
b=(struct st*)malloc(sizeof(struct st));
b->i=i;
if(i==0) st1=a=b;
else
{
a->next=b;
b->qian=a;
}
b->next=0;
a=b;
} //st1是链表头地址a是尾地址
a->qian->next=0;
a=a->qian;
a->next=0;
b->next=0;
b->qian=0;
free(b);
i=i-1;
if(cha==pow(2,i)) //cha=pow(2,i),直接输出链表st1
printxulie(a);
else
{
cha=(long)(pow(2,i)-cha);
for(;cha!=0;)
{
i=i-1;
for(;cha<=(long)pow(2,i);i--);
i=i+1;
if(cha==(long)pow(2,i))
{
quchu(st1,i); //st1里除去i;
printxulie(a);
break;
}
else
{
for(;(long)pow(2,i)>=cha;i--);
cha=cha-(long)pow(2,i);
quchu(st1,i);
i=i+1;
}
}
}
scanf("%ld",&wei);
if(wei<1) break;
for(;st1!=0;st1=st1->next);
}
}
[此贴子已经被作者于2007-3-13 18:59:12编辑过]
这个我看懂了,