双链表中的指针无法正常工作

时间:2019-04-27 07:13:27

标签: c++ doubly-linked-list

我想生成一个由用户选择的固定长度的随机双链表。

列表会在列表的开头插入第一个值,然后在列表的末尾插入所有其他值,但是不能正确调整指针。

头和尾节点都在main中初始化为NULL

随机值起作用,问题出在指针上,因为在第二次迭代中,尾部保持与头部相同,这意味着列表没有增加。

void GenRandSeq(struct Node* &head, struct Node* &tail, int len){
    int i = 0;

    std::mt19937 rng;
    std::uniform_int_distribution<uint32_t> uint_dist(0,10000);

    while (i < len){
        Node* newNode = new Node();
        int new_el = uint_dist(rng);
        newNode->key = new_el;
        newNode->prev = NULL;
        newNode->next = NULL;

        if (head == NULL){

            tail = newNode;
            head = newNode;
        }

        else{

            if (tail != NULL){
                newNode->next = NULL;
                newNode->prev = tail;
                tail->next = newNode;
            }
            else
                tail = newNode;
        }
        i++;
    }
}

我看不到代码中缺少的内容。

1 个答案:

答案 0 :(得分:2)

您没有正确设置tail

headtail都不为空时(当列表不为空时应始终为true),则不会更新tail指向新创建的节点。 tail的分配需要从else语句中移出。您要将新节点追加到列表的末尾,因此tail 必须每次循环迭代中进行更新。

请尝试以下类似操作:

void GenRandSeq(Node* &head, Node* &tail, int len){
    std::mt19937 rng;
    std::uniform_int_distribution<uint32_t> uint_dist(0,10000);

    while (len > 0){
        Node* newNode = new Node;
        newNode->key = uint_dist(rng);
        newNode->prev = tail;
        newNode->next = nullptr;
        if (!head){
            head = newNode;
        }
        if (tail){
            tail->next = newNode;
        }
        tail = newNode;
        --len;
    }
}

通过消除循环内的if语句,可以进一步简化以下内容:

void GenRandSeq(Node* &head, Node* &tail, int len){
    std::mt19937 rng;
    std::uniform_int_distribution<uint32_t> uint_dist(0,10000);

    Node **next = (tail) ? &(tail->next) : &head;

    while (len > 0){
        Node *newNode = new Node;
        newNode->key = uint_dist(rng);
        newNode->prev = tail;
        newNode->next = nullptr;
        *next = newNode;
        tail = newNode;
        next = &(newNode->next);
        --len;
    }
}