簡體   English   中英

雙鏈表的輸出

[英]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.

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