2013-12-03 2 views
0

Я работаю над домашним заданием, где я беру размер списка, а затем элементы. Затем я вставляю их в порядке возрастания. Этот код имеет метод push и append, используя ссылку на указатель на голову. Если я использую вход, который уже в порядке возрастания, его тонкий, но нажатие на фронт может быть проблемой, так это то, как я изменяю headRef? Любая помощь оценивается.заказанный связанный список вставки

#include <stdio.h> 
#include <stdlib.h> 

typedef struct node item; 
    struct node{ 
    int data; 
    struct node* next; 

}; 

void insertFront(item** headRef, int new_data) 
{ 

    item* new_node = (item*) malloc(sizeof(item)); 

    new_node->data = new_data; 

    new_node->next = (*headRef); 

    (*headRef) = new_node; 
} 

//using reference to pointer adds to end 
void insertEnd(item** headRef, int new_data) 
{ 

    item* new_node = (item*) malloc(sizeof(item)); 

    //pointer head for iterating through list 
    item* last = *headRef; 

    new_node->data = new_data; 

    new_node->next = NULL; 

    if (*headRef == NULL) 
    { 
    *headRef = new_node; 
    return; 
    } 

    while (last->next != NULL) 
    last = last->next; 

    last->next = new_node; 
    return; 
} 

//utility function to insert data sorted 
void insert_sorted_linked_list(item* head, int val){ 
if(val > head->data){ 
    insertEnd(&head, val); 
} 
else{ 
    insertFront(&head, val); 
} 

} 

void printList(item *node) 
{ 
    while (node != NULL) 
    { 
    printf("%d ", node->data); 
    node = node->next; 
    } 
    printf("\n"); 
} 

int main(){ 

    printf("Enter in size of the list followed by as many elements: "); 
    int size; 
    scanf("%d", &size); 
    int elements[size]; 
    int i = 0; 
    for(i=0; i<size; i++){ 
    scanf("%d", &elements[i]); 
} 
item *head = NULL; 
//makes sure the list is not null 
insertEnd(&head, elements[0]); 
//iterates to populate list 
for(i = 1; i < size; i++){ 
    insert_sorted_linked_list(head, elements[i]); 
} 
printList(head); 
return 0; 

} 
+0

Какая ошибка? в чем проблема, с которой вы сталкиваетесь? – jester

+0

Извините, когда я использую образец ввода 3 321, он должен вставлять в список по порядку и выводить 1 2 3, но если я использую указанный вход, он выводит только 3. – ASH

+0

'insertEnd (& head, val);' 'head 'здесь является локальным параметром, поэтому хранится в стеке, т. е. будет обладать функцией, поэтому адрес' head' ('& head') недопустим внутри функции' insertEnd'. То, что вы получаете, - это неопределенное поведение. –

ответ

0

Изменить insert_sorted_linked_list() функцию:

void insert_sorted_linked_list(item** head, int val){ 
if(val > (*head)->data){ 
    insertEnd(head, val); 
} 
else{ 
    insertFront(head, val); 
} 

} 

и вызывать его из главной, как:

insert_sorted_linked_list(&head, elements[i]); 

Изменения, внесенные в голову в призывах к insertFront и insertEnd от этой функции не получая отражение в основном из-за вызова по значению. Следовательно, в main() голова остается на 3, вставлен первый узел. Вот почему выход неправильный.

+0

Благодарим за код и объяснение, что оно исправило мою проблему! – ASH

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