Вставка связанного списка с использованием рекурсии - PullRequest
0 голосов
/ 25 марта 2011
//list.h file
typedef struct _lnode{
    struct _lnode *next;
    unsigned short row;
    unsigned short column;
    short data;
}lnode;

typedef struct _llist{
    struct _lnode *head;
    unsigned int size;

}llist;

//list.c file
void add(llist *list, lnode *newNode){
    list->size++;
    addRecursion(&list->head, newNode);
}

lnode* addRecursion(lnode **node, lnode *newNode){
     if(*node == NULL){
         *node = newNode;
     }
     else{
          lnode *nextNode = *node->next;
          *node->next = addRecursion(&nextNode, newNode);
     }
     return node;
}

//main function
llist list;
list.head = NULL;

lnode* new_node;
new_node = make_node(1,1,2);
add(&list, new_node);
printList(list.head);

Я думаю, что у меня проблема в функции addRecursion, особенно в выражении "else". Я запутался, так как начал использовать двойные указатели ... Как я могу это исправить?

Ответы [ 3 ]

1 голос
/ 25 марта 2011

Сначала замените *node->next на (*node)->next, поскольку -> имеет более высокий приоритет, чем *.

Также в addRecursion замените return node на return *node, поскольку node - двойной указатель, а вы возвращаете обычный.

0 голосов
/ 25 марта 2011

Ваш nextNode является локальным, поэтому & указывает на него адрес локальной переменной в стеке. Вместо этого вам нужно передать &node->next, и тогда возвращаемое значение не имеет значения (как при первом вызове в add, где вы отбрасываете возвращаемое значение).

0 голосов
/ 25 марта 2011

вызов адрекурсии ?? в остальном. кажется, называет себя бесконечно;

сначала вы устанавливаете newNode-> рядом с указателем на голову (узел). и вам нужно изменить голову так, чтобы она указывала на новый узел.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...