2014-03-06 78 views
0

我需要將所有歌曲的CD添加到集合中。我試圖找出如何從CD集合中刪除CD。例如,當我追加藝術家姓名,CD名稱,標題和每首歌曲的長度並調用顯示功能時,它會顯示所有信息。當我將藝術家,CD的名稱和CD的長度作爲參數調用deleteNode函數時,顯示功能仍會顯示我附加的內容。該程序的構建良好,但我不認爲我正確調用deleteNode函數。而且,鏈表具有該類的數據類型。如何刪除節點

該結構

class CD 
{ 
private: 
    string artist; // To hold artist nam 
    string name; // To hold name of CD 

struct disc 
{ 
    string title; // To hold title of the song 
    double length; // To hold length of the song 
    }my_disc; 
} 

調用從主

void remove_cd(LinkedList1<CD> *remove) 
{ 
    cout << "Enter the name of the artist of the CD you wish to remove: "; 
    cin.ignore(); 
    getline(cin, artist); 
    cout << "Enter the title: "; 
    cin >> title; 
    cout << "Enter the length: "; 
    cin >> length; 
    CD removeNode(artist, title, length); 
    remove->deleteNode(removeNode); 
} 

deleteNode功能。如果我使用artistname,並length)作爲參數deleteNode我怎麼得到它刪除所有的插入的歌曲也是?我想實際刪除CD

deleteNode功能LinkedList的

template <class T> 
    void LinkedList1<T>::deleteNode(T searchValue) 
{ 
    discList **pp = &head; 

    while (*pp && (*pp)->value != searchValue) 
     pp = &(*pp)->next; 

    if (*pp) 
    { 
     discList *victim = *pp; 
     *pp = victim->next; 
     delete victim; 
    } 
} 

重載運營商在CD

bool CD::operator == (const CD &e) 
{ 
    if (artist == e.artist) 
     return true; 
    return false; 
} 
bool CD::operator != (const CD &e) 
{ 
    if (artist != e.artist) 
     return true; 
    return false; 
} 
+0

我想根據需要使用最小代碼。請告訴我,如果你需要看到更多的代碼。 – Lilspree

+0

看看如何從喜歡的清單數據結構。 – user1929959

回答

1

我想不到的東西,而不進入遞歸不明智的土地要短得多,而且即便如此,這將是一個舒展。

這將做你想做的。

template<typename T> 
void LinkedList1<T>::deleteNode(const T& searchValue) 
{ 
    discList **pp = &head; 

    while (*pp && (*pp)->value != searchValue) 
     pp = &(*pp)->next; 

    if (*pp) 
    { 
     discList *victim = *pp; 
     *pp = victim->next; 
     delete victim; 
    } 
} 

而在你問之前,是的,它工作在空列表和空頭指針。該算法使用實際指針中的的實際列表,而不僅僅是它們的值,指針,來遍歷和銷燬。它假定你的列表也以NULL結尾。

最後,你的算法(以及這個算法)依賴於存在一個爲CD定義的邏輯相等運算符,其中我沒有看到它。如果你還沒有實現一個,你需要這樣做。

+0

謝謝。當我回家時我會試試這個。我在CD中重載了==和!=運算符。 'discList'是鏈接列表中結構的名稱。 – Lilspree

+0

@Lilspree好的。那麼這是有道理的。我認爲這是來自別的東西。這應該適合你。 – WhozCraig

+0

好吧,我剛剛檢查過,但當我打電話給我的顯示功能,它仍然顯示我附加的東西。我追加它的方式可能有問題嗎?如果我發佈附加代碼,你可以看看它嗎? – Lilspree

1

我想是需要使用最少的代碼。

我很高興你添加了該評論。你可以簡單地使用std::list這樣的:

class CD { 
private: 
    std::string artist; // To hold artist nam 
    std::string name; // To hold name of CD 
    struct disc { 
     std::string title; // To hold title of the song 
     double length; // To hold length of the song 
    } my_disc; 
}; 

std::list<CD> list; 

添加一個節點具有:

list.emplace_back(/* args for CD constructor */); 

,並刪除與一個節點:

list.pop_back(); 

這是最小的,因爲錯誤釋放它可以得到。當然,如果你覺得雙鏈表實現的重要性,你可以隨時回退到std::forward_list

+0

我認爲他可能需要真正設計如何從自制的鏈表中刪除一個項目,在這種情況下,'std :: list'之類的東西不會對他有任何好處。不過,你的建議很好。 – 2014-03-06 17:29:47

+0

感謝不幸的是,這個'deleteNode'函數是我被告知要使用的函數,它可能需要更改,也可能不需要更改。我使用'CD songsInfo(藝術家,標題,長度)來追加節點;' 'append-> appendNode(songsInfo);'和一個循環附加歌曲。 – Lilspree

0

它的C++,但可以是有用的。

template<class CAdat> 
bool List<CAdat>::Delete(const string &name) { 
    Node *tmp = head->next; 
    while (tmp != head && tmp->data.getName() != name) { 
     tmp = tmp->next; 
    } 
    if (tmp != head) { 
     tmp->prev->next = tmp->next; 
     tmp->next->prev = tmp->prev; 
     delete tmp; 
     return true; 
    } 
    return false; 
} 
+2

列表爲空的情況如何? head將保存一個空指針,所以line head-> next會讓整個世界結束。 – 2014-03-06 17:35:06