2016-09-01 2 views
0

Я пытаюсь сделать функцию, которая копирует узел. Я пытаюсь получить программу с ошибкой или NULL return NULL, у меня может быть только один оператор возвратаВыполнение функции cpnode?

У меня есть следующий код, и я не уверен, что еще делать дальше .. Любые советы/советы Я бы очень хотел оценить

Node *cpnode(Node *curNode) 
{ 
     if (curNode == NULL) return NULL; 
     Node *result = malloc(sizeof *result); 
     result -> value = curNode -> value; 
     result -> next = cpnode(curNode -> next; 

return(result); 
} 

EDIT:

Я редактировал свой код при попытке компиляции я получаю ошибки, такие как узел не имеет элемента с именем «значение» и «рядом». Почему это?

Также я знаю, что могу легко вернуть NULL в оператор if, а в конце вернуться с моим результатом, но как я могу просто иметь только один оператор return с NULL при ошибке?

Чтобы определить мой узел буду я должен сделать что-то вроде этого:

Node *cpnode(Node *curNode) 
{ 
    struct Node{ 
       *result; 
       *value; 
       *next; 
    } 
    if (curNode == NULL) return NULL; 
    Node *result = malloc(sizeof *result); 
    result -> value = curNode -> value; 
    result -> next = cpnode(curNode -> next; 

    return(result); 
} 
+2

'new' - вещь C++, используйте' Node * result = malloc (sizeof * result); ' –

+0

@ sss34 Я не понял, что означает« функция, которая копирует узел при включении в другую программу ». –

+0

'cpnode (curnode -> next'; ->' cpnode (curnode -> next); ' – LPs

ответ

1

Есть несколько проблем с вашим кодом: ваша структура узла не определена и вы используете его в качестве типа, вы не typedef; ваш текст говорит о копировании узла, но ваш код копирует связанный список узлов; result не похоже, что он должен быть частью структуры узла; ваш код не является синтаксически правильным (например, отсутствующий парен).

Это переделка вашего кода во что-то, что компилируется и запускается. Так как вы не указали тип для value, я предполагаю, что это строка ниже, но вы можете изменить это все, что вы хотите:

#include <stdlib.h> 
#include <stdio.h> 

typedef struct Node 
{ 
    char *value; 
    struct Node *next; 
} Node; 

Node *copyNodes(Node *currentNode) 
{ 
    Node *result = NULL; 

    if (currentNode != NULL) 
    { 
     if ((result = malloc(sizeof *result)) != NULL) 
     { 
      result->value = currentNode->value; 
      result->next = copyNodes(currentNode->next); 
     } 
    } 

    return result; 
} 

void freeNodes(Node *currentNode) 
{ 
    if (currentNode != NULL) 
    { 
     if (currentNode->next != NULL) 
     { 
      freeNodes(currentNode->next); 
      currentNode->next = NULL; 
     } 
    } 
    free(currentNode); 
} 

int main() 
{ 
    Node a, b; 

    b.value = "last"; 
    b.next = NULL; 

    a.value = "first"; 
    a.next = &b; 

    Node *c = copyNodes(&a); 

    printf("%s\n", c->next->value); 

    freeNodes(c); 

    return 0; 
} 

Если мы делаем копию всех узлов с помощью malloc(), то при мы должны освободить все копии так же, как они были созданы. Вот что делает функция freeNodes().

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