2016-07-22 3 views
-2

편집 :
그래, 원래의 모든 문제/질문을 수정하고 완료했습니다. 그러나 이제는 List.cpp에서 54 개의 gotoLast에 세분화 오류가 발생하고 왜 segfaulting인지 알 수 없습니다.순환 링크, 이중 연결 목록 - 분할 오류

List.h :

#ifndef _list_h 
#define _list_h 

struct ListNode 
{ 
int data; 
int rank; 
ListNode *prev, *next; 
// ListNode (int x = 0, ListNode *n, ListNode *p); 
}; 

class List { 
private: 
    ListNode *current; 
    ListNode *head; 
    ListNode *temp; 
public: 

    List(); 
    int size(); 
    int currentValue(); 
    int currentRank(); 
    void gotoFirst(); 
    void gotoLast(); 
    void retreat(); 
    void advance(); 
    void gotoRank(int r); 
    bool isNull(); 
    bool isFirst(); 
    bool isLast(); 
    void insertFirst(int x); 
    void insertLast(int x); 
    void insertBefore(int x); 
    void insertAfter(int x); 
    void replace(int x); 
    int removeFirst(); 
    int removeLast(); 
    int remove(); 
    int removeAndRetreat(); 
    int removeAndAdvance(); 
    void display(); 
}; 

#endif 

내 list.cpp :

#include <iostream> 
using namespace std; 

#include "List.h" 
int ncounter = 0; 
int rank = 0; 
/*ListNode (int x = 0, ListNode *n, ListNode *p) 
{ 
    data = x; 
    next = n; 
    prev = p; 
} 
*/ 

List::List() 
{ 
    //ListNode *head; 
    //ListNode *temp; 
    //ListNode *current; 
    head = NULL; 
    current = NULL; 
    temp = NULL; 


return; 
} 
int List::size() 
{ 
return ncounter; 
} 
int List::currentValue() 
{ 
int v; 
if(current == NULL) 
{ 
    return 0; 
} 
else 
{ 
    v = current -> data; 
    return v; 
} 

} 
int List::currentRank() 
{ 
    return rank; 
} 
void List::gotoFirst() 
{ 
current = head; 
rank = 0; 
} 
void List::gotoLast() 
{ 
current = head -> prev; 
rank = ncounter-1; 
} 
void List::retreat() 
{ 
    current = current -> prev; 
} 
void List::advance() 
{ 
    current = current -> next; 
} 
void List::gotoRank(int r) 
{ 
    current = head; 
    for (int i=0; i != r; i++) 
    { 
     current = current -> next; 
    } 
    rank = r; 
} 
bool List::isNull() 
{ 
if (current == NULL) 
    return true; 
else 
    return false; 
} 
bool List::isFirst() 
{ 
if (current == head) 
{ 
    return true; 
} 
else 
{ 
    return false; 
} 

} 
bool List::isLast() 
{ 
if (current == head -> prev) 
{ 

    return true; 
} 
else 
{ 
    return false; 
} 
} 
void List::insertFirst(int x) 
{ 
    if (head == NULL) 
    { 
     head = new ListNode; 
     head -> data = x; 
     head -> next = head; 
     head -> prev = head; 
     ncounter++; 
     rank = 0; 
    } 
    else 
    { 
     ListNode *temp = new ListNode; 
     temp -> data = x; 
     temp -> next = head; 
     temp -> prev = head -> prev; 
     head -> prev -> next= temp; 
     head -> prev = temp; 
     head = temp; 
     rank++; 
     ncounter++; 
    } 
} 
void List::insertLast(int x) 
{ 
    if (head == NULL) 
    { 
     head = new ListNode; 
     head -> data = x; 
     head -> next = head; 
     head -> prev = head; 
    } 
    else 
    { 
     ListNode *temp = new ListNode; 
     temp -> data = x; 
     temp -> next = head; 
     temp -> prev = head -> prev; 
     head -> prev -> next = temp; 
     head -> prev = temp; 
     ncounter++; 
    } 
} 
void List::insertBefore(int x) 
{ 
    ListNode *temp = new ListNode; 
    temp -> data = x; 
    temp -> next = current; 
    temp -> prev = current -> prev; 
    current -> prev -> next = temp; 
    current -> prev = temp; 
    rank++; 
    ncounter++; 
} 
void List::insertAfter(int x) 
{ 
    ListNode *temp = new ListNode; 
    temp -> data = x; 
    temp -> next = current -> next; 
    current -> next -> prev = temp; 
    current ->next = temp; 
    temp -> prev = current; 
    ncounter++; 
} 
void List::replace(int x) 
{ 
    current -> data = x; 
} 
int List::removeFirst() 
{ 
    int tempx; 
    if(current == head) 
    { 
     current = NULL; 
    } 
    if(head->next == head) 
     { tempx = head ->data; 
     head = NULL; 
     return tempx; 
    } 
    else 
    { 
     ListNode *temp = head; 
     tempx = temp -> data; 
     head = head ->next; 
     temp -> prev -> next = head; 
     head -> prev = temp -> prev; 
     delete temp; 
     ncounter--; 
     rank--; 
     return tempx; 
    } 
} 
int List::removeLast() 
{ 
    int tempx; 
    if (current == head -> prev) 
    { 
     current = NULL; 
    } 
    if(head->prev == head) 
     { tempx = head ->data; 
     head = NULL; 
     return tempx; 
    } 
    else 
    { 
     ListNode *temp = head -> prev; 
     tempx = temp -> data; 
     temp -> prev -> next = head; 
     head -> prev = temp -> prev; 
     delete temp; 
     ncounter--; 
     return tempx; 
    } 
} 
int List::remove() 
{ 
    int tempx; 
    if(head->next == head) 
     { 
     tempx = head -> data; 
     head = NULL; 
     return tempx; 
    } 
    else 
    { 
     ListNode *temp = current; 
     tempx = current -> data; 
     temp -> prev -> next = temp -> next; 
     temp -> next -> prev = temp -> prev; 
     current = NULL; 
     delete temp; 
     ncounter--; 
     rank=0; 
     return tempx; 
    } 
} 
int List::removeAndRetreat() 
{ 
    ListNode *temp; 
    int tempx; 
    temp = current; 
    current -> prev -> next = current -> next; 
    current -> next -> prev = current -> prev; 
    tempx = current -> data; 
    current = current -> prev; 
    delete temp; 
    ncounter--; 
    rank--; 
     return tempx; 
} 
int List::removeAndAdvance() 
{ 
    ListNode *temp; 
    int tempx; 
    temp = current; 
    current -> prev -> next = current -> next; 
    current -> next -> prev = current -> prev; 
    tempx = current -> data; 
    current = current -> next; 
    delete temp; 
    ncounter--; 

    return tempx; 
} 
void List::display() 
{ 
    if(head == NULL) 
     cout <<"[ ]" << endl; 
    else 
    { 
     ListNode *temp = head; 
     cout << "[ "; 
     for (int i = 0; i < ncounter; i++) 
     { 
      if (temp == current) 
      { 
       cout << "(" << current -> data << ") "; 
      } 
      else 
      { 
       cout << temp -> data << " "; 
       temp = temp -> next; 

      } 
     } 
     cout << " ]"; 

    } 
+0

'순환 링크'목록은 머리와 꼬리 노드가 동일한 노드 *를 의미해야합니다. * –

답변

1

insertLast 코드가 실제로 훨씬 더 간단 CDDL입니다. 첫 번째 노드 앞에 삽입하면 마지막 노드이기도합니다.

+0

그렇다면 insertFirst 코드 (올바른 경우)를 보면 insertLast와 동일하지 않습니까? 또는 나는 무엇인가 놓치고 있냐? @Sameer – NewbieUAcoder