大佬们,我是小白,最近在写一个链表相关的课设,现在打算将键盘输入的数一个一个存进链表节点中,不知道什么原因一直有断点之类的错误,有好心人帮忙改改吗。你们的举手之劳对小白来说可能就是几个小时了,谢谢愿意帮忙的大佬!!
//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;
}
基本都是在输入过程中和输出数据时出现断点等错误。
截图如下:
对于这些问题我也找过资料,也尝试过注释掉析构、构造函数这些容易出差错的地方,但是结果不尽人意,现在有点写不下去因为最基本的错误没有得到解决,能完美解决的大佬我会给出酬金的谢谢啦!!
能完美解决的大佬我会给出酬金的谢谢啦!!====多少酬金???
一你可以吧报错的截图发一下
二 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();
}