2015-11-19 4 views
0

У меня проблемы с моим методом вставки, так как по какой-то причине я заканчиваю бесконечным циклом. Вот моя структура:C вставить элемент в восходящий связанный список

struct List { 
    char element; 
    struct List *next; 
}; 

А вот мой метод вставки:

void insert(struct List *first, char el){ 
    struct List *new=NULL; 
    struct List *current = first; 
    new = (struct List*) malloc (sizeof(struct List)); 
    new->element = el; 
    new->next = NULL; 
    if (first == NULL){ 
     first = new;  
     return; 
    } 
    while (1){ //this loop never ends 
     if (current->next == NULL) break; 
     if (current->next->element < el){ 
      current = current->next;   
     }else{ 
      break; 
     } 
    } 
    struct List *ex_next = current->next; 
    current->next = new; 
    new->next = ex_next; 
} 

Я знаю подобный вопрос здесь: C - Inserting into linked list in ascending order, но это не помогло мне.

+1

Ну, единственный способ, что цикл будет повторяться вечно, если у вас есть (например, 'node == node-> next'). –

ответ

3

Первый аргумент insert - указатель. Но вам нужен указатель на указатель (struct List **first).

Если список пуст, вы передаете VALUE NULL в функции (переменная first внутри метода имеют значение NULL). Затем вы назначаете ему новое значение malloced и возвращаете. Переменная на вызывающей стороне не изменилась, и ваша память просочилась.

Когда вы передаете указатель указателя, переменная first хранит адрес переменной вызывающего метода. Таким образом, вы можете переназначить его ценность.

указатели, указатели указателей, указателей указателей массивов функций, возвращающих указатели на функции .... Вот забавная часть С);

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