#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. Аааа, совершенно пропустил это, запутался в названии.