[英]Output of doubly linked list
我一直在嘗試制作一個雙向鏈接列表(我感覺自己很親近),但是我似乎無法獲得正確的輸出。 我的輸出似乎向我拋出了一些非常隨機的值。 我覺得問題出在我的操作員超負荷,但是我似乎無法理解它,而早晨的太陽接近XD。 非常感謝大家的幫助!
另外,為方便起見,預期輸出為:(忽略行之間的空格)
馬西王子
喬爾·戴維·康拉德·馬西親王
Nic Lindo Ernest喬爾·戴維·康拉德·馬西王子
Nic Lindo Ernest喬爾·戴維·康拉德·馬西王子
Lindo Ernest喬爾·戴維·康拉德·馬西王子
Lindo Ernest喬爾·大衛·康拉德·皮斯·馬西·傑西·謝恩·理查德
Lindo Ernest喬爾·大衛·康拉德·皮斯·馬西·傑西·謝恩
Lindo Ernest喬爾·大衛·康拉德·皮斯·馬西·傑西
Lindo Ernest喬爾·大衛·康拉德·皮斯·馬西
Lindo Ernest喬爾·戴維·康拉德·皮斯
#include <cstdlib>
#include <string>
#include <iostream>
using namespace std;
class StringNode{
public:
string elem;
StringNode* next;
StringNode* prev;
friend class StringLinkedList;
};
class StringLinkedList{
public:
StringLinkedList();
~StringLinkedList();
bool isEmpty() const;
const string& front() const;
const string& back() const;
void addFront(const string& e);
void addBack(const string& e);
void removeFront();
void removeBack();
friend ostream& operator<<(ostream& out, const StringLinkedList& obj);
private:
StringNode* head;
StringNode* tail;
protected:
void add(StringNode* v, const string& e);
void remove(StringNode* v);
};
StringLinkedList::StringLinkedList(){
head = new StringNode;
tail = new StringNode;
head->next = tail;
tail->prev = head;
}
StringLinkedList::~StringLinkedList(){
while(!isEmpty()){
removeFront();
}
delete head;
delete tail;
}
bool StringLinkedList::isEmpty() const{
return (head->next == tail);
}
const string& StringLinkedList::front() const{
return head->next->elem;
}
const string& StringLinkedList::back() const{
return tail->prev->elem;
}
void StringLinkedList::add(StringNode* v, const string& e){
StringNode* u = new StringNode; u->elem = e;
u->next = v;
u->prev = v->prev;
v->prev->next = v->prev = u;
}
void StringLinkedList::addFront(const string& e){
add(head->next, e);
}
void StringLinkedList::addBack(const string& e){
add(tail, e);
}
void StringLinkedList::remove(StringNode* v){
StringNode* u = v->prev;
StringNode* w = v->next;
u->next = w;
w->prev = u;
delete v;
}
void StringLinkedList::removeFront(){
remove(head->next);
}
void StringLinkedList::removeBack(){
remove(tail->prev);
}
ostream& operator <<( ostream& out, const StringLinkedList &obj )
{
for ( StringNode *temp = obj.head->next; temp != obj.tail; temp = temp->next )
{
out << temp->elem << ' ';
}
return out;
}
int main(void){
StringLinkedList* myList = new StringLinkedList();
myList->addFront("Massi");
myList->addFront("Prince");
cout<< *myList << endl;
myList->addFront("Conrad");
myList->addFront("David");
myList->addFront("Joel");
cout<< *myList << endl;
myList->addFront("Ernest");
myList->addFront("Lindo");
myList->addFront("Nic");
cout<< *myList << endl;
myList->addFront("Sasha");
myList->removeFront();
cout<< *myList << endl;
myList->removeFront();
cout<< *myList << endl;
myList ->addBack("Jesse");
myList ->addBack("Shane");
myList ->addBack("Richard");
cout << *myList << endl;
myList -> removeBack ();
cout << *myList << endl;
myList -> removeBack ();
cout << *myList << endl;
myList -> removeBack ();
cout << *myList << endl;
myList -> removeBack ();
cout << *myList << endl;
return 0;
}
假設u
是順序的。
下面的代碼
void StringLinkedList::add(StringNode* v, const string& e){
StringNode* u = new StringNode; u->elem = e;
u->next = v;
u->prev = v->prev;
v->prev->next = v->prev = u; // this line has the issue
}
執行以下過程(假設1 =頭,2 = v,3 =尾)
讓我們在v = 2和tail = 3之間添加“ 4”,即執行add(tail,data)。
u = 4; 4的下一個是tail 4的前一個是tail(3)的當前前一個,即2現在,我們修改原始列表的向后鏈接。 然后3的前一個是4,但是然后4(現在是v-> prev)的下一個是4,它本身就是。
逐行瀏覽代碼確實有幫助。 使用橡皮鴨:
這個運算符
ostream& operator<<(ostream& out, const StringLinkedList& obj){
StringNode* temp = obj.head;
while(temp != NULL){
out << temp->elem << ' ';
temp = temp->next;
}
return out;
}
這是錯誤的,因為它試圖輸出不存儲字符串的head
和不存儲字符串的tail
數據成員elem
,而且next
具有未初始化的成員。
該功能可以通過以下方式定義
ostream& operator <<( ostream& out, const StringLinkedList &obj )
{
for ( StringNode *temp = obj.head->next; temp != obj.tail; temp = temp->next )
{
out << temp->elem << ' ';
}
return out;
}
另外函數add的最后一條語句是錯誤的
v->prev->next = v->prev = u;
您應該將其分為兩個語句。 例如
void StringLinkedList::add( StringNode *v, const string &e )
{
StringNode *u = new StringNode; u->elem = e;
u->next = v;
u->prev = v->prev;
u->prev->next = u;
v->prev = u;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.