2016-02-19 4 views
0

Я пытаюсь сделать функцию вставки, но я не знаю, разрешено ли мне использовать строку символов и узел в аргументе.Вставить функцию с помощью strcmp()

Это работает? Почему нет?

void insert(char* str, node* head) { 
     if (head == NULL) { 
     node* new_node = malloc(sizeof(struct node)); 
     assert(new_node != NULL); 
     new_node->value = strdup(str); 
    } 
    while (head != NULL) { 
     if (strcmp(str, head->value)) { 
     node *new_node = malloc(sizeof(struc node)); 
     assert(new_node != NULL); 
     new_node->link = head; 
     new_node->value - strdup(str); 
     } 
    } 
    node *prev = head; 
    head = head->link; 
+2

«Это работает?» Проверьте это, и вы узнаете. Не так просто увидеть, работает ли это, просто глядя на код - если вы не настоящий эксперт. – Ian

+1

Это еще не весь код. Вы единственный, у кого достаточно кода, чтобы узнать, работает ли он или нет. – e0k

+0

Обратите внимание, что 'head = head-> link;' изменяет значение 'head' в области действия функции, но не за ее пределами. Функции работают над копиями аргументов. Чтобы решить эту проблему, передайте 'head' указателем, даже если он уже является указателем. Попробуйте 'void insert (char * str, node ** head)' и 'if (* head == NULL) ...' – francis

ответ

1

У вас есть возможность вернуть новую голову списка по возвращаемому значению. Если вы вставляете один узел, вам нужно выделить память для одного узла. Не забывайте инициализации члена prev первого узла и элемента link последнего узла с NULL:

node* insert(char* str, node* head) 
{ 
    node* new_node = malloc(sizeof(struct node)); 
    assert(new_node != NULL); 
    new_node->value = strdup(str); 
    new_node->link = NULL;   // successor of new node is NULL 

    if (head == NULL) 
    { 
     new_node->pev = NULL;  // prdecessor of first node is NULL 
     head = new_node; 
     return new_node;   // head was NULL, return new head 
    } 

    node *lastNode = head;   // go to last node of list 
    while (head->link != NULL) 
     lastNode = lastNode->link; // step one forward 

    lastNode->link = new_node;  // successor of last node is new node 
    new_node->prev = lastNode;  // predecesor of new node is last node 
    return head; 
} 

-

node *head = NULL; 
head = insert("abc", head); 
head = insert("def", head); 

Другим решением было бы использовать для входных и выходных параметра Я для параметра Я head в функции insert:

void insert(char* str, node** head) 
         // ^^ in and output parameter 
{ 
    node* new_node = malloc(sizeof(struct node)); 
    assert(new_node != NULL); 
    new_node->value = strdup(str); 
    new_node->link = NULL;   // successor of new node is NULL 

    node* prev = NULL; 
    node* act = *head; 
    while (act != NULL)   // go to last node in list 
    { 
     prev = act; 
     act = act->link;   // step one forward 
    } 

    new_node->prev = prev;  // predecessor of new node is last node or NULL 
    if (prev == NULL) 
     *head = new_node;  // new node is the first node in list, 
          // write the new node back to head 
    else 
     prev->link = new_node; // successor of last node is new node 
} 

-

node *head = NULL; 
insert("abc", &head); 
insert("def", &head);