[英]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) {
您希望新構造的節點將prev
和next
指針初始化為NULL。
這是一個非常合理的期望。 問題是你的代碼中沒有任何內容可以做到這一點:
struct node {
string data;
node *next;
node *prev;
};
如果沒有一個明確的構造, new
不會初始化next
和prev
任何東西。 它們將是垃圾,顯示的代碼可能會嘗試在某些時候對垃圾指針進行反轉,從而導致崩潰。
您需要一個顯式構造函數,將它們初始化為NULL(或使用當前C ++標准中引入的新語法,並為它們聲明一個默認的初始化程序)。
這是第一個問題。
第二個問題是,主要for
循環編碼迭代少一個倍它需要,出於某種原因unexplicable,並有該插入的最后一個值到鏈表的代碼復制塊。 我沒有看到為什么需要這樣做的任何理由。 只需迭代所有字符,然后插入它們。
第三個問題是,邏輯會出現插入一個額外的head
和tail
在你的鏈表,其數據將是一個空字符串節點。 從它的外觀來看,這將沒有任何可見的效果,因為打印鏈表的循環將只打印一個空字符串。 不過,這在技術上是錯誤的。
您需要調整邏輯以消除重復的虛假節點。 首先將head
和tail
初始化為NULL
,而不是一個new
,幾乎無用的節點:
node *head=NULL;
node *tail=NULL;
然后相應地調整for循環中的邏輯,以測試字符串中第一個字符的邊緣條件,這將構造一個新的節點, head
和tail
指向它,以及插入每個后續的常規執行路徑head
前的性格。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.