做完美文本编辑器一题时出现了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;
}