2010-04-13 3 views
1

Это заставляло меня целыми неделями. Это действительно просто, я это знаю. Каждый раз, когда я печатаю отдельно связанный список, он печатает адрес в конце списка.Проблема со связанными списками Maddening

#include <iostream> 
using namespace std; 

struct node 
{ 
    int info; 
    node *link; 
}; 

node *before(node *head); 
node *after(node *head); 
void middle(node *head, node *ptr); 
void reversep(node *head, node *ptr); 

node *head, *ptr, *newnode; 

int main() 
{ 
head = NULL; 
ptr = NULL; 
newnode = new node; 
head = newnode; 

for(int c1=1;c1<11;c1++) 
{ 
    newnode->info = c1; 
    ptr = newnode; 
    newnode = new node; 
    ptr->link = newnode; 
    ptr = ptr->link; 
} 

ptr->link=NULL; 

head = before(head); 
head = after(head); 
middle(head, ptr); 
//reversep(head, ptr); 

ptr = head; 
cout<<ptr->info<<endl; 
while(ptr->link!=NULL) 
{ 
ptr=ptr->link; 
    cout<<ptr->info<<endl; 
} 

system("Pause"); 
return 0; 
} 

node *before(node *head) 
{ 
    node *befnode; 
    befnode = new node; 

    cout<<"What should go before the list?"<<endl; 
    cin>>befnode->info; 

    befnode->link = head; 
    head = befnode; 

    return head; 
} 

node *after(node *head) 
{ 
    node *afnode, *ptr2; 
    afnode = new node; 

    ptr2 = head; 

    cout<<"What should go after the list?"<<endl; 
    cin>>afnode->info; 

    ptr2 = afnode; 
    afnode->link=NULL; 

    ptr2 = head; 
    return ptr2; 
} 

void middle(node *head, node *ptr) 
{ 
    int c1 = 0, c2 = 0; 
    node *temp, *midnode; 

    ptr = head; 
    while(ptr->link->link!=NULL) 
    { 
    ptr=ptr->link; 
    c1++; 
    } 

    c1/=2; 
    c1-=1; 

    ptr = head; 

    while(c2<c1) 
    { 
    ptr=ptr->link; 
    c2++; 
    } 

    midnode = new node; 

    cout<<"What should go in the middle of the list?"<<endl; 
    cin>>midnode->info; 
    cout<<endl; 

    temp=ptr->link; 
    ptr->link=midnode; 
    midnode->link=temp; 
} 

void reversep(node *head, node *ptr) 
{ 
    node *last, *ptr2; 

    ptr=head; 
    ptr2=head; 

    while(ptr->link!=NULL) 
    ptr = ptr->link; 

    last = ptr; 

    cout<<last->info; 

    while(ptr!=head) 
    { 
    while(ptr2->link!=ptr) 
     ptr2=ptr2->link; 

    ptr = ptr2; 
    cout<<ptr->info; 
    } 
} 

Я признаю, что это класс работы, но даже профессор не может понять это, и говорит, что его, вероятно, что-то незначительное, что мы с видом, но я не могу поставить свой ум пока я не узнаю, что это.

+3

Вы говорите, что это список с двойной связью (т.е. узел имеет предыдущий и следующий указатель), но он похож на отдельный список (у вас есть указатель «link» (next?)). – AshleysBrain

+3

Не используйте глобальную переменную! – kennytm

+0

О, lol, неправильная программа. Неудивительно. Будет редактировать с правильным. Неверный второй раз. Это отдельный список. – Mike

ответ

4

Есть две проблемы:

  1. В вашем начальном цикле, который создает список, вы не установите info последнего узла. Это приводит к тому, что значение в случайном порядке отображается в конце. Это соответствующий код:

    for(int c1=1;c1<11;c1++) 
    { 
        newnode->info = c1; 
        ptr = newnode; 
        newnode = new node; 
        ptr->link = newnode; 
        ptr = ptr->link; 
    }  
    ptr->link=NULL; 
    

    Как вы можете видеть, последний узел будет создан не будет иметь свой info набор.

  2. В функции after вы фактически не подключаете новый узел. Вам нужно найти последний узел в списке и установить его link на новый узел.

+0

Это исправило это! Благодарю. – Mike

+3

, что проф не мог понять такой тривиальный (и общий среди новичков) баг говорит о качестве проф. Бьюсь об заклад, у него/нее практически нет опыта реального мира. Вы можете захотеть найти другой класс или даже другую школу. – rmeador

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