我正在开发一个C ++程序,该程序应该利用链表创建一个超级卡堆栈(不管是什么)。问题是,我不知道我在做什么。我写了一些代码,但它崩溃了,老实说,我不知道它是否符合我需要它做的规范,如果它按照书面工作。这是我提出的代码。
更新
另外,正如你们有些人提到的那样,我想使用std::list
库,如果这样可以使这更容易,但我不知道如何这样做,任何帮助将不胜感激。
这是我的.h文件:
//program6.h
#include <iostream>
#include <fstream>
#include <list>
using namespace std;
class Node {
public:
Node();
Node(char code, int num, string data);
Node(Node & node);
~Node();
bool readFile();
void setNext(Node* next);
void print();
private:
char Code;
int Num;
string Data;
Node *Next;
};
我的实施档案:
//program6.cpp
#include "program6.h"
#include <iostream>
#include <string>
#include <list>
using namespace std;
class Node {
public:
Node();
Node(char code, int num, string data);
Node(Node & node);
~Node();
bool readFile();
void setNext(Node* next);
void print();
private:
char Code;
int Num;
string Data;
Node *Next;
};
Node::Node() {
Code = '\0';
Num = 0;
Data = "";
Next = NULL;
}
Node::Node(char code, int num, string data) {
char Code = code;
int Num = num;
string Data = data;
Next = NULL;
}
Node::Node(Node & node) {
Code = node.Code;
Num = node.Num;
Data = node.Data;
Next = NULL;
}
Node::~Node() {
}
bool Node::readFile() {
char code = '\0';
int num = 0;
string data = "";
ifstream inputFile;
inputFile.open("prog6.dat");
if(!inputFile) {
cerr << "Open Faiulre" << endl;
exit(1);
return false;
}
Node *head = NULL;
while(!inputFile.eof()) {
inputFile >> code >> num >> data;
Node *temp = new Node(code, num, data);
temp->setNext(head);
head = temp;
}
inputFile.close();
head->print();
return true;
}
void Node::setNext(Node* next) {
Next = next;
}
void Node::print() {
cout << Code << " " << Num << " " << Data;
if(Next != NULL)
Next->print();
}
我的主要/测试文件:
//program6test.cpp
#include "program6.h"
#include <iostream>
#include <fstream>
#include <list>
using namespace std;
int main() {
Node list;
if(list.readFile())
cout << "Success" << endl;
else
cout << "Failure" << endl;
return 0;
}
这是我编译和运行该程序时得到的输出:
[cs331129@cs ~]$ g++ -o prog6 program6test.cpp
[cs331129@cs ~]$ prog6
terminate called after throwing an instance of 'St9bad_alloc'
what(): St9bad_alloc
Aborted
以下是我给出的“指示”:
超级卡“堆栈”概念比堆栈更通用,因为“卡” (元素)可以插入任何地方,并且可以遍历整个“堆栈” 到“家庭卡”。使用循环列表,实现超级卡堆栈。
假设我们有一个包含密钥代码的类或记录结构(下面) (整数),25个字符或更少的信息字符串(类型Entry)和指针
typedef struct elem_tag {
Key key;
Entry fact;
struct elem_tag * link;
} Node_type;
我们可以创建“超级卡堆栈”,从文件中读取信息,构建卡的链接列表,并执行操作(insert(i)
,delete(d)
,traverse(t)
,{{列表中有1}},home(h)
,forward(f)
)。例如,给定一个包含以下内容的数据文件
print(p)
我们在下面制作一个“超级卡片组”。
i 27 Mary had a little lamb
i 15 Today is a good day
i 35 Now is the time!
i 9 This lab is easy and fun
p
注意27是“家庭卡”(家庭卡是一个尾部指向后的下一个)并且打印的卡将与“当前”相关联(即“本实验室......”)。如果我们现在处理以下数据文件项:
-------Tail/Current
v
---> 27 ---> 15 ---> 35 ---> 9 ---
| Mary... Today... Now... This... |
----------------------------------------------------------------------------
我们将得到以下列表(请注意,traverse(t)应输出当前指针对整个列表遇到的每个“事实”。
d 35
t
i 37 Better now.
如果我们处理数据项
--- Current ---- Tail
v v
---> 27 ---> 15 ---> 37 ---> 9 ---
| Mary... Today... Better... This... |
-------------------------------------------------------------------------------
列表将是
h
要删除9(即数据文件中出现d 9),必须找到之前的卡(“当前指向它”)和“尾巴”调整。
编写C ++程序来执行以下操作:
输入: 文件中的每个输入数据行将包含一个字符代码和相应的数据(不会引入任何错误),并且将在prog6.dat中。分别读取和处理每行到文件末尾。
输出: 输出将包含来自print(p)或traverse(t)命令的事实(字符串)以及每个命令的活动响应。
提示: 声明一个列表类型,可以是类或记录(struct是公共类) - 例如:
--- Current --- Tail
v v
---> 27 ---> 15 ---> 37 ---> 9 ---
} Mary... Today... Better... This... |
-------------------------------------------------------------------------------
通过在列表末尾依次插入每个数据项来构建初始链接列表。保持“尾巴”和“当前”指针。你必须检查是否“ 插入前尾部“指针为NULL,否则插入”当前“位置之后。删除将导致“当前”指针被设置为在被删除之前指向卡(除非它是最后一张卡,在这种情况下“Tail”和“Current”必须变为NULL)。前进(f)应将“当前”指针移动到下一张卡。
为每个ADT列表操作(即init / create,insert,delete,print,traverse,home)编写一个单独的函数,首先作为存根开发,然后作为完整函数开发。使用将main,functions和headers放在单独文件中的标准技术
以下是我将用于输入的文件:
typedef struct list_tag{
Node_type * current;
Node_type * tail;
} List_type;
我不知道从哪里开始或者如何做其他事情。我整晚都在阅读教程,但它并没有点击如何应用任何我正在读这个程序的东西。我只是试图通过这个课程与C一起看,因为我已经改变了下学期的专业,因为我对这一切都很糟糕。有人可以帮忙吗?
答案 0 :(得分:0)
问题是,我不知道我在做什么
提示:
我正在开发一个应该使用链表的C ++程序 创建一个超级卡堆栈(无论是什么)。
没有任何意义来声明两次类Node:一个作为独立类,另一个作为类List的内部类。有些功能也没有任何意义。例如成员函数
bool readFile():
创建一个本地列表
Node *head = NULL;
while(!inputFile.eof()) {
inputFile >> code >> num >> data;
Node *temp = new Node(code, num, data);
temp->setNext(head);
head = temp;
}
导致内存泄漏。
最好定义一个具有内部结构Node的列表。
考虑到C ++中有标准的单链表std::forward_list