链表中的 void*
void* in linkedList
我有一个简单的链表,看起来像这样
typedef struct Node {
void *data;
struct Node *next
} Node;
typedef struct Node {
Node *head;
Node *tail;
int size;
} LinkedList
我的 add_node 函数如下所示:
void add_nth_node(LinkedList *list, int n, void *new_data) {
Node *prev, *curr;
Node *new_node;
if (list == NULL) {
return;
}
/* n >= list->size inseamna adaugarea unui nou nod la finalul listei. */
if (n > list->size) {
n = list->size;
} else if (n < 0) {
return;
}
curr = list->head;
prev = NULL;
while (n > 0) {
prev = curr;
curr = curr->next;
--n;
}
new_node = malloc(sizeof(Node));
if (new_node == NULL) {
perror("Not enough memory to add element!");
exit(-1);
}
new_node->data = new_data;
new_node->next = curr;
if (prev == NULL) {
/* Adica n == 0. */
list->head = new_node;
} else {
prev->next = new_node;
}
if (new_node->next == NULL) {
list->tail = new_node;
}
list->size++;
当我尝试向列表中添加节点时出现了一些奇怪的情况。
当我这样添加它们时:
int i;
for (i = 0; i < 10; i++) {
add_nth_node(list, i, &i);
}
但是当我像这样添加元素时:
int i, v[10];
for(i = 0; i < 10; i++) {
v[i] = i;
add_nth_node(list_1, i, &v[i]);
}
一切都按预期进行。这是为什么 ?
为什么我必须先将元素放在向量中才能将它们添加到列表中。
add_nth_node(list, i, &i) // (1)
// and
add_nth_node(list_1, i, &v[i]); // (2)
它们不一样,但是您为每个节点分配的数据值在两个选项中是相同的。
(1) 你让指针指向i
的地址。
(2) 你让指针指向v[i]
的地址。
使用 (1) 是一个非常糟糕的主意,因为在这种情况下,所有节点的所有 data
都指向同一个地址。所以如果一个节点的data
改变了,所有节点的数据都会改变值。
我有一个简单的链表,看起来像这样
typedef struct Node {
void *data;
struct Node *next
} Node;
typedef struct Node {
Node *head;
Node *tail;
int size;
} LinkedList
我的 add_node 函数如下所示:
void add_nth_node(LinkedList *list, int n, void *new_data) {
Node *prev, *curr;
Node *new_node;
if (list == NULL) {
return;
}
/* n >= list->size inseamna adaugarea unui nou nod la finalul listei. */
if (n > list->size) {
n = list->size;
} else if (n < 0) {
return;
}
curr = list->head;
prev = NULL;
while (n > 0) {
prev = curr;
curr = curr->next;
--n;
}
new_node = malloc(sizeof(Node));
if (new_node == NULL) {
perror("Not enough memory to add element!");
exit(-1);
}
new_node->data = new_data;
new_node->next = curr;
if (prev == NULL) {
/* Adica n == 0. */
list->head = new_node;
} else {
prev->next = new_node;
}
if (new_node->next == NULL) {
list->tail = new_node;
}
list->size++;
当我尝试向列表中添加节点时出现了一些奇怪的情况。 当我这样添加它们时:
int i;
for (i = 0; i < 10; i++) {
add_nth_node(list, i, &i);
}
但是当我像这样添加元素时:
int i, v[10];
for(i = 0; i < 10; i++) {
v[i] = i;
add_nth_node(list_1, i, &v[i]);
}
一切都按预期进行。这是为什么 ? 为什么我必须先将元素放在向量中才能将它们添加到列表中。
add_nth_node(list, i, &i) // (1)
// and
add_nth_node(list_1, i, &v[i]); // (2)
它们不一样,但是您为每个节点分配的数据值在两个选项中是相同的。
(1) 你让指针指向i
的地址。
(2) 你让指针指向v[i]
的地址。
使用 (1) 是一个非常糟糕的主意,因为在这种情况下,所有节点的所有 data
都指向同一个地址。所以如果一个节点的data
改变了,所有节点的数据都会改变值。