m0_68024408 2022-08-05 12:40 采纳率: 100%
浏览 18
已结题

完美文本编辑器一题程序出现runtime error,请问程序出错的原因是什么

做完美文本编辑器一题时出现了runtime error,这题我是用双向链表实现的,求问大神指导出错的原因,谢谢。

题目:(https://img-mid.csdnimg.cn/release/static/image/mid/ask/005183476956116.png "#left")

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

using namespace std;



struct Listnode
{
    char a;
    Listnode* pred;  Listnode* succ;
    Listnode(){ }
    Listnode(char alpha, Listnode* p = nullptr, Listnode* s = nullptr):
        a(alpha),pred(p),succ(s){}
    Listnode* insertAsPred(const char& e) {
        Listnode* x = new Listnode(e, pred, this);
        pred->succ = x;
        pred = x;
        return x;
    }
    Listnode* insertAsSucc(const char& e) {
        Listnode* x = new Listnode(e, this, succ);
        succ->pred = x;
        succ = x;
        return x;
    }





};


class List
{
private:
    int size;
    //int flag;
    Listnode* header;
    Listnode* trailer;
public:
    void init() {
        header = new Listnode;
        trailer = new Listnode;
        header->succ = trailer; header->pred = nullptr;
        trailer->pred = header; trailer->succ = nullptr;
        size = 0; 
        trailer->a = '-';
        header->a = '-';
    }
    List() {
        init();
    }
    char remove(Listnode* p)
    {
        char e = p->a;
        p->pred->succ = p->succ;
        p->succ->pred = p->pred;
        delete p;
        size--;
        return e;

    }

    ~List() {
        while (0 < size)
        {
            remove(header->succ);

        }
        delete header;
        delete trailer;


    }
    int get_size() {
        return size;
    }
    Listnode* insertBefore(Listnode* p, char const& e)
    {
        size++;  return p->insertAsPred(e);
    }
    Listnode* insertAsLast(char const& e)
    {  
        size++; 
        return trailer->insertAsPred(e); 
    }
    Listnode* first() const 
    { 
        return header->succ;
    }
    Listnode* get_trailer() const
    {
        return trailer;

    }
    void push_down_left(Listnode* p)
    {
        if (p->pred->succ != p)
        {
            Listnode* pa;
            Listnode* pb = p->pred;
            pa = pb->pred;
            pb->pred = pb->succ;
            pb->succ = pa;

        }


    }
    void push_down_right(Listnode* p)
    {
        if (p->succ->pred != p)
        {
            Listnode* pa;
            Listnode* pb = p->succ;
            pa = pb->pred;
            pb->pred = pb->succ;
            pb->succ = pa;


        }


    }






};

char initial_sequence[3200010];
char curser[5];
char order[5];
char content[5];
int flag = 0;

int main()
{
    //freopen("input.txt", "r", stdin);
    scanf("%s", initial_sequence);
    int initial_txtlen = strlen(initial_sequence);
    List la;
    for (int i = 0; i < initial_txtlen; i++)
    {
        la.insertAsLast(initial_sequence[i]);
        
    }
    Listnode* p1 = la.first();
    Listnode* p2 = la.get_trailer();


    int N;
    scanf("%d", &N);
    for (int i = 0; i < N; i++)
    {
        scanf("%s", order);
        if (order[0] == '<')
        {
            scanf("%s", curser);
            if (curser[0] == 'L')
            {
                if (p1 != la.first())
                {
                    la.push_down_left(p1);
                    p1 = p1->pred;
                    printf("T\n");
                    if (flag == 2)
                    {
                        if (p1 == p2)
                        {
                            flag = 1;
                        }
                    }
                    else if (flag == 1)
                    {
                        flag = 0;

                    }

                }
                else
                {
                    printf("F\n");

                }

            }
            else
            {
                if (p2 != la.first())
                {
                    la.push_down_left(p2);
                    p2 = p2->pred;
                    printf("T\n");
                    if (flag == 0)
                    {
                        if (p1 == p2)
                        {
                            flag = 1;
                        }

                    }
                    else if (flag == 1)
                    {
                        flag = 2;

                    }

                }
                else
                {
                    printf("F\n");

                }

            }


        }
        else if (order[0] == '>')
        {
            scanf("%s", curser);
            if (curser[0] == 'L')
            {
                if (p1 != la.get_trailer())
                {
                    la.push_down_right(p1);
                    p1 = p1->succ;
                    printf("T\n");
                    if (flag == 0)
                    {
                        if (p1 == p2)
                        {
                            flag = 1;

                        }
                        
                    }
                    else if (flag == 1)
                    {
                        flag = 2;

                    }


                }
                else
                {
                    printf("F\n");

                }

            }
            else
            {
                if (p2 != la.get_trailer())
                {
                    la.push_down_right(p2);
                    p2 = p2->succ;
                    printf("T\n");
                    if (flag == 2)
                    {
                        if (p1 == p2)
                        {
                            flag = 1;

                        }


                    }
                    else if (flag == 1)
                    {
                        flag = 0;

                    }


                }
                else
                {
                    printf("F\n");


                }

            }


        }
        else if (order[0] == 'I')
        {
            scanf("%s", curser);
            scanf("%s", content);
            if (curser[0] == 'L')
            {
                la.push_down_left(p1);
                la.insertBefore(p1, content[0]);
                printf("T\n");

            }
            else
            {
                la.push_down_left(p2);
                la.insertBefore(p2, content[0]);
                printf("T\n");
            }




        }
        else if (order[0] == 'D')
        {
            scanf("%s", curser);
            if (curser[0] == 'L')
            {
                if (p1 != la.get_trailer())
                {
                    la.push_down_right(p1);
                    Listnode* pa = p1;
                    p1 = p1->succ;
                    la.remove(pa);
                    printf("T\n");
                    if (flag == 0)
                    {
                        if (p1 == p2)
                        {
                            flag = 1;

                        }

                    }
                    else if (flag == 1)
                    {
                        p2 = p1;

                    }

                }
                else
                {
                    printf("F\n");

                }


            }
            else
            {
                if (p2 != la.get_trailer())
                {
                    la.push_down_right(p2);
                    Listnode* pa = p2;
                    p2 = p2->succ;
                    la.remove(pa);
                    printf("T\n");
                    if (flag == 2)
                    {
                        if (p1 == p2)
                        {
                            flag = 1;

                        }

                    }
                    else if (flag == 1)
                    {
                        p1 = p2;

                    }


                }
                else
                {
                    printf("F\n");

                }


            }



        }
        else if (order[0] == 'R')
        {
            if (flag == 0)
            {
                Listnode* pa = p2->pred;
                Listnode* pb = p1->pred;
                pa->succ = pa->pred;
                pa->pred = pb;
                pb->succ = pa;
                p1->pred = p1->succ;
                p1->succ = p2;
                p2->pred = p1;
                p1 = pa;


                printf("T\n");

            }
            else
            {
                printf("F\n");

            }



            

        }
        else if (order[0] == 'S')
        {
            Listnode* pa = la.first();
            Listnode* pb = la.first();
            for (int i = 0; i < la.get_size(); i++)
            {
                la.push_down_right(pa);
                pa = pa->succ;

            }
            for (int i = 0; i < la.get_size(); i++)
            {
                printf("%c", pb->a);
                pb = pb->succ;

            }
            printf("\n");

            


        }




    }


    return 0;

}

  • 写回答

1条回答 默认 最新

  • 赵4老师 2022-08-05 15:38
    关注

    仅供参考:

    //不带表头结点的双向链表
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include <time.h>
    #include <locale.h>
    struct NODE {
        int          data;
        struct NODE *next;
        struct NODE *prev;
    } *head,*p,*q,*s,*p1,*p2,*q1,**ta;
    int i,k,n,t,m,v,N=10;
    int main() {
        setlocale(LC_ALL,"chs");
        srand(time(NULL));
    
        head=NULL;
    
        printf("创建%d个节点的双向链表:",N);//创建N个节点的双向链表
        p=head;
        for (i=0;i<N;i++) {
            q=(struct NODE *)malloc(sizeof(struct NODE));
            if (NULL==q) exit(1);
            q->data=rand()%100;//填写0..99的随机值
            q->next=NULL;
            q->prev=NULL;
            if (NULL==p) {
                head=q;
                p=head;
            } else {
                p->next=q;
                q->prev=p;
                p=q;
            }
        }
    
        //输出整个双向链表
        s=head;
        while (1) {
            if (NULL==s) {
                printf("\n");
                break;
            }
            printf("%02d<->",s->data);
            if (NULL!=s->next && s->next->prev!=s) {printf(" !\n");break;}
            s=s->next;
        }
    
        k=3;
        v=5;
        printf("将值为%d的结点插入到双向链表的第%d个结点前:",v,k);//将值为v的结点插入到双向链表的第k个结点前
        n=0;
        p=head;
        while (1) {
            if (NULL==p) {
                break;
            }
            n++;
            if (k==1) {
                q=(struct NODE *)malloc(sizeof(struct NODE));
                if (NULL==q) exit(1);
                q->data=v;
                q->next=head;
                q->prev=NULL;
                head->prev=q;
                head=q;
                break;
            } else {
                if (k-1==n) {
                    q=(struct NODE *)malloc(sizeof(struct NODE));
                    if (NULL==q) exit(1);
                    q->data=v;
                    q->next=p->next;
                    q->prev=p;
                    p->next->prev=q;
                    p->next=q;
                    break;
                }
            }
            p=p->next;
        }
    
        //输出整个双向链表
        s=head;
        while (1) {
            if (NULL==s) {
                printf("\n");
                break;
            }
            printf("%02d<->",s->data);
            if (NULL!=s->next && s->next->prev!=s) {printf(" !\n");break;}
            s=s->next;
        }
    
        k=5;
        printf("删除第%d个节点:",k);//删除第k个节点
        n=0;
        p=head;
        while (1) {
            if (NULL==p) {
                break;
            }
            n++;
            if (k==1) {
                q=head;
                head=head->next;
                head->prev=NULL;
                free(q);
                break;
            } else {
                if (k-1==n) {
                    q=p->next;
                    if (q) {
                        p->next=q->next;
                        if (q->next) q->next->prev=p;
                        free(q);
                    }
                    break;
                }
            }
            p=p->next;
        }
    
        //输出整个双向链表
        s=head;
        while (1) {
            if (NULL==s) {
                printf("\n");
                break;
            }
            printf("%02d<->",s->data);
            if (NULL!=s->next && s->next->prev!=s) {printf(" !\n");break;}
            s=s->next;
        }
    
        printf("从小到大排序:");//从小到大排序
        for (p=head,p1=NULL;p!=NULL;p1=p,p=p->next) {
            for (q=p->next,q1=p;q!=NULL;q1=q,q=q->next) {
                if (p->data > q->data) {
    
                    //交换data
    //              printf("swap %02d %02d\n",p->data,q->data);
    //              t=p->data;p->data=q->data;q->data=t;
    
                    //或者
    
                    //交换prev和next
    //              printf("swap %02d %02d\n",p->data,q->data);
                    if (p==head) {//p是头
                        if (p->next==q) {//pq挨着
                            head=q;
                            head->prev=NULL;
                            p->next=q->next;
                            p->prev=q;
                            if (q->next) q->next->prev=p;
                            q->next=p;
                            q=p;
                            p=head;
                        } else {//pq不挨着
                            head=q;
                            head->prev=NULL;
                            p2=p->next;
                            p->next=q->next;
                            p->prev=q->prev;
                            if (q->next) q->next->prev=p;
                            q->next=p2;
                            p2->prev=q;
                            q1->next=p;
                            q=p;
                            p=head;
                        }
                    } else {//p不是头
                        if (p->next==q) {//pq挨着
                            p1->next=q;
                            p->next=q->next;
                            p->prev=q;
                            if (q->next) q->next->prev=p;
                            q->next=p;
                            q->prev=p1;
                            q=p;
                            p=p1->next;
                        } else {//pq不挨着
                            p1->next=q;
                            p2=p->next;
                            p->next=q->next;
                            p->prev=q->prev;
                            if (q->next) q->next->prev=p;
                            q->next=p2;
                            p2->prev=q;
                            q->prev=p1;
                            q1->next=p;
                            q=p;
                            p=p1->next;
                        }
                    }
    
                    //输出整个双向链表
    //              s=head;
    //              while (1) {
    //                  if (NULL==s) {
    //                      printf("\n");
    //                      break;
    //                  }
    //                  printf("%02d<->",s->data);
    //                  if (NULL!=s->next && s->next->prev!=s) {printf(" !\n");break;}
    //                  s=s->next;
    //              }
    //              getchar();
                }
            }
        }
    
        //输出整个双向链表并计算链表长度n
        n=0;
        s=head;
        while (1) {
            if (NULL==s) {
                printf("\n");
                break;
            }
            printf("%02d<->",s->data);
            if (NULL!=s->next && s->next->prev!=s) {printf(" !\n");break;}
            n++;
            s=s->next;
        }
    
        printf("将整个链表逆序:");//将整个链表逆序
        if (n>=2) {
            p=head;
            q=p->next;
            p->next=NULL;
            while (1) {
                q1=q->next;
                q->next=p;
                p->prev=q;
                p=q;
                q=q1;
                if (NULL==q) break;
            }
            head=p;
            head->prev=NULL;
        }
    
        //输出整个双向链表
        s=head;
        while (1) {
            if (NULL==s) {
                printf("\n");
                break;
            }
            printf("%02d<->",s->data);
            if (NULL!=s->next && s->next->prev!=s) {printf(" !\n");break;}
            s=s->next;
        }
    
        m=4;
        n=6;
        printf("将双向链表中前%d个结点和后%d个结点进行互换:",m,n);//将双向链表中前m个结点和后n个结点进行互换,m+n为链表总长
        k=0;
        p=head;
        while (1) {
            if (NULL==p) {
                break;
            }
            k++;
            if (m==k) {
                q=p;
            }
            s=p;
            p=p->next;
        }
        q1=head;
        head=q->next;
        head->prev=NULL;
        s->next=q1;
        q1->prev=s;
        q->next=NULL;
    
        //输出整个双向链表
        s=head;
        while (1) {
            if (NULL==s) {
                printf("\n");
                break;
            }
            printf("%02d<->",s->data);
            if (NULL!=s->next && s->next->prev!=s) {printf(" !\n");break;}
            s=s->next;
        }
    
        //释放所有节点
        p=head;
        while (1) {
            if (NULL==p) {
                break;
            }
            q=p->next;
            free(p);
            p=q;
        }
    
        return 0;
    }
    //创建10个节点的双向链表:93<->03<->60<->05<->57<->71<->02<->41<->26<->85<->
    //将值为5的结点插入到双向链表的第3个结点前:93<->03<->05<->60<->05<->57<->71<->02<->41<->26<->85<->
    //删除第5个节点:93<->03<->05<->60<->57<->71<->02<->41<->26<->85<->
    //从小到大排序:02<->03<->05<->26<->41<->57<->60<->71<->85<->93<->
    //将整个链表逆序:93<->85<->71<->60<->57<->41<->26<->05<->03<->02<->
    //将双向链表中前4个结点和后6个结点进行互换:57<->41<->26<->05<->03<->02<->93<->85<->71<->60<->
    //
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 8月14日
  • 已采纳回答 8月6日
  • 创建了问题 8月5日

悬赏问题

  • ¥15 WPF 大屏看板表格背景图片设置
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示