2014-03-06 4 views
0

모든 노래가있는 CD를 컬렉션에 추가해야합니다. CD 컬렉션에서 CD를 제거하는 방법을 찾으려고합니다. 예를 들어 아티스트 이름, CD 이름, 각 노래의 제목과 길이를 추가하고 표시 기능을 호출하면 모든 정보가 표시됩니다. 아티스트, CD 이름 및 CD 길이를 매개 변수로 사용하여 deleteNode 함수를 호출하면 표시 기능에 내가 추가 한 내용이 계속 표시됩니다. 프로그램이 잘 빌드하지만 나는 deleteNode 함수를 올바르게 호출하지 못한다고 생각합니다. 또한 연결된 목록에는 클래스의 데이터 형식이 있습니다. 나는 그것을 모두 제거에 도착 어떻게 deleteNode에 대한 매개 변수로 artist, namelength)를 사용하는 경우노드를 삭제하는 방법

구조체

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 함수를 호출 너무 삽입 된 노래? 내가 필요한 최소한의 코드를 사용하는 것을 시도하고있다

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

좋아하는 목록 데이터 구조에서 make가 어떻게되는지보십시오. – 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 ok. 그렇다면 그것은 의미가 있습니다. 나는 그것이 다른 것으로 생각했다. 이것은 당신을 위해 그 때 일해야한다. – WhozCraig

+0

좋아요. 그냥 확인해 봤지만 표시 기능을 호출하면 첨부 된 항목이 계속 표시됩니다. 어쩌면 내가 추가하는 방식에 문제가있을 수 있습니까? 추가 코드를 게시하면이 코드를 볼 수 있습니까? – Lilspree

1

실제로 CD에 LinkedList의에서 CD

에게

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; 
    } 
} 

오버로드 운영자를 deleteNode 기능을 삭제할.

여러분이 그 의견을 추가해 주셔서 감사합니다.

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 */); 

하고있는 노드를 삭제 : 당신은 단순히이 같은 std::list을 사용할 수 있습니다

list.pop_back(); 

이 같은 최소한의 오류로 무료 얻을 수 있습니다. 물론 더블 링크 목록 구현의 중요성을 느낄 경우 언제든지 std::forward_list으로 폴백 할 수 있습니다.

+0

그는 실제로 집에서 만든 연결 목록에서 항목을 모두 제거하는 방법을 실제로 고안해야한다고 생각합니다.이 경우'std :: list' 등을 사용하면 좋지 않습니다. 그래도 너의 제안은 좋은 생각이다. –

+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'는 널 포인터를 가지기 때문에'head-> next'는 전 세계를 끝낼 것입니다. –

관련 문제