2017-04-11 68 views
0

我採取的一種桶堆的使用下面的結構爲節點結構使用char ** VAL

struct NodeBucket { 
    char** val; 
    struct NodeBucket* next; 
}; 

它應該工作的每一個木桶能裝值的規定量的方式,當完整的時候創建一個新的NodeBucket並且鏈接到前一個然後填充等等。 嘗試將第二個值添加到第一個存儲桶時,我遇到了混淆。當我添加第一個值創建第一個桶時,請使用temp->value = &val將值設置爲輸入。現在我不確定如何添加其餘的輸入。我試過使用索引(firstBucket-> val [1] = val),但這似乎並不正確。我將不勝感激任何幫助。是的,這是家庭作業,我是C的一個相對初學者,來自Python。

編輯

void push(char* val, struct Stack *stack){ 
    if (isEmpty(stack)){ 
      struct NodeBucket *temp =malloc(sizeof(struct NodeBucket)); 
      temp ->val = &val; 
      temp->next = NULL; 
      stack->firstBucket=temp; 
      stack->topElt++; 
    }else if(!isEmpty(stack)&& size(stack)!=stack->bucketSize){ 
      stack->firstBucket->val[stack->topElt] = val; 
      stack->topElt++; 
    } 
+0

您需要向我們展示一些代碼並指出它在哪裏被破壞/您被卡住 – JeremyP

+0

添加了我的推送功能。謝謝! – spaceinvaders101

+1

'temp - > val = &val;'??存儲臨時變量的地址絕對不是要做的事情。 –

回答

0

它應該工作的方式是每一個木桶能裝值的規定量,

所以你的水桶必須有足夠的存儲FO stack->bucketSize值,這些值是字符串,因此類型爲char*。你沒有這樣做,實際上你正在創建一個指向char*的指針,並將它的地址分配到val堆棧上,當函數返回時它將消失。

struct NodeBucket需要知道它存儲了多少個項目。你也需要爲val數組分配空間。初始化如下:

struct NodeBucket* temp = malloc(sizeof *temp); 
temp->val = malloc(sizeof(char*) * stack->bucketSize); 
temp->numValues = 0; 
temp->next = NULL; 

將所有內容按相反順序排列。

請注意,我在末尾放了val,因爲您可以利用flexible array member feature將malloc(和釋放)減少到1。

然後添加一個新字符串,您會看到numValues是否小於stack->bucketSize。如果是,則將該字符串添加到數組的末尾(stack->firstBucket->val[numValues] = val)並增量numValues。如果不是,則創建一個新的NodeBucket並將其添加到那裏。

+0

謝謝你的一個非常明確的答案。初始化內存絕對是我忘記的東西。現在挑剔的部分,我的支柱定義只允許以我最初發布的方式進行,只有兩個值按此順序排列。在我的堆棧結構中,我確實有一個int topElt,它與我相信的numValues基本相同 – spaceinvaders101