2015-10-11 2 views
0

Я пытаюсь написать код, который добавляет номера элемента связанного списка. Но после добавления я теряю некоторые элементы. Я не могу найти ошибки. Вот мой код:C Связанный список, теряющие элементы

void push(struct node** head_ref, int new_data){ 
    struct node* new_node = (struct node*)malloc(sizeof(struct node*)); 
    new_node->data = new_data; 
    new_node->next = (*head_ref); 
    (*head_ref) = new_node; 
} 
void reverse(struct node** head_ref){ 
    struct node* prev = NULL; 
    struct node* current = *head_ref; 
    struct node* next; 
    while (current != NULL){ 
     next = current->next; 
     current->next = prev; 
     prev = current; 
     current = next; 
    } 
    *head_ref = prev; 
} 
struct node *shiftter(struct node *a, int index){ 
    struct node *temp = a; 
    while(index > 0){ 
     append(&temp, 0); 
     --index; 
    } 
    return temp; 
} 
struct node *add(struct node *fist, struct node *second){ 
    struct node *gudu = second; 
    struct node *c = fist; 
    struct node *hudu = NULL; 
    reverse(&gudu); 
    reverse(&c); 
    while(c != NULL){ 
     push(&hudu, c->data + gudu->data); 
     c = c->next; 
     gudu = gudu->next; 
    } 
    while(gudu != NULL){ 
     push(&hudu, gudu->data); 
     gudu = gudu->next; 
    } 
    return hudu; 
} 
int main(int argc, const char * argv[]) { 
    struct node *a = NULL; 
    struct node *b = NULL; 
    push(&a , 1); 
    push(&a , 2); 
    push(&a , 3); 
    push(&a , 4); 
    push(&b , 5); 
    push(&b , 1); 
    push(&b , 2); 
    push(&b , 4); 
    printList(a); 
    printf("\n"); 
    printList(b); 
    printf("\n"); 
    b = shiftter(b,1); 
    printList(b); 
    printf("\n"); 
    printList(add(a, b)); 
    printf("\n"); 
    printList(a); 
    printf("\n"); 
    printList(b); 
    return 0; 
} 

Мой вывод:

4 3 2 1 

4 2 1 5 

4 2 1 5 0 

4 6 4 7 1 

4 

4 

Моя программа закончилась с кодом выхода: 0

+0

Что должна делать функция 'shifter()'? –

ответ

0

Для начала, ваша функция с именем reverse ничего отдаленно близко, чтобы не делать reverse Со списком. Он помещает последний элемент (prev) во главе списка, но это как можно ближе к нему. Остальная часть логики в лучшем случае облачна. Не следует изменять член последнего элемента ->next, чтобы указать на второй-последний элемент? Здесь я считаю, что источником ваших недостающих элементов является.

P.S. У нас еще нет полной программы, необходимой для окончательного ответа на этот вопрос. Пожалуйста, пингуйте меня, как только вы обновите вопрос с помощью полного/компилируемого теста.

+0

Это хороший комментарий. – chux

+0

Это тоже поместилось бы, около 114 символов осталось. –

+0

@chux Можете ли вы связать меня с мета-сообщением о том, почему это должен быть комментарий, а не ответ? Поскольку до сих пор [мои исследования] (http://meta.stackoverflow.com/questions/297066/meta-meta-stack-overflow-when-should-i-answer-or-comment) указывает, что это кандидат на ответ. – Sebivor

2

Даже если алгоритм в reverse был верным, проблема в функции add проста: вы меняете списки и перебираете результирующие списки параллельно. Но вы не держите новые головы, поэтому все узлы, кроме последнего, больше не упоминаются ничем.

Вы должны сохранить новые головы и отменить их назад, чтобы восстановить исходные списки после того, как вы закончите с вычислением.

Лучше даже: держите списки в порядке от низкого до высокого.

+1

Это, кажется, прекрасное продолжение моего ответа. Не стесняйтесь брать то, что я написал, и делайте то, что вам нужно, чтобы сформировать что-то более полное. Цитированный или нет, мне все равно ... Для большей пользы мы, как сообщество, придумываем один сплоченный ответ, который помогает OP учиться. Еще одна вещь: если появятся оставшиеся фрагменты кода, которые завершат этот вопрос, не стесняйтесь пинговать меня, чтобы я мог проанализировать это. – Sebivor

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