[英]Printing Struct that is within linked list
我有 2 個結構,一個是姓名數組,另一個是鏈表。 每個節點都包含名稱和姓氏結構。
typedef struct name {
char given_name[200];
char surname[200];
} Name;
typedef struct list {
long id_number;
Name *name;
struct list *next;
} List;
void main() {
list *head = NULL;
add_to_list(&head);
print_list(&head);
}
void add_to_list(List **head) {
List *tmp_new;
List *prev;
tmp_new = (List *)malloc(sizeof(List));
(tmp_new->name) = malloc(sizeof(Name));
strcpy((tmp_new->name->given_name), "John");
strcpy((tmo_new->name->surname), "Blake");
tmp_new->id = atoi("654");
tmp_new->next = NULL;
///////// <- next part is here because
///////// i have it within while cycle
///////// and this is how i move to the next cell in linked list
if ((*head) == NULL) {
*head = tmp_new;
prev = tmp_new;
} else {
prev->next= tmp_new;
prev = tmp_new;
}
/////////// upcoming next iteration
strcpy((tmp_new->name->given_name), "Tom");
strcpy((tmo_new->name->names), "Jerry");
tmp_new->id = atoi("4568");
}
void print_list(List **head) {
List *tmp;
tmp = *head;
while (tmp != NULL) {
printf("\n Name: %s", tmp->name->given_name);
printf("\n Surname: %s", tmp->name->surname);
printf("\n ID: %ld", tmp->id_number);
printf("\n");
tmp = tmp->next;
}
}
加載或打印不會給我任何錯誤。 但是印刷品給我一些奇怪的東西。 預期的:
Name: John
Surname: Blake
ID: 654
Name: Tom
Surname: Jerry
ID:4568
它給了什么:
Name: Tom
Surname: Jerry
ID: 654
Name: Tom
Surname: Jerry
ID:4568
因此,即使它通過鏈表,似乎結構名稱本身也不在列表的單元格中。 應該怎么做才能在里面?
您的基本問題是您沒有為 John Blake 和 Tom Jerry 分配單獨的Name
結構,因此當您將 Tom Jerry 的數據復制到該結構中時,您會覆蓋 John Blake 的信息。 我什至不清楚你分配了兩個List
結構——我沒有用 Valgrind 或等效的測試你的代碼,但我認為你在嚴重濫用 memory。
你需要重組你的add_to_list()
function 以便它只添加一個人——這個人應該由 arguments 到 function 來標識。它應該采用列表頭、名字、姓氏和 ID 號,並且應該返回一個指向列表新頭部的指針(或者它應該采用指向頭部指針的指針並更新它)。 然后,您應該在main()
function 中調用它兩次。function 將在每次調用時分配一個新名稱和一個列表項。 function 應該做一份工作。
List *add_to_list(List *head, const char *forename, const char *surname, int id);
或者(但不太明智):
void add_to_list(List **p_head, const char *forename, const char *surname, int id);
使用tmp_new->id = atoi("4568");
有點傻而不是tmp_new->id = 4568;
,但是當您按照建議重寫 function 時,這將不再是一個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.