簡體   English   中英

C ++使用For循環創建雙向鏈表

[英]C++ Using For loop to create Doubly linked list

我有一個賦值,我需要從用戶獲取一個輸入字符串,然后使用字符串中的字符填充雙向鏈表。 這意味着我需要遍歷用戶字符串並生成雙向鏈表。 我創建了一個for循環並且輸出有效但我的程序在顯示輸出后立即崩潰。 我總共有2周的C ++經驗,所以請原諒我的菜鳥錯誤。 找到下面的代碼。

#include<cstdlib>
#include<iostream>
#include <string>

using namespace std;

struct node {
    string data;
    node *next;
    node *prev; 
};

string getString() {
    string userString;
    cout << " Please enter a string for reversal: ";
    cin >> userString;
    return userString;  
}

// print forward
void printDataFor(node* head);
// print reverse
void printDataRev(node* tail);   

int main() {
    node* head= new node;
    node* tail= new node;
    node* n;
    string reverse = getString();
    int length = reverse.length();

    // loop to create linked list
    for (int i = 0; i < length - 1; i++) {
        if (head->prev == NULL) {
            n = new node;
            n->data = reverse[i];
            n->prev = NULL;
            head = n;
            tail = n;
        }
        else {
            n = new node;
            n->data = reverse[i];
            n->prev = tail;
            tail->next = n;
            tail = n;
        }
    }

    n = new node;
    n->data = reverse[length-1];
    n->prev = tail;
    tail->next = n;
    tail = n;
    tail->next = NULL;
    // call to print reverse
    printDataRev(tail);
}

// print forward
void printDataFor(node* head) {
    node* temp = head;
    while (temp != NULL) {
        cout << temp->data;
        temp = temp->next;
    }
}

// print reverse
void printDataRev(node* tail) {
    node* temp = tail;
    while (temp != NULL) {
        cout << temp->data;
        temp = temp->prev;
    }
}

顯示的代碼中存在多個錯誤。

node* head= new node;

// ...

if (head->prev == NULL) {

您希望新構造的節點將prevnext指針初始化為NULL。

這是一個非常合理的期望。 問題是你的代碼中沒有任何內容可以做到這一點:

struct node {
    string data;
    node *next;
    node *prev;
};

如果沒有一個明確的構造, new不會初始化nextprev任何東西。 它們將是垃圾,顯示的代碼可能會嘗試在某些時候對垃圾指針進行反轉,從而導致崩潰。

您需要一個顯式構造函數,將它們初始化為NULL(或使用當前C ++標准中引入的新語法,並為它們聲明一個默認的初始化程序)。

這是第一個問題。

第二個問題是,主要for循環編碼迭代少一個倍它需要,出於某種原因unexplicable,並有該插入的最后一個值到鏈表的代碼復制塊。 我沒有看到為什么需要這樣做的任何理由。 只需迭代所有字符,然后插入它們。

第三個問題是,邏輯會出現插入一個額外的headtail在你的鏈表,其數據將是一個空字符串節點。 從它的外觀來看,這將沒有任何可見的效果,因為打印鏈表的循環將只打印一個空字符串。 不過,這在技術上是錯誤的。

您需要調整邏輯以消除重復的虛假節點。 首先將headtail初始化為NULL ,而不是一個new ,幾乎無用的節點:

node *head=NULL;
node *tail=NULL;

然后相應地調整for循環中的邏輯,以測試字符串中第一個字符的邊緣條件,這將構造一個新的節點, headtail指向它,以及插入每個后續的常規執行路徑head前的性格。

暫無
暫無

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

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