为什么从双向链表打印时得到相同的字符串值但不同的算术值

Why do i get the same string value but different arithmetic values when printing from a Doubly Linked List

因此,当从 DLL 打印时,我为所有记录获取以下字段的相同字符串值:姓氏、名字、地址、居住地。所有这些字段都包含字符串值。尽管对于我打印的每个节点,我都得到了正确的算术值,例如客户 ID、地址编号、邮政编码和支出。这是我的主要内容:

#include <stdio.h>
#include <stdlib.h>

#include "ClientList.h"

#define SIZE_T 5000
#define YES 1
#define NO 0

main(int argc, char *argv[]){
    FILE    *fp=NULL;
    unsigned long customerid;
    char    clname[SIZE_T];
    char    cfname[SIZE_T];
    char    Address[SIZE_T];
    unsigned int AddressNumber;
    char PlaceOfResidence[SIZE_T];
    unsigned int PostalCode;
    float Expenditure;

     ClientList *List = ClientList_create();

    fp=fopen(argv[1],"r");

    while(fscanf(fp,"%lu %s %s %s %d %s %u %f \n", &customerid, clname, cfname, Address, &AddressNumber, PlaceOfResidence, &PostalCode, &Expenditure) != EOF){
        //printf("+++ Just read: %lu %s %s %s %d %s %u %.02f \n",customerid, clname, cfname, Address, AddressNumber, PlaceOfResidence, PostalCode, Expenditure);
        ClientNode *Node = ClientNode_create(customerid, clname, cfname, Address, AddressNumber, PlaceOfResidence, PostalCode, Expenditure);
        ClientList_printNode(Node);
        ClientList_pushfront(List, Node);
}
    int K = size(List);
    unsigned long custid;
    char *name;
    printf("The size of the list is %d records \n",K);
    printf("Enter Customer ID you wish to search:\n");
    scanf("%lu",&custid);
    int M = ClientList_search(List, custid);
    if(M == YES)
        printf("YES\n");
    else
        printf("NO\n");
    Print_List(List);
    ClientList_destroy(List);
    fclose(fp);

    exit(0);
}

还有我的 insertprint_list 函数:

void ClientList_pushfront(ClientList *list, ClientNode *node){
    node->next = list->head;
    node->previous = NULL;
    if(list->head != NULL){
        node->next = list->head;
        list->head->previous = node;
    }
    else{
        list->tail = node;
    }
    list->head = node;
    list->size ++;
}

void Print_List(ClientList *list)
{
    ClientNode *current = malloc(sizeof(ClientNode));
    current = list->head;
    while(current)
    {
        printf("Customer ID: %lu | Last Name: %s | First Name: %s | Address: %s | Number: %u | Place of Residence: %s | Postal Code: %d | Expenditure: %.02f |\n", current->customerid, current->LastName, current->FirstName, current->Address, current->AddressNumber, current->PlaceOfResidence, current->PostalCode, current->Expenditure);
        current = current->next;
    }   
}

我的Create_Node函数:

ClientNode *ClientNode_create(unsigned long customerid, char *LastName, char *FirstName, char *Address, unsigned int AddressNumber, char *PlaceOfResidence, unsigned int PostalCode, float Expenditure){
    ClientNode *client = malloc(sizeof(ClientNode));
    client->Expenditure = Expenditure;
    client->customerid = customerid;
    client->FirstName = FirstName;
    client->LastName = LastName;
    client->Address = Address;
    client->AddressNumber = AddressNumber;
    client->PostalCode = PostalCode;
    client->PlaceOfResidence = PlaceOfResidence;
    client->next = NULL;
    client->previous = NULL;
    return client;
}

这是我得到的输出的一部分:

Customer ID: 14260622 | Last Name: Pickett | First Name: Norma | Address: Todd | Number: 333 | Place of Residence: Robinwood | Postal Code: 23209 | Expenditure: 1030.00 |
Customer ID: 18723325 | Last Name: Pickett | First Name: Norma | Address: Todd | Number: 264 | Place of Residence: Robinwood | Postal Code: 42473 | Expenditure: 924.00 |
Customer ID: 16243937 | Last Name: Pickett | First Name: Norma | Address: Todd | Number: 350 | Place of Residence: Robinwood | Postal Code: 34297 | Expenditure: 402.00 |
Customer ID: 16451445 | Last Name: Pickett | First Name: Norma | Address: Todd | Number: 253 | Place of Residence: Robinwood | Postal Code: 14361 | Expenditure: 449.00 |

在您的 ClientNode_create 函数中,您复制了 char 指针,而不是 char 指针中的 values。这意味着所有结构中的文本字段都将指向 main.

中的相同字符缓冲区

一种解决方案是使用 mallocstrcpy

client->FirstName = malloc(strlen(FirstName)+1);
strcpy(client->FirstName, FirstName));

对于所有字符串。或者编写一个执行此操作的函数 - 许多库还包含一个函数 strdup 来执行此操作。
别忘了稍后 free 记忆!