2014-05-14 3 views
1

내 목록에서 노드를 찾고 삭제하는 데 문제가 있습니다. 여러 가지 방법을 시도했지만 지금까지는 제 코드입니다. 문제가 내 삽입물에 있거나 어쩌면 디스플레이 기능에 있는지 알 수 없습니까? 당신이 잃어버린 때문에, 나는 "거의C++ 이중 연결 목록 검색 및 제거

void removeStudent(int id) 
{ 
    node *trash = NULL; 

    node *current = head; 
    while (current!= NULL) 
    { 
     if (current->data.id == id) 
     { 
      trash = current; 
      current->prev->next = current->next; 
      current->next->prev = current->prev; 
      delete trash; 


     } 
    } 


} 

이 내 삽입 기능

void push(student s) 
{ 

    node *tmp = new node; 
    tmp->data = s; 
    tmp->next = head; 
    tmp->prev = NULL; 

    if (head == NULL) 
    { 
     head = tmp; 
     tail = tmp; 
    } 
    else 
    { 
     head->prev = tmp; 
     head = tmp; 
    } 

} 

입니다.이 학습 M과이

void display() 
{ 
    node *current = head; 

    while (current!=NULL) 
    { 
     cout << current->data.name << endl; 
     cout << current->data.GPA << endl; 
     cout << current->data.id << endl; 
     cout << current->data.university << endl; 
     current = current->next; 
    } 
} 
+0

왜'node * trash = new node; '입니까? 이로 인해 메모리가 누수됩니다. – crashmstr

+0

목록의 처음 또는 끝에 (또는 둘 다) 노드의 특별한 경우를 처리해야합니다. 그 힌트가 충분합니까? – Beta

+0

'여러 가지 방법을 시도했습니다. '한 가지 길 밖에 없어서 종이에 적거나 글을 쓰는 방식입니다. 이와 같은 과제가 있으면 노드와 링크를 나타내는 상자와 선을 그려야합니다. 그런 다음 중간 노드를 연결 해제하고 두 개의 나머지 노드를 함께 연결하기 위해 수행해야 할 작업을 확인합니다. 그런 다음 종이에 쓴 내용을 시뮬레이션하는 코드를 작성합니다. – PaulMcKenzie

답변

0

다음을 시도해보십시오. 귀하의 클래스에도 데이터 멤버 꼬리가 포함되어 있다고 가정합니다. 클래스는 다음 데이터 멤버 꼬리가없는 경우

void removeStudent(int id) 
{ 
    node *current = head; 

    while (current != NULL && current->data.id != id) current = current->next; 

    if (current != NULL) 
    { 
     if (current->prev != NULL) current->prev->next = current->next; 
     else head = current->next; 

     if (current->next != NULL) current->next->prev = current->prev; 
     else tail = current->prev; 

     delete current; 
    } 
} 

당신은 함수 본문에서 문을

 else tail = current->prev; 

를 제거해야합니다.

0
node *trash = new node; 
trash = current; 

메모리 누수 내 디스플레이 기능입니다 메모리 newin 첫 번째 줄에 의해 할당하고 해당 메모리 포인터를 유지하지 않습니다. trash 01 포인터를 할당합니다.하나.

당신은 그렇게해야합니다

node *trash = NULL; // declare a pointer and set it to NULL 

힌트 :

종이와 연필을 사용하여 코드를 테스트하기 위해 목록을 다루는 작은 목록을 작성하고 논문에서 실행 목록의 시작과 끝에서 노드를 수정 (여기서 삭제)하는 경우.

또한 노드의 목록이 하나이고 노드가 비어 있으면 어떻게됩니까?

0

current = current->next; 루프 끝 부분에서?

+0

깜빡 했어 :(하지만, 방금 추가 했더니이 라인에 오류가 발생했습니다. current-> next-> prev = current-> prev; – user3612662

+0

current-> next가 current-> next를 지정하기 전에 확인해야합니다 -> 이전과 그 반대, 그렇지 않으면 front & back 노드 삭제에 대한 예측 가능한 문제가있을 것입니다. – bigblackdot