Нужна помощь для создания функции и удаления функции в списке ссылок в отношении моего кода? Новичок в программировании на языке Си

#c #struct #linked-list #singly-linked-list #function-definition

Вопрос:

 typedef struct LinkedListNode 

{

   void *data;

   struct LinkedListNode *next;

}LinkedListNode;

typedef struct 

{

   LinkedListNode *head;

}LinkedList;


LinkedList *createLinkedList()

{

  LinkedList *ll = (LinkedList *) malloc(sizeof(LinkedList))

  ll->head = NULL;

  return ll;

}

void insertFirst (LinkedList *list, void *data)

{

     Cannot create this function ? 
  
}

void removeFirst(LinkedList *list)

{

     Cannot create this function?

}
 

Ответ №1:

Я помогу тебе с твоей insertFirst функцией.

 void insertFirst(LinkedList *list, void *data)
{
    LinkedListNode *node = NULL;

    node = malloc(sizeof *node); /* allocate a new node */

    if (node == NULL)
    {
        /* handle oom */
    }

    node->data = data; /* save the data */
    node->next = list->head; /* point the next node to head */
    
    list->head = node; /* set head to the node we just created */

    return;
}
 

Комментарии:

1. как насчет убрать первого мистера Алекса ?

2. @lupin removeFirst должно быть довольно легко реализовать, просто удерживайте узел tmp для первого элемента, укажите head->list на head->list->next него и освободите узел tmp…

3. можете ли вы отредактировать это в коде, чтобы я мог полностью осознать, что вы пытаетесь сказать? Г-н Алекс

Ответ №2:

Обе функции insertFirst и removeFirst должны иметь тип возвращаемого int значения, чтобы сообщать пользователю о функциях , были ли их действия успешными.

Например

 int insertFirst ( LinkedList *list, void *data )
{
    LinkedListNode *node = malloc( sizeof( LinkedListNode ) );
    int success = node != NULL;

    if ( success )
    {
        node->data = data;
        node->next = list->head;
        list->head = node;
    }

    return success;
}


int removeFirst( LinkedList *list )
{
    int success = list->head != NULL;

    if ( success )
    {
        LinkedListNode *node = list->head;
        list->head = list->head->next;
        
        free( node->data );
        free( node );
    }

    return success;
}
 

Я предполагаю, что указатель data , используемый в функции insertFirst , указывает на динамически выделенный объект. В противном случае в функции removeFirst вам нужно удалить инструкцию

 free( node->data );
 

Комментарии:

1. if (success) , что если failure , ты все равно return success будешь .

2. @alex01011 Ты прав. успех может иметь либо логическое истинное значение (1 ), либо логическое ложное значение (0).

3. Аааа, совершенно пропустил это, запутался в названии.