void* in linkedList

问题描述 投票:0回答:1

我有一个简单的链接列表,看起来是这样的

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]);
    }

所有的东西都能正常工作。为什么呢?为什么我必须先把元素是一个向量来添加到列表中。

c pointers linked-list void
1个回答
2
投票
add_nth_node(list, i, &i) // (1)
// and
add_nth_node(list_1, i, &v[i]); // (2)

它们是不一样的,但在两个选项中,你为每个节点分配的数据值是一样的。

(1)你让指针指向的地址是 "Node *head"。i.

(2)你让指针指向的地址是 v[i].

使用(1)是非常糟糕的想法,因为在这种情况下,所有的 data 的所有节点都指向同一个地址。所以如果 data 一个节点的数据改变,所有节点的数据都会改变数值。

© www.soinside.com 2019 - 2024. All rights reserved.