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

时间:2014-11-06 07:33:55

标签: c++ file linked-list

我正在开发一个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一起看,因为我已经改变了下学期的专业,因为我对这一切都很糟糕。有人可以帮忙吗?

1 个答案:

答案 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