#include <stdio.h>
#include <stdlib.h>
/**
* struct listint_s - Doubly linked list node
*
* @n: Integer stored in the node
* @prev: Pointer to the previous element of the list
* @next: Pointer to the next element of the list
*/
typedef struct listint_s // generating a structure
{
const int n;
struct listint_s *prev;
struct listint_s *next;
} listint_t;
/**
* create_listint - Creates a doubly linked list from an array of integers
*
* @array: Array to convert to a doubly linked list
* @size: Size of the array
*
* Return: Pointer to the first element of the created list. NULL on failure
*/
listint_t *create_listint(const int *array, size_t size)
{
listint_t *list;
listint_t *node;
int *tmp;
list = NULL;
while (size--)
{
node = malloc(sizeof(*node));
if (!node)
return (NULL);
tmp = (int *)&node->n;
*tmp = array[size];
node->next = list;
node->prev = NULL;
list = node;
if (list->next)
list->next->prev = list;
}
return (list);
}
我很难理解的这些代码行
while (size--)
和
tmp = (int *)&node->n;
代码什么时候退出while循环,我也想了解这段代码是如何工作的。
在结构内
typedef struct listint_s // generating a structure
{
const int n;
struct listint_s *prev;
struct listint_s *next;
} listint_t;
用限定符CCD_ 2来声明数据成员CCD_。所以你可能不会直接给它赋值,比如
node->n = array[size];
编译器将发出一个错误,表示您正在尝试更改常量对象。
所以就用了一个窍门。首先,将指向对象的指针声明为指向非常量对象的指针
int *tmp;
并且使用投射将数据成员CCD_ 3的地址分配给该指针
tmp = (int *)&node->n;
由于表达式&node->n
的类型为const int *
,因此需要强制转换
然后使用指针tmp将一个值分配给常量对象
*tmp = array[size];
至于这个while loop
while (size--)
当数组中的元素数不等于0时,it进行迭代。你可以像一样重写while循环
while ( size-- != 0 )
该函数在列表的开头添加新元素,其中存储从数组的最后一个元素开始一直到数组的第一个元素的传递数组的值。
注意功能不安全。如果某个节点由于if语句而无法动态分配,则可能会产生内存泄漏
node = malloc(sizeof(*node));
if (!node)
return (NULL);