2012-06-08 2 views
0

Для назначения мне нужно добавить один связанный список объектов в конец другого. У меня есть это:Как вставить один связанный список за другим?

WORD you("you");//where you's linked list now contains y o u 
WORD are("are");//where are's linked list now contains a r e 

, и я хочу сделать это:

you.Insert(are,543);//(anything greater they the current objects length is 
        //attached to the back. So that 543 can be anything > you's length 

так вот, вы это связано связный список должен содержать:

y o u a r e 

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

void WORD::Insert(WORD & w, int pos) 
{ 
if(!w.IsEmpty()) 
{ 
    alpha_numeric *r = w.Cpy(); 
    alpha_numeric *loc; 

    (*this).Traverse(loc,pos);//pasing Traverse a pointer to a node and the  position in the list 

    //if(loc == 0) 
    //{ 
    // alpha_numeric *k = r;//k is pointing to the begin. of the copied words list 
    // while(k -> next != 0) 
    // { 
    //  k = k -> next;//k goes to the back 
    // } 
    // k -> next = front;//k(the back) is now the front of *this 
    // front = r;//front now points to r, the copy 
    //} 
    else if(loc == back) 
    { 

     back -> next = r; //<<<-------DEBUGGER SAYS ERROR HERE? 
     length += w.Length(); 
     while(back -> next!= 0) 
     { 
      back = back -> next; 
     } 
    } 
    /*else 
    { 
     alpha_numeric *l = r; 

     while(l -> next != 0) 
     { 
      l = l -> next; 
     } 
     l -> next = loc -> next; 
     loc -> next = r; 
    } 
    length += w.Length(); 
}*/ 
} 

Кроме того, здесь есть функция Traverse я, если это помогает

void WORD::Traverse(alpha_numeric * & p, const int & pos) 
{ 
if(pos <= 1) 
{ 
    p = 0; 
} 
else if(pos > (*this).Length()) 
{ 
    p = back; 
} 
else 
{ 
    p = front; 
    for(int i = 1; i < pos - 1; i++) 
    { 
     p = p -> next; 
    } 
} 

} 

I ОБЪЯВЛЕН НАЗАД КАК POINTER В приватной секции КЛАССА. * Назад

Это, как я положил его в конструктор

WORD::WORD() 
{ 
alpha_numeric *p; 

front = new alpha_numeric; 
front = 0; 
length = 0; 
back = front; 

for(p = front; p != 0; p = p -> next) 
{ 
    back = back -> next; 
} 
} 
+1

Мы не видели весь ваш код, но очевидный вывод состоит в том, что 'back' не указывает на действительный объект' alpha_numeric'; вместо этого это 0 или мусор. –

+0

Я не замечаю, что 'back' находится в сфере видимости. Это не глобальная переменная, не так ли? (Вероятно, этого не должно быть.) – thb

+0

@ ErnestFriedman-Hill больной пост больше, я объявил его как указатель в частном разделе класса. плохой пост, как я положил его в конструкторе – Mike

ответ

0

* назад не указывает на правильный узел в функции Траверс. Он должен выглядеть следующим образом:

else if(pos > (*this).Length()) 
{ 
    alpha_numeric *k = (*this).front; 
    while(k -> next != 0) 
    { 
     k = k -> next; 
    } 
    back = k; 
    p = back; 
} 
0

Я сильно подозреваю, ваша проблема связана с обновлением не back в if(loc==0) блоке, когда список пуст.

В этом случае back оставлен == 0 и не будет работать с добавлением.

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