2013-02-15 7 views
1

내가 구조체 prevnext 포인터를 가지고 ListItem 및 T 형식의 값을 사용하여 이중 연결리스트를 만드는 중이를 연결정렬 된 삽입이 이중으로 목록

내가 바로 그 일을하고 있습니까?

주 코드를 실행하면 디스플레이에 1, 15 및 16 만 표시됩니다.

template <class T> 
void List<T>::insertSorted(T item) 
{ 
    ListItem<T> *node=new ListItem<T>(item); 
    if (head==NULL) 
    { 
     head=node; 
    }   
    else if (head!=NULL) 
    { 
     T c,d; 
     ListItem<T> *temp,*temp2; 
     temp=head; 
     c=temp->value; 
     int count=0; 
     while (temp->next!=NULL) 
     { 
       if (temp->prev!=NULL) 
       temp2=temp->prev; 

       if (c>item && item>temp2->value) 
       { 
        if (temp->prev!=NULL) 
        { 
         temp2->next=node; 
         node->prev=temp2; 
         node->next=temp; 
         temp->prev=node;  
         count++; 
        } 
        else if (temp->prev==NULL) 
        { 
         head=node; 
         head->next=temp; 
         count++; 
        }    
       } 
       temp=temp->next; 
       c=temp->value; 
     } 
     if (temp->value<item) //comparison with last temp 
     { 
      temp->next=node; 
      node->prev=temp; 
     } 
     else if (temp->value>item) 
     { 
       temp2=temp->prev; 
       temp2->next=node; 
       node->prev=temp2; 
       node->next=temp; 
       temp->prev=node; 
     } 
    }   
} 
int main() 
{ 
    List<int> Mylist; 
    for (int i=16;i>0;i--) 
    { 
     Mylist.insertSorted(i); //insertion should be in ascending order according 
            //to my fnction 
    } 
    Mylist.printList(); //prints the whole linked list 
    system("PAUSE"); 
    return 0; 
} 
+4

디버거는 친구이므로 한 줄씩 코드를 단계별로 실행하는 데 사용하십시오. –

+0

결과가 예상 한 것과 다를 경우 기대치가 틀리거나 올바르게 수행하지 못합니다. –

답변

2

아니, 당신이하고있는 일은 UB입니다.

else if (head!=NULL) 
{ 
     T c,d; 
     ListItem<T> *temp,*temp2; //temp2 points to nirvana 
     temp=head;    //temp is head 
     c=temp->value;    
     int count=0; 
     while (temp->next!=NULL) //head->next != NULL, so enter the loop 
     { 
      if (temp->prev!=NULL) //head->prev is NULL... 
       temp2=temp->prev; //.. so temp2 continues to point into nirvana  

      if (c>item && item>temp2->value) //take nirvana's value. OUCH! 

재구성 코드 : 당신을 의미 head != NULLhead->next != NULL을 감안할 때 목록에있는 두 개 이상의 항목이있다. 종이에 알고리즘을 배치하고, 목록에서 요소가 없거나, 목록에 하나의 요소가 있거나, 요소가 두 개 이상이거나, 항목이 작거나, 항목이 가장 크거나, 항목이 중간에있는 경우에해야 할 일을 살펴보십시오. 종이에 바로 써 놓았다면 코드에 적어 두십시오.

편집 : 힌트 : 목록이 이전에 정렬 된 것으로 가정합니다. 새 요소를 삽입하기 전에 어떤 요소에 목록 요소가 있어야합니까? 그리고 그것을 어떻게 찾을 수 있습니까?

+0

요소는 오름차순이어야합니다. 새 항목은 다음 항목보다 작아야합니다. – User14229754

+0

알고리즘은 다음과 같아야합니다. ** 1 ** : 첫 번째 큰 항목을 검색하고, ** 2 ** 전에 새 항목을 삽입하십시오. 특별한 경우 : 목록에 더 큰 항목이 없습니다. ** 2 **에는 다음과 같은 두 가지 경우도 있습니다. ** 2a ** 목록의 첫 번째 항목은 이미 새 항목보다 커졌습니다. ** 2b ** 첫 번째로 큰 항목은 나중에 목록에 있습니다. 합계 3 건입니다. 보유하고있는 케이스를 식별하고 이에 따라 삽입을 처리하십시오. –

+0

감사합니다. – User14229754