2013-09-19 6 views
1

У меня возникли проблемы с вставкой элементов в связанный список. Все элементы заканчиваются тем же * содержимым данных, которое вставлено последним. Программа успешно компилируется. Я использую gcc и gdb. Я новичок в кодировании, поэтому, пожалуйста, укажите проблемы, если таковые имеются в моем стиле программирования.Связанный список проблем с вставкой

typedef struct Node{ 
    void* data; 
    struct Node* next; 
} *node; 

node allocate(){ 
    node current = malloc(sizeof(struct Node)); 
    current->data = NULL; 
    current->next = NULL; 
    return current; 
} 


void insert(node *head, void *data){ 
    // if head has no data then set the data on head and return 
    if(((*head)->data == NULL)&&((*head)->next == NULL)){ 
     (*head)->data = data; 
     return; 
    } 

    node newHead = allocate(); 
    newHead->data = data; 
    newHead->next = *head; 
    *head = newHead; 
    //printf("Node Data : %d\tNext Node Data : %d", 
     //*(int *)((*head)->data), *(int *)((*head)->data)); 
} 

int main(int argc, char *argv[]){ 
    node head = allocate(); 
    int count = inputSequence(&head); 
    int *aod = calloc((size_t) count, sizeof(int)); 
    generateAOD(head, aod); 
    if(checkJolly(aod, count) == TRUE) 
     printf("Jolly\n"); 
    else 
     printf("Not Jolly\n"); 

    return 0; 
} 

int inputSequence(node *input){ 
    int *num = malloc(sizeof(int)); 
    int count = 0; 

    while((scanf("%d", num) != EOF)){ 
     insert(input, (void *)num); 
     count++; 
    } 
    traverse(*input, fn); 
    return count; 
} 
+0

У вас есть код 'main' функции? – lc2817

+0

есть. Я поместил основную функцию и модуль linklist на самом деле в разных файлах –

+0

@ lc2817 .. Могу ли я загружать файлы в stackoverflow или, может быть, могу отправить их по электронной почте? –

ответ

2

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

Сам указатель должен указать, пуст ли список. Если он равен NULL, то он пуст. Если нет, то есть данные. Соответствует логике вставки.

И ваш inputSequence полностью сломан. Он выделяет только одну точку данных, затем использует то же распределение данных для каждые вставки. Вам нужен один для каждый ввод.

Во-первых, смените allocate(), чтобы принять введенные данные. Это сделает оставшийся код менее загроможденным:

node allocate(void *data) 
{ 
    node current = malloc(sizeof(*current)); 
    current->data = data; 
    current->next = NULL; 
    return current; 
} 

Во-вторых, вставьте, выделив при необходимости новый узел.

void insert(node *head, void *data) 
{ 
    node p = allocate(data); 
    p->next = *head; 
    *head = p; 
} 

Далее исправить inputSequence() правильно распределить память для каждой записи:

int inputSequence(node *input) 
{ 
    int count = 0; 
    int num = 0; 

    // note: check for number of params *successfully* parsed. 
    // if it isn't 1, its time to leave the loop. 
    while(scanf("%d", &num) == 1) 
    { 
     int *data = malloc(sizeof(num)); 
     *data = num; 
     insert(input, data); 
     ++count; 
    } 
    return count; 
} 

И, наконец, убедитесь, что ваш головной указатель изначально NULL в main().

int main(int argc, char *argv[]) 
{ 
    node head = NULL; 

    // load linked list 
    inputSequence(&head); 

    // ... the rest of your code....; 

    return 0; 
} 

С выше, логическим ответ «Является ли мой список пуст» просто if (!head) Кроме того, это делает такие вещи, как обход тривиального.

void traverse(node ptr, void (*pfn)(void *)) 
{ 
    while (ptr) 
    { 
     pfn(ptr->data); 
     ptr = ptr->next; 
    } 
} 

Избавление списка одинаково тривиален:

void destroy(node *head) 
{ 
    while (*head) 
    { 
     node p = *head; 
     *head = p->next; 
     free(p->data); 
     free(p); 
    } 
} 
+0

Спасибо, я ясно вижу свою проблему. –

+0

@ пользователь2794538 проблем нет. Я просто надеюсь, что это имеет смысл. – WhozCraig

1
typedef struct Node{ 
     void* data; // Make it as int or any other data type 
     struct Node* next; 
    } *node; 

В функции inputSequence() вы выделения памяти для NUM в самом начале и делая node-> данные указывают на эту память каждый раз при добавлении узла. Следовательно, указатель данных каждого узла вашего связанного списка указывает на одно и то же место памяти и, следовательно, содержит одно и то же значение.

Если вы все еще хотите продолжить данные как указатель на void, выделите num для каждой итерации цикла while и передайте это для вставки функции.

while((scanf("%d", num) != EOF)){ 
     num = malloc(sizeof(int); 
     insert(input, (void *)num); 
     count++; 
    } 
Смежные вопросы