2015-03-13 3 views
1

У меня есть следующий алгоритм, который предназначен для изменения связанного списка.Связанные списки - глобальные v. Локальные переменные

typedef struct node 
{ 
    int data; 
    struct node* next; 
}LL_t; 

void insert(LL_t** head, int value) 
{ 
    LL_t* new_node = (LL_t*) malloc(sizeof(LL_t)); 
    new_node->data = value; 
    new_node->next = (*head); 
    (*head) = new_node; 
} 

LL_t* head; 
// Post: L contains the data in the original L, but in the reverse order. 
void reverse(LL_t * L) { 
    LL_t *current, *prev, *next; 
    current = head; 
    prev = NULL; 
    while (current != NULL) 
    { 
     next = current->next; 
     current->next = prev; 
     prev = current; 
     current = next; 
    } 
    head = prev; 
} 

int main() 
{ 
struct node* L = NULL; 
insert(&L, 42); 
insert(&L, 36); 
insert(&L, 14); 
insert(&L, 17); 
insert(&L, 48); 
insert(&L, 36); 

print(L); 
printf("\n"); 
reverse(L); 
print(L); 

return 0; 
} 

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

36 48 17 14 36 42 
36 48 17 14 36 42 

Как напрямую изменить связанный список с использованием глобальных переменных?

+0

Что такое 'print (L);'? –

+0

Просто функция, которая печатает связанный список. Я отказался от функций «print list» и «insert element», так как моя проблема связана с функцией «reverse». – ballin

+0

В этом случае мы не видим, как заполняется 'head'. :-) –

ответ

1

Проблема с вашим кодом заключается в том, что вы передаете указатель по значению функции reverse, а указатель l по-прежнему указывает на первый элемент, а не на последний элемент, как вы думаете, после выхода из обратной функции, вам нужно передать указатель по ссылке и изменить главу списка, как показано ниже:

void reverse(LL_t **L) { 
    LL_t *current, *prev, *next; 
    current = *L; 
    prev = NULL; 
    while (current != NULL) 
    { 
     next = current->next; 
     current->next = prev; 
     prev = current; 
     current = next; 
    } 
    head = prev; 
    *L = head; 
} 

вызов должен быть

reverse(&L); 

Сделать это изменение и теперь называют

print(L) и увидите, что вы получаете обратный связанный список.


Если у вас есть фиксированная Protoype как то, что вы сказали в своем комментарии затем пойти на

void reverse(LL_t *L) { 
    LL_t *current, *prev, *next; 
    current = L; 
    prev = NULL; 
    while (current != NULL) 
    { 
     next = current->next; 
     current->next = prev; 
     prev = current; 
     current = next; 
    } 
    head = prev; 
} 

Вызов должен быть

reverse(L); 

Затем во время печати позвонить

print(head); 
+0

Кажется, что печатаются два одинаковых массива. Не делает ли объявление в первой строке main() или функции struct typedef функцией L в качестве указателя? – ballin

+0

Ваш код прекрасен. Мой профессор, хотя дал нам задачу заполнить функцию «void reverse (LL_t * L)» и называть ее «reverse (L)», которую мне трудно. – ballin

+0

@ballin Проверьте изменения – Gopi

0
head = L;//you don't assign to head. 
reverse(L);//unused L at reverse. 
print(head); 
Смежные вопросы