将C字符串插入链表时出现问题

将C字符串插入链表时出现问题,c,linked-list,C,Linked List,我正在编写一个程序来读取一个文件,然后将数据存储到一个链表中 linkedList.h #include<stdio.h> #include<stdlib.h> #include<string.h> #include<stdbool.h> struct linked_list { char *stock_name; double stock_price; struct linked_list *next; }; type

我正在编写一个程序来读取一个文件,然后将数据存储到一个链表中

linkedList.h

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

struct linked_list
{
    char *stock_name;
    double stock_price;
    struct linked_list *next;
};

typedef struct linked_list NODE;

NODE* insert(NODE *head, double stock_price, char *stock_name);
void printList(NODE *head);
#包括
#包括
#包括
#包括
结构链表
{
字符*股票名称;
双倍股价;
结构链接列表*下一步;
};
typedef结构链接列表节点;
节点*插入(节点*头,双股票价格,字符*股票名称);
作废打印列表(节点*头);
linkedList.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#include"linkedList.h"

void printList(NODE *head)
{
    NODE *this = head;

    while(this != NULL)
    {
        printf("stock name:%s , stock price:%lf\n", this->stock_name, this->stock_price);
        this = this->next;
    }

}


NODE* insert(NODE *head, double stock_price, char *stock_name)
{
    NODE *newNode = malloc(sizeof(NODE));

    if(head == NULL)
    {
        newNode->stock_price = stock_price;
        newNode->stock_name = stock_name;
        head = newNode;
    }
    else
    {
        newNode->stock_price = stock_price;
        newNode->stock_name = stock_name;

        newNode->next = head;
        head = newNode;
    }
    return head;
}
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include "linkedList.h"

NODE *head;
bool headNode = true;

void insertIntoLinkedList(char *stock_name, double stock_price);

int main ( int argc, char *argv[] )
{
    head = malloc(sizeof(NODE));

    double stock_price;
    char stock_name[100];
    int stock_name_counter = 0;

    **..then I read the file..**


    stock_name[stock_name_counter] = '\0'; //to end my C string
    stock_name_counter = 0;  //this is used for reading char

    insertIntoLinkedList(stock_name, stock_price); //I double checked here,the name and price is correct
         **......**
    printList(head); //**Not the output I want**
    fclose( file );


void insertIntoLinkedList(char *m_stock_name, double m_stock_price)
{
    if(headNode == true)
    {
        head = insert(NULL, m_stock_price, m_stock_name);
        headNode = false; //this is used to insert data to my linked list for the first time
    }
    else
    {
        head = insert(head, m_stock_price, m_stock_name);
    }
}
#包括
#包括
#包括
#包括
#包括“linkedList.h”
无效打印列表(节点*头)
{
节点*这=头部;
while(此!=NULL)
{
printf(“股票名称:%s,股票价格:%lf\n”,this->stock\u name,this->stock\u price);
这个=这个->下一个;
}
}
节点*插入(节点*头,双股票价格,字符*股票名称)
{
NODE*newNode=malloc(sizeof(NODE));
if(head==NULL)
{
新建节点->股票价格=股票价格;
新建节点->股票名称=股票名称;
头=新节点;
}
其他的
{
新建节点->股票价格=股票价格;
新建节点->股票名称=股票名称;
新建节点->下一步=头部;
头=新节点;
}
回流头;
}
main.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#include"linkedList.h"

void printList(NODE *head)
{
    NODE *this = head;

    while(this != NULL)
    {
        printf("stock name:%s , stock price:%lf\n", this->stock_name, this->stock_price);
        this = this->next;
    }

}


NODE* insert(NODE *head, double stock_price, char *stock_name)
{
    NODE *newNode = malloc(sizeof(NODE));

    if(head == NULL)
    {
        newNode->stock_price = stock_price;
        newNode->stock_name = stock_name;
        head = newNode;
    }
    else
    {
        newNode->stock_price = stock_price;
        newNode->stock_name = stock_name;

        newNode->next = head;
        head = newNode;
    }
    return head;
}
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include "linkedList.h"

NODE *head;
bool headNode = true;

void insertIntoLinkedList(char *stock_name, double stock_price);

int main ( int argc, char *argv[] )
{
    head = malloc(sizeof(NODE));

    double stock_price;
    char stock_name[100];
    int stock_name_counter = 0;

    **..then I read the file..**


    stock_name[stock_name_counter] = '\0'; //to end my C string
    stock_name_counter = 0;  //this is used for reading char

    insertIntoLinkedList(stock_name, stock_price); //I double checked here,the name and price is correct
         **......**
    printList(head); //**Not the output I want**
    fclose( file );


void insertIntoLinkedList(char *m_stock_name, double m_stock_price)
{
    if(headNode == true)
    {
        head = insert(NULL, m_stock_price, m_stock_name);
        headNode = false; //this is used to insert data to my linked list for the first time
    }
    else
    {
        head = insert(head, m_stock_price, m_stock_name);
    }
}
#包括
#包括
#包括
#包括“linkedList.h”
节点*头;
bool headNode=true;
作废插入链接列表(字符*股票名称,双倍股票价格);
int main(int argc,char*argv[])
{
head=malloc(sizeof(NODE));
双倍股价;
char stock_name[100];
int stock_name_counter=0;
**…然后我读了文件**
stock_name[stock_name_counter]='\0';//结束我的C字符串
stock\u name\u counter=0;//用于读取字符
insertIntoLinkedList(stock_name,stock_price);//我在这里仔细检查了一下,名称和价格都是正确的
**......**
打印列表(标题);//**不是我想要的输出**
fclose(文件);
作废插入链接列表(字符*m_股票名称,双m_股票价格)
{
if(headNode==true)
{
head=插入(空,m_股票价格,m_股票名称);
headNode=false;//用于第一次将数据插入到我的链表中
}
其他的
{
head=插入(head、m_股票价格、m_股票名称);
}
}
问题是:如果文件包含: 雅虎120 谷歌10 苹果199

我的printList()给了我以下信息: 苹果120 苹果10 苹果199


我已经试着调试了几个小时,仍然无法理解为什么名称没有正确地存储在我的链接列表中(但价格是正确存储的…)…任何帮助都将不胜感激:)

在调用insert时,您需要复制存储在stock_name中的字符串。按原样,所有节点都指向同一个缓冲区,并且每次读取新行时,您都会覆盖缓冲区。最后,这意味着所有节点都有文本APPLE,因为这是最后一次读取到缓存中的内容共享缓冲区。如果复制缓冲区的内容(而不仅仅是指向缓冲区的指针)或者在每次读取文件时分配一个新的缓冲区,这将是固定的。

在调用insert时,您需要复制存储在stock\u name中的字符串。按原样,所有节点都指向同一个缓冲区,每次读取新行时,您都会覆盖缓冲区。最后,这意味着所有节点都有文本APPLE,因为这是读取到共享缓冲区的最后一个内容或者在每次读取文件时分配一个新的缓冲区,这将是固定的。

在整个程序中,
stock\u name
的主地址始终保持不变,并且您将该地址存储到
newNode->stock\u name
中,因此您将始终在
stock\u name
中获得最后存储的字符串

修改

NODE* insert(NODE *head, double stock_price, char *stock_name)
{
    NODE *newNode = malloc(sizeof(NODE));
    newNode->stock_name = malloc(strlen(stock_name)+1);
    if(head == NULL)
    {
        newNode->stock_price = stock_price;            
        strcpy(newNode->stock_name, stock_name);
        head = newNode;
    }
    else
    {
        newNode->stock_price = stock_price;
        strcpy(newNode->stock_name, stock_name);

        newNode->next = head;
        head = newNode;
    }
    return head;
}

不要忘记释放分配的内存。

在整个程序中,
stock\u name
的主地址始终保持不变,您将该地址存储到
newNode->stock\u name
,因此您将始终在
stock\u name
中获得最后存储的字符串

修改

NODE* insert(NODE *head, double stock_price, char *stock_name)
{
    NODE *newNode = malloc(sizeof(NODE));
    newNode->stock_name = malloc(strlen(stock_name)+1);
    if(head == NULL)
    {
        newNode->stock_price = stock_price;            
        strcpy(newNode->stock_name, stock_name);
        head = newNode;
    }
    else
    {
        newNode->stock_price = stock_price;
        strcpy(newNode->stock_name, stock_name);

        newNode->next = head;
        head = newNode;
    }
    return head;
}

不要忘记释放分配的内存。

您的基本问题是C没有“字符串”类型。字符串是简单的字符数组,数组用作函数的参数时会“衰减”到指针。根据您使用它的方式,您的
insert()
函数应该执行第二个
malloc()
为字符串分配存储空间,并使用
strdup()
或类似工具存储字符串


另一个问题是,
insert()中存在逻辑缺陷
函数。如果
head
为NULL,则不会初始化
newNode->next
。无论哪种方式,都应该初始化
newNode->next=head
。如果为NULL,很好。那么列表尾部将不会指向不确定的位置。

基本问题是C没有“字符串”类型。字符串是一个简单的字符数组,当用作函数的参数时,数组“衰减”为指针。根据您使用它的方式,您的
insert()
函数应该执行第二次
malloc()
为字符串分配存储,并使用
strdup()
或类似方法存储它


另一个问题是,
insert()中存在逻辑缺陷<代码>新节点>下一个如果<代码>头/代码>为空。你应该做的是<代码> NealNodos> Next=头<代码>。如果它是空的,好的。你的列表尾不会指向一个不确定的地方。

考虑移动,也可以考虑只使用而不是拉你的脑袋。在熟悉C之前,我们可以尝试编写我自己的数据结构:“考虑移动,也可以只考虑使用,而不用拖动你的大脑。THX,但我想在我熟悉C:之前尝试编写我自己的数据结构),但是当我这样做的时候:NeNealth->