如何使gotoxy()函数在光标所在的链接列表中选择节点

How to make gotoxy() function select the node in the link list the cursor is on?

本文关键字:链接 列表 节点 选择 光标 gotoxy 何使 函数      更新时间:2023-10-16

我正在编写一个基本的文本编辑器作为作业,但我遇到了麻烦。我正在使用链表,我可以在列表周围移动光标,但每次我尝试在其他字母之间插入一个字母(一个字母一个节点(时,它只会在列表末尾插入字母。代码通常还有其他错误,只寻求有关此主要问题的帮助,但任何建议都值得赞赏。

#include <iostream>
#include <conio.h>
#include <windows.h>
#include <fstream>
#include <string>
using namespace std;

class Node
{
public:
    char c;
    Node* next;
    Node* prev;
};

void gotoxy(int x, int y)
{
    COORD pos = { x, y };
    HANDLE output = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(output, pos);
}

void createNew()
{
    Node* start = nullptr;
    Node* end = nullptr;
    Node* prevNode = nullptr;
    int xcur = 0, ycur = 0;
    char letter = ' ';
    while (letter != 27)
    {
        letter = _getch();
        if (letter == 8) // backspace
        {
            Node *p;
            p = end;
            end = end->prev;
            delete p;
            end->next = nullptr;
            xcur--;
        }
        else if (letter == 57) //save press '9'
        {
            ofstream outdoc;
            outdoc.open("TheEditor.txt");
            Node* save;
            char data;
            save = start;
            while (save->next != nullptr)
            {
                data = save->c;
                outdoc << data;
                save = save->next;
            }
            outdoc.close();
        }
        else if (letter == -32)
        {
            // he pressed right up left or down
            letter = _getch();
            if (letter == 75) //72 is up 75 left 77 right 80 down
                --xcur;
            if (letter == 77)
                xcur++;
            //if (letter == 72)
                //ycur++;
            //if (letter == 80)
                //ycur--;

        }
        else if (letter == 56) //load file
        {
            ifstream indoc;
            string fname;
            cout << "Please enter the name of the file" << endl;
            cin >> fname;
            indoc.open(fname);
            char file[sizeof(indoc)];
            for (int j = 0; j < sizeof(fname); j++)
            {
                indoc >> file[j];
                cout << file[j];
                j++;
            }
        }
        else if (letter == 13) // enter
        {
            xcur = 1;
            ycur++;
            //start = arr[ycur];
        }

        else // normal eltter
        {
            Node* p;
            p = new Node();
            p->c = letter;
            p->next = nullptr;
            p->prev = nullptr;
            if (start == nullptr)
            {
                start = p;
                end = p;
                prevNode = p;
            }
            else if (end->next != nullptr) // insert in middle
            {
                Node* m = new Node();
                m->next = end;
                m->c = letter;
                m->prev = prevNode;
                end->prev = m;
                prevNode = m;

            }
            else
            {
                p->prev = prevNode;
                end->next = p;
                end = p;
                prevNode = p;
            }
            //xcur++;
        }
        system("cls");
        // display your linked list here.
        Node *p;
        p = start;
        while (p != nullptr)
        {
            _putch(p->c);
            p = p->next;
        }
        gotoxy(xcur, ycur);
    }
}

void loadFile()
{
    string fname;
    ifstream indoc;
    cout << "Please enter the name of the document" << endl;
    cin >> fname;
    system("CLS");
    indoc.open(fname);
    Node* start = nullptr;
    Node* end = nullptr;
    Node* prevNode = nullptr;
    int xcur = 0, ycur = 0;
    char letter = ' ';
    char file[sizeof(indoc)];
    for (int j = 0; j < sizeof(fname); j++)
    {
        indoc >> file[j];
        cout << file[j];
        j++;
    }
    indoc.close();
    while (letter != 27)
    {
        _putch(letter);
        if (start == nullptr)
        {
            Node* p;
            p = new Node();
            p->c = letter;
            p->next = nullptr;
            p->prev = nullptr;
            start = p;
            end = p;
            prevNode = p;
        }
        else
        {
            Node* t;
            t = new Node();
            t->c = letter;
            t->next = nullptr;
            t->prev = prevNode;
            end->next = t;
            end = t;
            prevNode = t;
        }
        letter = _getch();

        if (letter == 57) //save press '9'
        {
            ofstream outdoc;
            outdoc.open("RereTheEditor.txt");
            Node* save;
            char data;
            save = start;
            while (save->next != nullptr)
            {
                data = save->c;
                outdoc << data;
                save = save->next;
            }
            outdoc.close();
        }
    }
}

int main()
{
    int choice;
    cout << "Welcome to theEditor 2.0!n"
        << "Please select an optionn"
        << "1. Create Newn"
        << "2. Load File" << endl;
    cin >> choice;
    system("CLS");
    switch (choice)
    {
    case 1: { createNew(); }
            break;
    case 2: { loadFile(); }
            break;
    }
    return 0;
}

必须先在每个节点中记录相应的游标坐标,然后才能通过该节点。

class Node
{
public:
    char c;
    COORD pos;
    Node* next;
    Node* prev;
    void setpos(int x, int y)
    {
        pos.X = x;
        pos.Y = y;
    }
};

获取当前光标坐标bInfo.dwCursorPosition GetConsoleScreenBufferInfo:

HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO bInfo;
GetConsoleScreenBufferInfo(hOut, &bInfo);
然后

去链接列表找到相同位置的对应节点,然后插入,更新每个节点的坐标。