【问题标题】:How could I create a list in c++?如何在 C++ 中创建列表?
【发布时间】:2010-09-28 17:07:52
【问题描述】:

如何在 C++ 中创建列表?我需要它来创建一个链表。我该怎么做呢?有没有我可以学习的好教程或示例?

【问题讨论】:

  • 他说他是自己学的,不是为了作业。我认为添加作业标签是不合理的
  • @litb - 同意。我只是调整了标签。
  • 我们确实需要一个标签来描述用户何时想要代码并且它不是家庭作业。我提名“plzsendtehcodez”。
  • @Gortok - 我认为这没有帮助。这不是“我想写一个 3d 射击游戏/创建一个僵尸网络/问题”之一。这是一个“简单”的问题,但仍然是一个合理的 IMO。 plzsendtehcodez 是一个非常侮辱性的标签,应该更加谨慎地使用......
  • @Roddy 在我将其编辑为“合理”之前,您应该已经看过它。

标签: c++ list stl linked-list


【解决方案1】:

我认为你知道 C++ 已经有一个链表类,并且你想实现你自己的,因为你想学习如何去做。

首先,阅读 Why do we use arrays instead of other data structures? ,其中包含基本数据结构的一个很好的答案。然后想想如何在 C++ 中建模:

struct Node {
    int data;
    Node * next;
};

基本上这就是实现列表所需的全部内容! (一个非常简单的)。然而它没有抽象,你必须手动链接项目:

Node a={1}, b={20, &a}, c={35, &b} d={42, &c};

现在,您有一个节点的链表,全部分配在堆栈上:

d -> c -> b -> a
42   35   20   1

下一步是编写一个包装类List,它指向起始节点,并允许根据需要添加节点,跟踪列表的头部(以下非常简化):

class List {
    struct Node {
        int data;
        Node * next;
    };

    Node * head;

public:
    List() {
        head = NULL;
    }

    ~List() {
        while(head != NULL) {
            Node * n = head->next;
            delete head;
            head = n;
        }
    }

    void add(int value) {
        Node * n = new Node;
        n->data = value;
        n->next = head;
        head = n;
    }

    // ...
};

下一步是使 List 成为模板,以便您可以填充其他值(不仅是整数)。

如果您熟悉智能指针,则可以将使用的原始指针替换为智能指针。我经常发现人们向初学者推荐智能指针。但在我看来,您应该首先了解为什么需要智能指针,然后再使用它们。但这需要您首先了解原始指针。否则,你会使用一些神奇的工具,却不知道你为什么需要它。

【讨论】:

  • 以上面的例子,在各自的头部获取各自数据的功能是什么? PS我是菜鸟。
【解决方案2】:

你真的应该使用standard List class。当然,除非这是一个家庭作业问题,或者您想知道 STL 是如何实现列表的。

您可以通过 google 找到很多简单的教程,例如 this one。如果您想了解链表是如何“在幕后”工作的,请尝试搜索 C 列表示例/教程而不是 C++。

【讨论】:

    【解决方案3】:

    如果你要使用std::list,你需要传递一个类型参数:

    list<int> intList;  
    list<int>* intListPtr = new list<int>;
    

    如果您想了解列表的工作原理,我建议您搜索一些 C/C++ 教程以了解该主题。下一步就是学习足够的 C++ 来创建一个列表类,最后是一个列表模板类。

    如果您还有其他问题,请在此处提问。

    【讨论】:

      【解决方案4】:

      为什么要重新发明轮子。只需使用 STL 列表容器即可。

      #include <list>
      
      // in some function, you now do...
      std::list<int> mylist; // integer list
      

      More information...

      【讨论】:

      • std::list 是参数化类型,new 返回一个指针,您的示例应该更像: list* mylist = new list;或者更好的是,简单地说:list mylist;
      【解决方案5】:

      我猜这是一道作业题,所以你可能想去here。它有一个解释链表的教程,提供了很好的伪代码,还有一个可以下载的 C++ 实现。

      我建议在盲目使用实现之前通读解释并理解伪代码。如果您想继续学习 CS,这是一个您真正应该深入了解的主题。

      【讨论】:

        【解决方案6】:
        【解决方案7】:

        使用 C++ 模板

        创建列表

        template <class T> struct Node 
        {
            T data;
            Node * next;
        };
            
        template <class T> class List 
        {
            Node<T> *head,*tail;
                
            public: 
                void push(T const&);  // push element 
                void pop();           // pop element 
                bool empty()          // return true if empty. 
        }; 
        

        然后你可以编写如下代码:

        List<MyClass>;
        

        T 类型在运行时不是动态的。它仅用于编译时。

        完整示例click here

        C++模板教程click here.

        【讨论】:

          【解决方案8】:

          我们已经进入 21 世纪了!! 不要试图实现已经存在的数据结构。 尝试使用现有的数据结构。

          使用 STL 或 Boost 库

          【讨论】:

          • Imo 创建一些简单的实现功能或结构的尝试总是一个好主意。 ;)
          • 我同意 karx。我们在学校有过这样的作业,我想说,我对已经编写的代码更加欣赏,并且因此更加了解它实际上做了什么。一个类似的案例也是学习汇编程序。抽象的知识通常很好。
          • 如果它是一个赋值,那么它很容易实现,如果它是一个更大的项目的一部分,如果它被用于一个更大的项目来存储数据,那么我们不应该实现我们应该使用现有的库。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-19
          • 1970-01-01
          • 2011-12-26
          • 2016-02-04
          • 2018-06-25
          相关资源
          最近更新 更多