陈文忻 2024-01-20 07:58 采纳率: 60%
浏览 8
已结题

POJ2887 关于块状链表的代码

POJ 2887

很明显要用块状链表。

我感觉我的代码没问题,但是WA了。还麻烦各位帮我看看,解释在代码注释里面。谢谢了!

#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
struct node
{
    char t[3001];//最多在一块链表里面插入2000个字符,而一块链表一开始最多有1000个字符。 
    int len;
    node *nxt;
}a[1003];
int n,ret,m,now,i,j,ind;
char ch,s[1000001],op;
int main()
{
    node *p;
    scanf("%s",s);
    m=strlen(s);
    ret=sqrt((double)m);
    for(i=ret;i<=m;i+=ret)
    {
        for(j=i-ret;j<i;++j)a[now].t[a[now].len++]=s[j];
        ++now;
    }
    if(i!=m+ret)
    {
        i-=ret;
        for(j=i;j<m;++j)a[now].t[a[now].len++]=s[i];//分块存储,调过,没问题。 
    }
    else --now;//链表的范围是0~now。 
    for(i=0;i<now;++i)a[i].nxt=&a[i+1];
    a[now].nxt=NULL;//最后一块链表指向空指针。 
    scanf("%d",&n);
    while(n--)
    {
        getchar(),p=&a[0],scanf("%c",&op),getchar();//这里有很多getchar,看上去很荒谬,但实际上是对的…… 
        if(op=='I')
        {
            scanf("%c%d",&ch,&ind);
            if(ind>m)ind=m+1;
            while(p->nxt!=NULL&&ind>p->len)ind-=p->len,p=p->nxt;//如果已经是最后一块了,就不能往后,否则继续查找。 
            --ind;//因为我链表里面的t数组是0~(len-1)的,所以这里--ind。 
            for(i=p->len;i>ind;--i)p->t[i]=p->t[i-1];//数组的插入操作。 
            p->t[ind]=ch,++p->len,++m;//插入ch并更新这块链表的长度和总长度。 
        }
        else
        {
            scanf("%d",&ind);
            while(p->nxt!=NULL&&p->len)ind-=p->len,p=p->nxt;
            printf("%c\n",p->t[ind-1]);//同上,下标应该是ind-1。 
        }
    }//样例能过。 
    return 0;
}

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2024-01-20 10:04
    关注

    【以下回答由 GPT 生成】

    这段代码存在几个问题:

    1. for 循环中,for (j = i - ret; j < i; ++j) 应该是 for (j = i - ret; j < i; ++j) 迭代 j 的条件应该是 < i 而不是 <= i,因为 i 的值已经超出了字符串 s 的长度范围。

    2. for 循环结束后,now 变量的值多加了 1。因此应该在 for 循环之后进行递减 now--

    3. 在向块状链表中插入字符时,if (ind > m) 的判断条件是错误的,应该是 if (ind > m - 1),因为字符串的下标是从 0 开始的。

    4. 在将块状链表分成若干块时,存在对最后一块链表的处理错误,应该变成 else if (i != m),然后处理未分块完的最后一块链表。

    我无法提供具体的代码解决问题,因为这个问题涉及到整体的逻辑和数据结构的设计,所以建议您仔细检查这些问题,并对代码进行逐步调试和修改。祝您成功!



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月20日
  • 创建了问题 1月20日