2012-01-24 7 views
1

Я пытаюсь поменять два указателя одного связанного списка, используя сортировку пузырьков. Я сделал функцию сравнения, и ее работа хорошая. В функции свопинга своп работает хорошо, мне удалось поменять местами между узлом и node->next, хотя связанный список «потерял» информацию об узле (после обмена), поэтому первый узел в связанном Список: node->next. Я использую общую функцию, которая сортирует пузырь и вызывает функцию сравнения и функцию подкачки.bubble сортировать связанный список, swapping указатели. C

Любая идея, почему это происходит?

void swap_arr(void **arr,int i , int j) 
{ 

    Team *teamList = (Team*) arr ;  
    Team *teamI = (Team*) arr , *teamJ ; 
    Team *temp ; 
    Team *temp1; 
    int z; 


    // Receives instead i 
    for(z=0; z<i; z++) 
    teamI = teamI->next; 

    //teamJ is the i+1  
    teamJ = teamI->next; 

    temp = teamI; 
    temp1 = teamJ->next; 


    teamI = teamJ ; 

    teamJ = temp; 

    if (temp1->next->next==NULL) 
    teamJ->next = NULL; 
    else 
    teamJ->next = temp1->next; 

    teamI->next = teamJ; 

    if (temp1==NULL) 
    teamJ->next=NULL; 
    else 
    teamJ->next = temp1; 
} 
+0

Эта проблема может быть решена с помощью отладчика. –

+0

Что такое параметр 'j'? – wildplasser

+0

j = i + 1, «место» второго узла мне нужно поменять местами. havnt действительно нашел для него использование в коде, но мне пришлось сохранить его здесь из-за инструкций h.w – Buzi

ответ

3

Для замены двух узлов (a, b) вам необходим доступ к «внешнему» узлу (o), который указывает на первый. (А также узел р после а и Ь (р может быть NULL, тоже, но это не важно)

Старая ситуация:.

o->next == a 
a->next == b 
b->next == p 

Новая ситуация:

o->next == b 
b->next == a 
a->next == p 

Этот обмен может быть выполнен только , если o фактически - это узел. (И таким образом: имеет o-> следующий указатель), поэтому вам понадобится специальный код для обработки случая, когда a является главой цепочки .

Но нет: o-> next - это только «struct llist *», поэтому можно использовать любой указатель на список. В большинстве случаев самым простым решением является использование аргумента указателя на указатель для функции подкачки; указатель на указатель может либо указывать на головку цепочки, либо на некоторый указатель узла -> следующий указатель.

+0

Домашнее задание: следует ли добавить спойлер? – wildplasser

0

Я также пытался реализовать сортировку связанного списка, используя сортировку пузырьков, хотя модификация, которую вы можете сделать в коде, скорее, чем запись функции свопинга, которую вы могли бы просто поменять в своем коде, и каждый раз, когда вам понадобится имеют 3 разных указателя, указывающих на соседние узлы. Вы можете найти реализованный код here.

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