簡體   English   中英

鏈接列表中的 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 function 看起來像這樣:

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發生變化,所有節點的數據都會改變值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM