使用C++列表标准库来帮助链接列表程序
Using the C++ list standard library to help in linked-list program
我正在开发一个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 = ' ';
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 = ' ';
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 个字符的信息字符串(类型条目(和一个指针
typedef struct elem_tag {
Key key;
Entry fact;
struct elem_tag * link;
} Node_type;
我们可以创建一个"超级卡堆栈",从文件中读取信息,构建卡片链表,并在列表上执行操作(insert(i)
、delete(d)
、traverse(t)
、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
我们在下面制作了一个"超级卡堆栈"。
-------Tail/Current
v
---> 27 ---> 15 ---> 35 ---> 9 ---
| Mary... Today... Now... This... |
----------------------------------------------------------------------------
请注意,27 是"家庭卡"(家庭卡是尾部指向的下一个卡(,打印的卡将与"当前"相关联(即"此实验室......"(。如果我们现在处理以下数据文件项:
d 35
t
i 37 Better now.
我们将有以下列表(请注意,遍历 (t( 应从当前指针输出整个列表遇到的每个"事实"(。
--- Current ---- Tail
v v
---> 27 ---> 15 ---> 37 ---> 9 ---
| Mary... Today... Better... This... |
-------------------------------------------------------------------------------
如果我们处理数据项
h
该列表将是
--- Current --- Tail
v v
---> 27 ---> 15 ---> 37 ---> 9 ---
} Mary... Today... Better... This... |
-------------------------------------------------------------------------------
要删除 9(即数据文件中出现 d 9(,必须找到之前的卡("当前指向它"(并调整"尾部"。
编写C++程序以执行以下操作:
- 阅读信息并构建"超级卡"链表
- 处理所有代码和数据。在尝试读取之前先检查代码任何其他数据。请记住检查特殊情况(即列表为空,列表有一个元素等(。
输入:文件中的每个输入数据行将包含一个字符代码和适当的数据(不会引入错误(,并将在 prog6.dat 中。分别读取和处理每一行到文件末尾。
输出:输出将包含来自打印 (p( 或遍历 (t( 命令的事实(字符串(以及每个命令的活动响应。
提示:将列表类型声明为类或记录(struct 是公共类( - 例如:
typedef struct list_tag{
Node_type * current;
Node_type * tail;
} List_type;
通过在列表末尾依次插入每个数据项来构建初始链表。维护"尾部"和"当前"指针。您必须检查是否"尾部"指针在插入前为 NULL,否则插入在"当前"位置之后为 NULL。删除将导致"当前"指针设置为指向要删除的卡之前的卡(除非它是最后一张卡,在这种情况下,"尾部"和"当前"必须变为 NULL(。前进 (f( 应将"当前"指针移动到下一张卡。
为每个 ADT 列表操作(即初始化/创建、插入、删除、打印、遍历、主页(编写一个单独的函数,首先开发为存根,然后开发为完整函数。使用将 main、函数和标头放在单独文件中的标准技术
这是我将用于输入的文件:
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
d 35
t
i 37 Better Now.
f
p
h
p
d 27
d 15
d 37
d 9
i 44 This should be it!
t
p
我不知道从这里去哪里或如何做其他事情。我整晚都在阅读教程,但它只是没有点击如何应用我正在阅读的任何东西这个程序。我只是想用C分通过这门课,因为我已经改变了下学期的专业,因为我对这一切很糟糕。谁能帮忙?
问题是,我不知道我在做什么
提示:
我正在开发一个应该使用链表的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;
}
这会导致内存泄漏。
最好定义一个具有内部结构节点的列表。
考虑到C++中存在标准的单链表std::forward_list
- Pybind11:将元组列表从Python传递到C++
- 从链接列表c++中删除一个项目
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- C++如何通过用户输入删除列表元素
- 读取文件的最后一行并输入到链接列表时出错
- 需要帮助设置在C++中使用的Potrace
- C 需要帮助的作业程序,该程序在文件列表中读取并在每个双重的双重列表中添加一个字符串
- C 指针节点帮助 - 将参数复制到链接的列表节点更改该节点的不同部分
- 寻找一种更快的方法来帮助减少/创建大量字符串列表
- 链接列表帮助C
- 我需要帮助对此双链接列表(C )进行分类
- C++ 指针帮助缺少参数列表使用 &帐户::获取余额
- 逻辑帮助:比较值并取最小距离,同时将其从"available to compare"列表中删除
- 需要帮助了解列表容器
- 家庭作业帮助:用户制作的列表输出
- 使用C++列表标准库来帮助链接列表程序
- 链接列表帮助,迭代器问题
- C++列表/矢量帮助
- 在C++链接列表中帮助.show记录功能启动无限循环
- 卡住了,需要帮助从矢量列表返回时间跨度