2013-12-23 66 views
2

我想創建與2個變量的結構體的另一變量,如命名的變量在C

struct myStruct { 
char charVar; 
int intVar; 
}; 

,我將命名結構爲:

struct myStruct name1; 
struct myStruct name2; 

問題是,我不知道會輸入多少個變量,所以必須有無限的nameX結構。

那麼,如何命名這些結構的變量?

謝謝。

+11

查找*數組*。 – Blorgbeard

+3

我想讓你的機器擁有無限的內存。 – 2013-12-23 20:11:24

+0

大聲笑我的意思是我不知道會輸入多少個變量,我不想在開始時創建這些變量。我想在用戶需要時創建一個結構,但我不知道如何命名它們 – user3108849

回答

4

你應該使用一個數組和一個指針。

struct myStruct *p = NULL; 
p = malloc(N * sizeof *p); // where N is the number of entries. 
int index = 1; /* or any other number - from 0 to N-1*/ 
p[index].member = x; 

然後,你可以通過使用realloc如果你需要添加額外的條目元素添加到它。

+0

我得到錯誤「p'的衝突類型」...你是什麼意思與「索引」? – user3108849

+0

@Devolus。就我個人而言,我會回答你的答案,因爲這是一個更好的整體概念。我不是支離破碎的鏈表的忠實擁躉,儘管它們有其用途。隨着內存運行到GB中,預分配通常更容易。 –

+0

如果你需要更多的條目,你總是可以'realloc()'。 – Arkadiy

2

重新定義MYSTRUCT作爲

struct myStruct { 
    char charVar; 
    int intVar; 
    struct myStruct *next; 
}; 

跟蹤你有最後的結構以及列表的開始。添加新元素時,將它們追加到鏈表的末尾。

/* To initialize the list */ 
struct myStruct *start, *end; 
start = malloc(sizeof(struct myStruct)); 
start->next = NULL; 
end = start; 

/* To add a new structure at the end */ 
end->next = malloc(sizeof(struct myStruct)); 
end = end->next; 
end->next = NULL; 

本示例不執行任何錯誤檢查。這裏是你將如何沿着名單步驟打印在它所有的值:

struct myStruct *ptr; 
for(ptr = start; ptr != NULL; ptr = ptr->next) 
    printf("%d %s\n", ptr->intVar, ptr->charVar); 

你不必有一個鏈接列表中的每個結構的不同的名稱(或任何其他類型的列表,在一般情況) 。在使用它們時,您可以將任何未命名的結構分配給指針ptr

+0

我知道你是怎麼增加結構數量的..我只是不能瞭解你是如何命名每個結構的。你能幫我理解嗎? :) – user3108849

+0

@ user3108849。除了列表中的第一個和最後一個之外,我沒有列出任何結構。你從第一個開始,沿着'next'指針前進,直到你點擊NULL。這樣你就不需要知道名字。我已經添加了一個如何在列表中列印所有值的例子來說明。 –

+0

我想我會選擇包括命名在內的其中一個。非常感謝您的關注:) – user3108849

1

那麼,如何命名這些結構的變量?

我覺得每個初學者都開始想要命名一切。這並不令人驚訝 - 您瞭解如何使用變量來存儲數據,因此您總是使用變量似乎很自然。答案是,但是,不是總是使用變量來存儲數據。通常,您將數據存儲在動態創建的結構或對象中。這可能有助於閱讀有關dynamic allocation。這個想法是,當你有一個新的數據存儲,你要求一個內存(使用庫調用如malloccalloc)。你可以通過它的地址來引用那塊內存,即指針

有很多方法可以跟蹤您獲得的所有內存條,並且每個內存條構成一個data structure。例如,您可以在連續的內存塊中保留大量數據 - 這是一個數組。例如Devolus的回答。或者你可以有很多小塊的內存,每一塊都包含下一塊地址(同樣是一個指針);這是一個鏈表。瘋狂的物理學家的答案是鏈表的一個很好的例子。

每個數據結構都有自己的優點和缺點 - 例如,數組允許快速訪問,但插入和刪除速度慢,而鏈接列表訪問相對較慢,但插入和刪除速度較快。爲手頭的工作選擇正確的數據結構是編程的重要部分。

通常需要一點時間才能熟悉指針,但它非常值得您付出努力,因爲它們爲您在程序中存儲和操作數據開闢了許多可能性。享受車程。

+0

「我認爲每個初學者都會開始想要命名所有內容,這並不令人驚訝 - 您瞭解如何使用變量來存儲數據,所以這似乎很自然,你總是使用變量「 是的,這正是我的情況。作爲一名初學者的經驗豐富,你能給我一些建議嗎?因爲我在這裏很困惑.. – user3108849

+0

我被要求建立一種社交網絡,程序會從文件中獲取命令並應用它們。我想爲每個用戶創建結構,並將它們命名爲user1,user2等。是不是錯誤?該命令將會像例如「讓約翰·史密斯和簡·杜受到制約。」我會尋找約翰和簡的結構,並讓他們成爲朋友。我應該使用哪種方法? – user3108849

+0

是的,對每個用戶使用變量是錯誤的方法。在真實的社交網絡中,每個用戶可能會被表示爲數據庫表中的記錄,並且您可能會有另一個表格來表示用戶之間的關係。但這很先進。我建議學習數組和鏈表,如其他答案所示。熟悉動態內存分配。然後繪製一幅你希望程序如何表示數據的圖片,每個結構都有一個框,每個指針有一個箭頭。 – Caleb