使用C++列表标准库来帮助链接列表程序

Using the C++ list standard library to help in linked-list program

本文关键字:列表 帮助 链接 程序 C++ 标准 使用      更新时间:2023-10-16

我正在开发一个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