链表使用中遇到的问题,有愿意帮忙的嘛

大佬们,我是小白,最近在写一个链表相关的课设,现在打算将键盘输入的数一个一个存进链表节点中,不知道什么原因一直有断点之类的错误,有好心人帮忙改改吗。你们的举手之劳对小白来说可能就是几个小时了,谢谢愿意帮忙的大佬!!


//head.h
//---------------------------------------------------------
#include<iostream>
using namespace std;
class LinkList
{
public:
    class Node
    {
    public:
        int data;
        Node* pre;
        Node* next;
        Node() : pre(0),next(0) { data = 0; }                                       //默认构造函数
        Node(int dataValue) : data(dataValue), next(0) {} //显值构造函数
    };
    typedef Node* NodePointer;
    LinkList() { first=new Node(-1); }                         //构造函数
    //LinkList(const LinkList& origList); //复制构造函数
    ~LinkList();//析构函数
    void deleteList();
    bool empty();   //链表判空
    int nodeCount();      //计算节点个数
    void reverse();  //链表反转,即尾结点变为链表第一个节点
    void display();//输出链表节点值
    NodePointer first; //指向第一个节点的指针
    NodePointer last; //指向最后一个节点的指针
};

class BigInteger
{
public:
    LinkList base;
    BigInteger Badd(BigInteger b, BigInteger n);//加法运算,(a+b) mod n
    BigInteger Bsub(BigInteger b, BigInteger n);//减法运算,(a-b) mod n
    BigInteger Bmul(BigInteger b, BigInteger n);//乘法运算,(a*b) mod n
    BigInteger Bdiv(BigInteger b, BigInteger n);//除法运算,(a/b) mod n
    BigInteger Bind(BigInteger b, BigInteger n);//指数运算, a^b  mod n
};

void stop();//实现对话暂停功能,对运算无影响
void wrong();//当输入有误时调用函数,防止错误发生

//list.cpp--------------------------------------------------------------------------------------
#include"head.h"
bool flag;
void stop()
{
    cout << "输入任意键继续。。ヾ(^▽^*)))" << endl;
    //getchar();
    getchar();
    system("cls");
}
void wrong()
{
    flag = 0;
    cout << "(。_。) 输入有误,请重新输入一遍吧" << endl;
    cin.clear();//清除错误标记,重新打开输入流,但是输入流中依旧保留着之前的不匹配的类型
    cin.sync();//清楚cin缓存区的数据。
    while (cin.get() != '\n') {
        continue;
    }
    cout << "输入任意键继续。。ヾ(^▽^*)))" << endl;
    getchar();
}
//LinkList::LinkList(const LinkList& origList) {//复制构造函数
//    first = origList.first;
//    NodePointer ptr = first;
//    NodePointer ptr2 = origList.first;
//    while (ptr->next != 0)
//    {
//        ptr = ptr->next;
//        ptr2 = ptr2->next;
//        ptr = ptr2;
//    }
//} 
LinkList::~LinkList() {//析构函数
    delete first;
}
void LinkList::deleteList() {
    if (empty() == 0) {
        NodePointer preptr = new Node();
        NodePointer ptr = first;
        while (ptr->next != 0) {
            preptr = ptr;
            ptr = ptr->next;
            delete preptr;
        }
        first->next = 0;
    }
}
bool LinkList::empty()   //链表判空
{
    if (first == 0)return 1;
    else return 0;
}
int LinkList::nodeCount() {      //计算节点个数
    if (empty() == 0) {
        NodePointer ptr =first;
        int n = 1;
        while (ptr->next != 0) { n++; ptr = ptr->next; }
        return n;
    }
    else return 0;
}
void LinkList::reverse() {  //链表反转,即尾结点变为链表第一个节点
    if (!empty() && first->next != 0) {
        int* a;
        NodePointer ptr =first;
        a = new int(nodeCount());
        for (int i = 0; i < nodeCount(); i++) {
            a[i] = ptr->data;
            ptr = ptr->next;
        }
        ptr = first;
        for (int i = nodeCount() - 1; i >= 0; i--) {
            ptr->data = a[i];
            ptr = ptr->next;
        }
    }
}
void LinkList::display() {//输出链表节点值
    LinkList temp = *this;
    temp.reverse();
    if (!empty()) {
        NodePointer ptr=temp.first;
        int n = temp.nodeCount();
        for (int i = 0; i < n;i++) {
            cout << ptr->data;
            ptr = ptr->next;
        }
        cout << endl;
    }
    //temp.deleteList();
}

//main.cpp------------------------------------------------------------------------------------------------------------------------------
#include"head.h"
#include<fstream>
#include <windows.h>
using namespace std;
extern bool flag;
int main()
{
    int cho = 0;
    while (cho != 8)
    {
        //system("cls");
        cout << endl;
        cout << "﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀" << endl;
        cout << " |                                                大整数运算应用主菜单                                              |" << endl;
        cout << " |                                                1.写入或重写大整数a                                                |" << endl;
        cout << " |                                                2.写入或重写大整数b                                                |" << endl;
        cout << " |                                                3.输出已有大整数                                                  |" << endl;
        cout << " |                                                4.计算大整数加法                                                  |" << endl;
        cout << " |                                                5.计算大整数减法                                                  |" << endl;
        cout << " |                                                6.计算大整数乘法                                                  |" << endl;
        cout << " |                                                7.计算大整数除法                                                  |" << endl;
        cout << " |                                                8.计算大整数指数运算                                              |" << endl;
        cout << " |                                                9.退出                                                            |" << endl;
        cout << "︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿" << endl << endl;
        cout << "                                                  请输入指令:";
        cin >> cho;
        static BigInteger a, b;
        switch (cho)
        {
            flag = 1;
        case(1):
        {
            cout << "请输入大整数a的值,以回车结束" << endl;
            LinkList::NodePointer ptr = new LinkList::Node();
            LinkList::NodePointer preptr = new LinkList::Node();
            ptr=a.base.first;
            char c;
            getchar();
            while ((c=getchar()) != '\n') {
                if (c >= '0' && c <= '9')ptr->data = c - '0';
                else {
                    wrong();
                    break;
                }
                ptr->next = new LinkList::Node(0);
                preptr = ptr;
                ptr = ptr->next;
            }
             preptr->next=NULL;
            a.base.reverse();
            stop();
            break;
        }
        case(2): {
            cout << "请输入大整数b的值,以回车结束" << endl;
            LinkList::NodePointer ptr = new LinkList::Node();
            LinkList::NodePointer preptr = new LinkList::Node();
            ptr = b.base.first;
            char c;

            getchar();
            while ((c = getchar()) != '\n') {
                if (c >= '0' && c <= '9')ptr->data = c - '0';
                else {
                    wrong();
                    break;
                }
                ptr->next = new LinkList::Node(0);
                preptr = ptr;
                ptr = ptr->next;
            }
            preptr->next = NULL;
            b.base.reverse();
            stop();
            break;
        }
        case(3):
        {
            cout << "大整数a的值为:";
            a.base.display();
            cout << "大整数b的值为:";
            b.base.display();
            getchar();
            stop();
            break;
        }
        case(8):
        {
            cout << "谢谢使用,欢迎您再次使用本应用!";
            break;
        }

        default:
        {
           // system("cls");
            break;
        }
        break;
        }

    }
    return 0;
}


基本都是在输入过程中和输出数据时出现断点等错误。
截图如下:

img

img

对于这些问题我也找过资料,也尝试过注释掉析构、构造函数这些容易出差错的地方,但是结果不尽人意,现在有点写不下去因为最基本的错误没有得到解决,能完美解决的大佬我会给出酬金的谢谢啦!!

能完美解决的大佬我会给出酬金的谢谢啦!!====多少酬金???

一你可以吧报错的截图发一下
二 C语言实现大数运算(长整数的加、减、乘、除
可以借鉴下
https://blog.csdn.net/qq_44310495/article/details/109395413

数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

有多处错误,参考下面的代码 , 修改了main.cpp和list.cpp
main.cpp 里面case1 和 case2里面改了

//main.cpp------------------------------------------------------------------------------------------------------------------------------
#include"head.h"
#include<fstream>
#include <windows.h>
using namespace std;
extern bool flag;
int main()
{
    int cho = 0;
    while (cho != 8)
    {
        //system("cls");
        cout << endl;
        cout << "﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀﹀" << endl;
        cout << " |                                                大整数运算应用主菜单                                              |" << endl;
        cout << " |                                                1.写入或重写大整数a                                                |" << endl;
        cout << " |                                                2.写入或重写大整数b                                                |" << endl;
        cout << " |                                                3.输出已有大整数                                                  |" << endl;
        cout << " |                                                4.计算大整数加法                                                  |" << endl;
        cout << " |                                                5.计算大整数减法                                                  |" << endl;
        cout << " |                                                6.计算大整数乘法                                                  |" << endl;
        cout << " |                                                7.计算大整数除法                                                  |" << endl;
        cout << " |                                                8.计算大整数指数运算                                              |" << endl;
        cout << " |                                                9.退出                                                            |" << endl;
        cout << "︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿︿" << endl << endl;
        cout << "                                                  请输入指令:";
        cin >> cho;
        static BigInteger a, b;
        switch (cho)
        {
            flag = 1;
        case(1):
        {
            cout << "请输入大整数a的值,以回车结束" << endl;
            //LinkList::NodePointer ptr = new LinkList::Node(); ====
            //LinkList::NodePointer preptr = new LinkList::Node(); ====
            LinkList::NodePointer ptr = NULL;
            LinkList::NodePointer preptr = NULL;
            ptr=a.base.first;
            char c;
            getchar();
            while ((c=getchar()) != '\n') {
                if (c >= '0' && c <= '9')ptr->data = c - '0';
                else {
                    wrong();
                    break;
                }
                ptr->next = new LinkList::Node(0);
                preptr = ptr;
                ptr = ptr->next;
            }
            if(ptr->next) delete ptr->next;
            preptr->next=NULL;
            a.base.reverse();
            stop();
            break;
        }
        case(2): {
            cout << "请输入大整数b的值,以回车结束" << endl;
            //LinkList::NodePointer ptr = new LinkList::Node();
            //LinkList::NodePointer preptr = new LinkList::Node();
            LinkList::NodePointer ptr = NULL;
            LinkList::NodePointer preptr = NULL;
            ptr=b.base.first;
            char c;
            getchar();
            while ((c=getchar()) != '\n') {
                if (c >= '0' && c <= '9')ptr->data = c - '0';
                else {
                    wrong();
                    break;
                }
                ptr->next = new LinkList::Node(0);
                preptr = ptr;
                ptr = ptr->next;
            }
            if(ptr->next) delete ptr->next;
            preptr->next=NULL;
            b.base.reverse();
            stop();
            break;
        }
        case(3):
        {
            cout << "大整数a的值为:";
            a.base.display();
            cout << "大整数b的值为:";
            b.base.display();
            getchar();
            stop();
            break;
        }
        case(8):
        {
            cout << "谢谢使用,欢迎您再次使用本应用!";
            break;
        }
        default:
        {
           // system("cls");
            break;
        }
        break;
        }
    }
    return 0;
}

list.cpp 主要修改了 display 函数

//list.cpp--------------------------------------------------------------------------------------
#include"head.h"
bool flag;
void stop()
{
    cout << "输入任意键继续。。ヾ(^▽^*)))" << endl;
    //getchar();
    getchar();
    system("cls");
}
void wrong()
{
    flag = 0;
    cout << "(。_。) 输入有误,请重新输入一遍吧" << endl;
    cin.clear();//清除错误标记,重新打开输入流,但是输入流中依旧保留着之前的不匹配的类型
    cin.sync();//清楚cin缓存区的数据。
    while (cin.get() != '\n') {
        continue;
    }
    cout << "输入任意键继续。。ヾ(^▽^*)))" << endl;
    getchar();
}
//LinkList::LinkList(const LinkList& origList) {//复制构造函数
//    first = origList.first;
//    NodePointer ptr = first;
//    NodePointer ptr2 = origList.first;
//    while (ptr->next != 0)
//    {
//        ptr = ptr->next;
//        ptr2 = ptr2->next;
//        ptr = ptr2;
//    }
//} 
LinkList::~LinkList() {//析构函数
    delete first;
}
void LinkList::deleteList() {
    if (empty() == 0) {
        NodePointer preptr = new Node();
        NodePointer ptr = first;
        while (ptr->next != 0) {
            preptr = ptr;
            ptr = ptr->next;
            delete preptr;
        }
        first->next = 0;
    }
}
bool LinkList::empty()   //链表判空
{
    if (first == 0)return 1;
    else return 0;
}
int LinkList::nodeCount() {      //计算节点个数
    if (empty() == 0) {
        NodePointer ptr =first;
        int n = 1; 
        while (ptr->next != 0) { n++; ptr = ptr->next; }
        return n;
    }
    else return 0;
}
void LinkList::reverse() {  //链表反转,即尾结点变为链表第一个节点
    if (!empty() && first->next != 0) {
        int* a;
        NodePointer ptr =first;
        a = new int(nodeCount());
        for (int i = 0; i < nodeCount(); i++) {
            a[i] = ptr->data;
            ptr = ptr->next;
        }
        ptr = first;
        for (int i = nodeCount() - 1; i >= 0; i--) {
            ptr->data = a[i];
            ptr = ptr->next;
        }
    }
}
void LinkList::display() {//输出链表节点值
    //LinkList temp = *this; 不能这么赋值,会被析构掉,first下次变成无效了
    //temp.reverse();==== 删除,在输入的时候已经执行过了
    if (!empty()) {
        NodePointer ptr=first;
        int n = nodeCount();
        for (int i = 0; i < n;i++) {
            cout << ptr->data;
            ptr = ptr->next;
        }
        cout << endl;
    }
    //temp.deleteList();
}