2013-10-10 3 views
1
#include "seq.h" 
    #include <stdio.h> 
    #include <stdlib.h> 

    typedef struct stack_node { 
     ETYPE data; 
     struct stack_node *prev, *next; 
    }NODE; 

    struct seq_struct { 
     // "Container" struct 
     NODE* top, *bottom; 
     int size; 
    }; 

/** 
* DESCRIPTION: adds a new element to the "back" of 
* the seq 
* 
* [2 4] 
*  add_back 7 
*   [2 4 7] 
* 
* 
*/ 
void seq_add_back(Seq seq, ETYPE val){ 
NODE* endq = malloc(sizeof(NODE)); 
    endq->next =NULL; 

    endq->prev = seq->bottom; 
    endq->data = val; 

    seq->bottom->next=endq; 
    seq->bottom = endq; 

    seq->size++; 
    return; 
} 

Мне нужна ваша помощь в понимании того, что не так с моим кодом. Он не добавляет новый элемент в последовательность в конце, как и следовало бы.добавление элемента в конец последовательности в C struct

У меня есть другая часть кода, для удаления и добавления элементов в переднюю часть последовательности, и она отлично работает, а также отметить, что функция печати тоже прекрасна. все инициализируется до NULL и нулевое значение в начале программы.

+1

Это правильный код, ' Seq' typedef структуры 'seq_struct'? –

+0

Добавьте другую часть кода, возможно, какая-то другая часть кода искажает список последовательностей, который вы вызываете перед вызовом 'seq_add_back()' function –

+0

Q: Является ли seq указателем на вашу запись «Последовательность»? Вы не передаете копию (копия, которая никогда не обновляется), не так ли? В: Что происходит с записью * first *? Определенно выполните шаг seq_add_back() под отладчиком: возможно, проблема * ACTUAL *, которую вы испытываете, находится в другом месте. ИМХО ... PS: Вам не нужно «возвращение» в функции void. – paulsm4

ответ

0

первый: bottom указатель в seq_struct должна быть инициирована в NULL

второй: перед вызовом

seq->bottom->next=endq; 
seq->bottom = endq; 

вы должны проверить, если seq->bottom не NULL. так что ваш код должен выглядит следующим образом

if (seq->bottom != NULL) 
    seq->bottom->next=endq; 
seq->bottom = endq; 

Вы должны принять во внимание первый элемент вставить в связанный список с функцией seq_add_back().

Таким образом, вы должны обновить свой seq->bottom, также если это первый элемент, который нужно вставить в связанный список.

Необходимо ввести seq->bottom в значение NULL.

и вы должны добавить следующий код в конце вашей функции seq_add_back():

if (seq->top == NULL) 
    seq->top = endq; 

Итак, как резюме ваша функция должна выглядеть следующим образом:.

void seq_add_back(Seq seq, ETYPE val){ 
    NODE* endq = malloc(sizeof(NODE)); 
    endq->next =NULL; 

    endq->prev = seq->bottom; 
    endq->data = val; 

    if (seq->bottom != NULL) 
     seq->bottom->next=endq; 
    seq->bottom = endq; 

    if (seq->top == NULL) 
     seq->top = endq; 

    seq->size++; 
    return; 
}