簡體   English   中英

循環鏈表:無限循環

[英]Circular linked list: Infinite loop

我正在嘗試制作一個循環鏈接列表,但面臨一個問題。

如果我使用上面的兩行代碼運行該程序,則在我編譯和運行時,如果元素數大於2,它將得到cin的無限循環。如果沒有,它們工作得很好,但它不再是一個循環鏈表。 你能幫我嗎 ?

問題就在這里:

toPush->next = head;
head->pred = toPush;

完整代碼:

#include <iostream>
using namespace std;

typedef int data;

// Nodes

struct elements {
    data value;
    elements* next;
    elements* pred;
};

// Function that pushes the element to the end

void insertElementEnding(elements* &head, data var) {
    elements* toPush = new elements;
    toPush->value = var;
    toPush->next = NULL;
    toPush->pred = NULL;
    if(head == NULL) {
        head = toPush;
    } else {
        elements* node = new elements;
        node = head;
        while(node->next != NULL) {
            node = node->next;
        }

        node->next = toPush;
        toPush->pred = node;
        toPush->next = head;
        head->pred = toPush;
    }
}

// Function that prints the list

void showList(elements* head, int numbers) {
    for(int i = 0; i < numbers && head != NULL; i++) {
        cout << head->value;
        head = head->next;
    }
}

int main() {
    elements* head = NULL;
    int var, n;

    cout << "Introduce the number of elements: ";
    cin >> n;

    for(int i = 0; i < n; i++) {
        cin >> var;
        insertElementEnding(head, var);
    }

    showList(head, n);

    return 0;
}

提前致謝。

您需要尋找循環的開始,而不是NULL,即

while(node->next != NULL)

應該

while(node->next != head)

附帶說明,在C ++中,應使用nullptr而不是NULL

另外,您的程序中存在內存泄漏。 您不需要分配新的內存就可以獲取用於迭代列表的指針。 這就是問題所在:

elements* node = new elements;
node = head;

更好的方法就是

elements* node = head;

首先,對NULL的驗證僅在將第一個元素插入列表之前檢查列表是否未初始化才有意義。

對於所有其他情況,這是多余的,因為圓頭應該始終具有該圓的上一個和下一個元素。 萬一它至少是一個,它就指向自己。

然后,如果您稍微更改功能,它將解決問題

void insertElementEnding(elements* &head, data var) {

    elements* toPush = new elements;
    toPush->value = var;

    if(head == NULL) {
        head = toPush;
        head->next = toPush;
        head->pred = toPush;
    } else {
        // insert the new element before the head
        head->pred->next = toPush;
        head->pred = toPush;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM