[英]How do I change my struct within function without double pointers?
我正在嘗試實現一個包含聯系人的 hash 表,因此 hash 表的每一行都是一個鏈表。 當 hash 表的聯系人太多時,我不得不調整它的大小。 但是,我對函數的原型沒有發言權,這意味着 function 調整大小始終采用指向我的 hash 表的單個指針作為參數。
這些是我的結構:
struct dir {
uint32_t len;
uint32_t contactsNumber;
struct contact* contactList;
};
struct contact {
char *name;
char *num;
struct contact *next;
};
這是我初始化目錄的方式:
struct dir *dir_create(uint32_t len)
{
struct dir * directory = malloc(sizeof(struct dir)*len);
directory->contactsNumber = 0;
for (uint32_t i = 0; i<len;i++) {
directory[i].contactList = contact_sentinel();
}
directory->len = len;
return(directory);
}
contact_sentinel() 返回一個帶有空虛擬節點的鏈表。
這是我的調整大小原型(強加):
extern void dir_resize(struct dir *dir,uint32_t new_size);
顯然,當我嘗試在調整大小 function 內操作我的結構時,一切正常並且表大小調整,但是一旦我離開 function,我的目錄就會恢復正常。 原因是我沒有使用雙指針,這意味着我的目錄仍然指向同一個舊目錄並且沒有任何改變。
所以我的問題是:如何在不使用雙指針的情況下有效地調整大小? 我應該改變我的結構嗎? 有辦法嗎?
這是我的調整大小 function:
void dir_resize(struct dir *dir,uint32_t new_size)
{
uint32_t old_size = dir->len;
struct dir *new_dir = dir_create(new_size);
for (uint32_t i = 0; i<old_size;i++) {
struct contact *current_contact = dir[i].contactList;
while (current_contact->next != NULL) {
dir_insert(new_dir, current_contact->next->name,current_contact->next->num);
// contact_removeTop(current_contact->next);
current_contact->next = current_contact->next->next;
}
}
}
我不知道在那之后要做什么,現在我已經創建了新的 hash 表(通過計算新的 hash 並將其插入正確的位置),我如何將 new_dir 轉移到舊目錄原型?
感謝您的回答恢復莫妮卡!
不幸的是,執行 dir->contactList = new_dir 並沒有更改表,因為它恢復到 function 之外的狀態。
但是,這是我更新后的調整大小 function:
void dir_resize(struct dir *dir,uint32_t new_size)
{
uint32_t old_size = dir->len;
struct dir *new_dir = dir_create(new_size);
for (uint32_t i = 0; i<old_size;i++) {
struct contact *current_contact = dir[i].contactList;
while (current_contact->next != NULL) {
dir_insert(new_dir, current_contact->next->name, current_contact->next->num);
// contact_removeTop(current_contact->next);
current_contact->next = current_contact->next->next;
}
}
dir_free(dir);
dir->contactsNumber = new_dir->contactsNumber;
dir->len = new_size;
for (uint32_t i = 0; i<new_size;i++) {
dir[i].contactList = new_dir[i].contactList;
}
}
我在最后添加的行似乎有效。 我的表在 function 之外發生了變化。現在我只需要弄清楚如何釋放 dir 之前使用的 memory 空間。 (idk if free(dir) 就足夠了,因為它里面有 *contacts)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.