簡體   English   中英

打印鏈表中的結構

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

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