簡體   English   中英

如何在沒有雙指針的情況下更改 function 內的結構?

[英]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.

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