使用循环将随机数添加到链接列表中

时间:2014-03-16 17:32:13

标签: c++ random linked-list

我想在链表中添加一个完全随机的数字,但我不想将所有代码都放在main中,而是希望使用面向对象的方法。我有我的标准Node类和它的标题,然后在main我想要一个循环运行20次然后停止添加更多。我得到了我的插入函数以及如何在main中调用它,但我似乎无法获得随机数。我知道你不能将int分配给一个类,但我真的不知道如何将我的随机数合并到我的函数中以便将它插入我的列表中。

这是我的代码。观察main的第20行的错误。任何见解都会很棒。谢谢!

Main.cpp的

#include <iostream>
#include <iomanip>
#include <time.h>
#include "Node.h"

using namespace std;

int main()
{
    srand(time(NULL));

    Node link_head;
    Node instance;

    for (int i = 0; i < 20; i++)
    {
        int random = rand() % 100;

        instance.insert(&link_head, &random);
    }
}

Node.h

#include <iostream>
#include <iomanip>

#ifndef NODE_H
#define NODE_H

typedef int ElementType;

class Node
{
public:

    Node();
    ElementType data;
    Node *next;
    int insert(Node *, Node *);

};

#endif NODE_H

Node.cpp

#include <iomanip>
#include <iostream>
#include "Node.h"

using namespace std;

Node::Node()
{
    this -> data = 0;
    this -> next = NULL;
}

int Node::insert(Node *link_head, Node *newNode)
{
        Node *current = link_head;

        while (true) 
        { 
            if(current->next == NULL)
            {
                current->next = newNode;
                break;
            }
            current = current->next;
        }

    return 0;
}

2 个答案:

答案 0 :(得分:1)

您正在将int的地址发送到需要节点上的指针的函数。首先分配一个新节点,然后将其发送给该函数。

for (int i = 0; i < 20; i++)
{
    int random = rand() % 100;

    Node* newNode = new Node;
    newNode->data = random;
    instance.insert(&linkHead, newNode);
}

如上所述,即使是自由函数,insert方法也应该是静态的,因为它只访问结构的公共成员。

答案 1 :(得分:1)

您的代码在几个方面存在缺陷。

  1. instance.insert(&link_head, &random); &random未指向Node,因此编译错误
  2. int insert(Node *, Node *);应为static int insert(Node **, Node *);并按如下方式使用

  3. Node* head = NULL;
    
    for (int i = 0; i < 20; i++)
    {
        Node* newNode = new Node;
        newNode->data = rand() % 100;
        Node::insert(&head, newNode);
    }
    

    实施情况如下:

    int Node::insert(Node** link_head, Node *newNode)
    {
        if(!link_head) {
            return -1;
        }
        if(!(*link_head)) {
            *link_head = newNode;
        }
        else {
            newNode->next = (*link_head)->next;
            (*link_head)->next = new_node;
        }
        return 0;
    }
    

    不同之处在于您使用head引用作为链接列表的,并且您将不会有一个无用的实例,它总是需要从存储的实际值中整理出来在列表中。