2013-07-02 2 views
0

ниже - это мой код для отдельного списка в c. Кто-нибудь может мне с этим помочь?Одиночный список в c

это мой основной файл с:

#include <stdio.h> 
#include <stdlib.h> 
#include "myclib.c" 


struct mydata 
{ 
    int num; 
    char name; 
    struct mydata *next; 
}; 

int main() 
{ 
    struct mydata *head, *newnode, *temp; 

    head = (struct mydata*)malloc(sizeof(struct mydata)); 
    newnode = (struct mydata*)malloc(sizeof(struct mydata)); 
    temp = (struct mydata*)malloc(sizeof(struct mydata)); 

    head -> num = 123; 
    head -> name = 'k'; 
    head -> next = NULL; 

    newnode -> num = 456; 
    newnode -> name = 'd'; 
    newnode -> next = NULL; 

    printf("before.app.head = %p\n",head); 
    printf("before.app.newnode = %p\n",newnode); 
    printf("before.app.head->next = %p\n",head -> next);  
    printf("before.app.newnode->next = %p\n",newnode -> next); 

    head = (struct mydata*)addNodeAtHead(head, newnode, (newnode -> next)); 

    printf("after.app.head = %p\n",head); 
    printf("after.app.newnode = %p\n",newnode); 
    printf("after.app.head->next = %p\n",head -> next); 
    printf("after.app.node->next = %p\n",newnode -> next); 

    temp = head; 

    while(temp != NULL) 
    { 
     printf("num : %d\n",temp -> num); 
     printf("name : %c\n",temp -> name); 
     temp = temp -> next; 
    } 

    free(temp); 
    free(head); 

    return 0; 
} 

это myclib.c файл:

#include <stdio.h> 


    void * addNodeAtHead(void *head, void *node, void *nodenext) 
    { 
     printf("\nbefore.head = %p\n",head); 
     printf("before.node = %p\n",node); 
     printf("before.nodenext = %p\n",nodenext); 
     nodenext = head; 
     head = node; 
     printf("after.head = %p\n",head); 
     printf("after.node = %p\n",node); 
     printf("after.nodenext = %p\n\n",nodenext); 

     return head; 

    } 

я пытаюсь добавить newnode перед головой и чем изменение указателя головы до newnode.

+6

В чем проблема? это не так? вы получаете сообщение об ошибке? .. – zmo

+0

Вы также должны называть 'free (newnode)' в конце вашего 'main()'. Возможно, нет необходимости освобождать меморандум, потому что программа все равно выйдет немедленно. Но я настоятельно рекомендую тренироваться * всегда * освобождать выделенную память правильно. Таким образом, вы с меньшей вероятностью забудете об этом, если это может создать проблемы. – Treb

ответ

0

Необходимо указать указатель next на добавленном узле, чтобы указать на исходный головной узел. Я изменил подпись addNodeAtHead: вы не должны пропускать void *, когда вы просто передаете указатели типа mydata *. Я также изменить имена переменных, чтобы быть более ясным (ИМО) о своей цели

mydata * addNodeAtHead(mydata * original_head, mydata * new_node) 
{ 
    new_node -> next = original_head; 
    return new_node; // new_node is now the head of the list! 
} 
+0

Я хочу, чтобы этот метод был общим, поэтому я не могу использовать mydata * в качестве аргумента в функции defination. –

+1

Вы должны разработать свое решение в несколько этапов, не пытаясь сделать все это за один прыжок. Сначала попросите его работать с определенным типом. Как только вы достигли этого, посмотрите, как сделать его общим (что, я считаю, потребует от вас изменить определение mytype ...) – Treb

1

Когда вы передаете (newnode -> next) функции addNodeAtHead. Значение (newnode -> next) копируется в переменную node в функции. И вы обновляете переменную node с новым значением head. После выполнения функции node переменная будет уничтожена и не имеет отношения к (newnode -> next). И так (newnode -> next) остается без изменений.

до более чем прийти, просто изменить addNodeAtHead как ниже:

void * addNodeAtHead(void *head, void *node) 
{ 
    printf("\nbefore.head = %p\n",head); 
    printf("before.node = %p\n",node); 
    ((mydata *)node)-> next = (mydata *) head; 
    printf("after.head = %p\n",head); 
    printf("after.node = %p\n",node); 

    return node; 

} 

И называют это просто нравится:

head = (struct mydata*)addNodeAtHead(head, newnode); 

И теперь всё должно быть в порядке.

+0

извините, что я вставил неправильный код ... в newnode-> next на самом деле я прохожу (newnode-> next) и NOT * (newnode-> next) –

+0

его не работает ... я все еще получаю только один узел ... и я не могу использовать node-> next в этом методе, поскольку узел здесь недействителен. –

+0

Я отредактировал свой ответ, вы можете видеть его сейчас! –

1
#include <stdio.h> 
#include <stdlib.h> 
//#include "myclib.c" 

struct mydata 
{ 
    int num; 
    char name; 
    struct mydata *next; 
}; 

struct mydata* addNodeAtHead(struct mydata* head, struct mydata* node) 
{ 
#ifdef DEBUG 
    printf("\nbefore.head = %p\n",head); 
    printf("before.node = %p\n",node); 
// printf("before.nodenext = %p\n",nodenext); 
#endif 
    if(node){ 
     node->next = head; 
     head = node; 
    } 
#ifdef DEBUG 
    printf("after.head = %p\n",head); 
    printf("after.node = %p\n",node); 
// printf("after.nodenext = %p\n\n",nodenext); 
#endif 

    return head; 

} 

int main() 
{ 
    struct mydata *head, *newnode, *temp; 

    head = (struct mydata*)malloc(sizeof(struct mydata)); 
    newnode = (struct mydata*)malloc(sizeof(struct mydata)); 
    //temp = (struct mydata*)malloc(sizeof(struct mydata));//unused and rewrite to other pointer 

    head -> num = 123; 
    head -> name = 'k'; 
    head -> next = NULL; 

    newnode -> num = 456; 
    newnode -> name = 'd'; 
    newnode -> next = NULL; 

#ifdef DEBUG 
    printf("before.app.head = %p\n",head); 
    printf("before.app.newnode = %p\n",newnode); 
    printf("before.app.head->next = %p\n",head -> next);  
    printf("before.app.newnode->next = %p\n",newnode -> next); 
#endif 

    head = (struct mydata*)addNodeAtHead(head, newnode); 

#ifdef DEBUG 
    printf("after.app.head = %p\n",head); 
    printf("after.app.newnode = %p\n",newnode); 
    printf("after.app.head->next = %p\n",head -> next); 
    printf("after.app.node->next = %p\n",newnode -> next); 
#endif 

    temp = head; 

    while(temp != NULL) 
    { 
     printf("num : %d\n",temp -> num); 
     printf("name : %c\n",temp -> name); 
     temp = temp -> next; 
    } 
/* 
    free(temp);//NULL 
    free(newnode);//... 
    free(head);//already changed 
*/ 
    temp=head; 
    while(temp != NULL){ 
     struct mydata *prev = temp; 
     temp=temp->next; 
     free(prev); 
    } 
    return 0; 
}