2015-10-31 4 views
0

В обратной функции я пытаюсь поменять местами первые 2 узла только в двусвязном списке без обмена данными. Он работает, но он не заменяет первые 2 узла в списке. Может ли кто-нибудь указать мне в правильном направлении относительно того, что я делаю неправильно?Переведите первые 2 узла только в дважды связанном списке

struct node { 
    int data; 
    node * p;    // FORWARD LINK 
    node * rp;    // REVERSE LINK 
}; 

ostream & operator<<(ostream &, const node *); 
void addFront(node * & start, int);    
void cleanUp(node *);       
void reverse(node * &);    

void main() 
{ 

    node * a = NULL; 
    cout << "EMPTY LIST CASE:\n"; 
    cout << "BEFORE a is\n" << a << endl; 
    reverse(a); 
    cout << "AFTER a is\n" << a << endl; 

    cleanUp(a); 
    a = NULL; 
    addFront(a, 10); 
    cout << "\nONE ELEMENT LIST CASE:\n"; 
    cout << "BEFORE a is\n" << a << endl; 
    reverse(a); 
    cout << "AFTER a is\n" << a << endl; 

    cleanUp(a); 
    a = NULL; 
    addFront(a, 30); 
    addFront(a, 20); 
    cout << "\nTWO ELEMENT LIST CASE:\n"; 
    cout << "BEFORE a is\n" << a << endl; 
    reverse(a); 
    cout << "AFTER a is\n" << a << endl; 

    cleanUp(a); 
    a = NULL; 
    addFront(a, 60); 
    addFront(a, 50); 
    addFront(a, 40); 
    cout << "\nTHREE ELEMENT LIST CASE:\n"; 
    cout << "BEFORE a is\n" << a << endl; 
    reverse(a); 
    cout << "AFTER a is\n" << a << endl; 

    cleanUp(a); 
    a = NULL; 
    addFront(a, 400); 
    addFront(a, 300); 
    addFront(a, 200); 
    addFront(a, 100); 
    cout << "\nFOUR ELEMENT LIST CASE:\n"; 
    cout << "BEFORE a is\n" << a << endl; 
    reverse(a); 
    cout << "AFTER a is\n" << a << endl; 

    cleanUp(a); 
} 


void reverse(node * & s) 
{ 
    node * n1 = s; 
    node * n2 = s; 

    if (n1 == NULL) return; 

    node * temp = new node; 

    temp->rp = n1->rp; 
    temp->p = n1->p; 

    n1->rp = n2->rp; 
    n1->p = n2->p; 

    n2->rp = temp->rp; 
    n2->p = temp->p; 

    if (n1->p != NULL) 
     n1->p->rp = n1; 
    if (n1->rp != NULL) 
     n1->rp->p = n1; 
    if (n2->p != NULL) 
     n2->p->rp = n2; 
    if (n2->rp != NULL) 
     n2->rp->p = n2; 

    delete temp; 
} 


void addFront(node * & start, int x) 
{ 
    node * t = new node; 
    t->data = x; 
    if (start != NULL) 
    { 
     t->p = start; 
     t->rp = NULL; 
     start->rp = t; 
    } 
    else 
    { 
     t->p = NULL; 
     t->rp = NULL; 
    } 
    start = t; 
} 

void cleanUp(node * s) 
{ 
    node * walker, *prev; 
    walker = s; 
    while (walker != NULL) 
    { 
     prev = walker; 
     walker = walker->p; 
     delete prev; 
    } 
}  

ostream & operator<<(ostream & w, const node * s) 
{ 
    const node * walker = s; 
    const node * trailer = walker; 
    w << "Forward Print " << endl; 
    if (s == NULL) 
    { 
     w << "EMPTY LIST"; 
    } 
    else 
    { 
     while (walker != NULL) 
     { 
      w << walker->data << ' '; 
      trailer = walker; 
      walker = walker->p; 
     } 
    } 

    w << endl << "Reverse Print " << endl; 
    if (trailer == NULL) 
    { 
     w << "EMPTY LIST"; 
     return w; 
    } 

    while (trailer != NULL) 
    { 
     w << trailer->data << ' '; 
     trailer = trailer->rp; 
    } 
    return w; 
} 

Обновлено с полной программой.

+0

node * n1 = s; узел * n2 = s; mmm, n1 и n2 одинаковы? – leoxs

+0

В разделе n2 = n1-> p (следующий узел), но когда я это делаю, он убивает программу. – Heather

+0

Ммм, может быть, инициализация неверна, вы должны опубликовать это сообщение – leoxs

ответ

0

Вот обновленный reverse:

void reverse(node * & s) 
{ 
    node * n1 = s; 

    if (n1 == NULL) return; 

    node * n2 = n1->p; 
    if (n2 == NULL) return; 

    node *temp; 
    node *n3; 

    n3 = n2->p; 

    temp = n1->rp; 

    n1->p = n3; 
    n1->rp = n2; 

    n2->rp = temp; 
    n2->p = n1; 

    if (n3 != NULL) 
     n3->rp = n1; 

    s = n2; 
} 

Примечание: даже если temp должен был остаться, как вы определили, что не было никакой необходимости выделять и удалять его. Я бы использовал node temp и заменил temp->blah на temp.blah

+0

Это имеет смысл! Огромное спасибо!! – Heather

+0

@Heather Добро пожаловать. Я собирался добавить список из 3 ошибок, которые у вас были [не считая temp thing] внизу, но я решил, что вы получите его только с кодовой записью. Если вы еще этого не сделали, я думаю, вам было бы полезно перечислить их сами, сравнив оригинал с моим. Я начал с минимальных изменений в вашем коде/логике. Тогда упрощение [важно, потому что это часто позволяет вам легче выявлять ошибки]. В какой-то момент я бросил секцию и перекодировал с нуля и добавил «недостающее звено» :-) –

Смежные вопросы