插入C字符串到链表的问题



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

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);

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:%lfn", 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;
}

c

#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] = ''; //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);
    }
}

问题是这样的:如果文件包含:雅虎120年谷歌10苹果199

我的printList()给了我这个:苹果120苹果10苹果199

我一直在尝试调试几个小时,仍然无法弄清楚为什么这个名字没有正确存储在我的链表中(但价格是正确存储的…)…任何帮助都会很感激:)

main中stock_name的地址在整个程序中始终是恒定的,并且您将该地址存储到newNode->stock_name中,因此您将始终获得stock_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;
}

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

在调用insert时需要复制存储在stock_name中的字符串。实际上,所有节点都指向同一个缓冲区,每次读取新行时,都会覆盖缓冲区。最后,这意味着所有节点都有文本APPLE,因为这是读入共享缓冲区的最后一个内容。如果您复制缓冲区的内容(而不仅仅是指向缓冲区的指针)或每次从文件读取时分配一个新缓冲区,则可以修复此问题。

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

你的另一个问题是你在insert()函数中有一个逻辑缺陷。如果head为NULL,则没有初始化newNode->next。无论如何你都应该做newNode->next = head。如果是NULL,很好。这样你的列表尾部就不会指向一个不确定的位置。

相关内容

  • 没有找到相关文章

最新更新