0

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

链接列表.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);

链接列表.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);
    }
}

这是问题所在:如果文件包含: YAHOO 120 GOOGLE 10 APPLE 199

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

我一直在尝试调试几个小时,但仍然无法弄清楚为什么名称没有正确存储在我的链接列表中(但价格存储正确..)......任何帮助将不胜感激:)

4

3 回答 3

2

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

于 2013-05-08T04:44:35.113 回答
2

in main的地址stock_name在整个程序中始终保持不变,您将该地址存储到newNode->stock_name,因此您将始终获得最后存储的字符串 in 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;
}

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

于 2013-05-08T04:44:50.663 回答
1

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

您的另一个问题是您的insert()功能存在逻辑缺陷。newNode->next如果head为 NULL,则您没有初始化。你应该做newNode->next = head任何一种方式。如果它是NULL,很好。然后,您的列表尾部将不会指向不确定的位置。

于 2013-05-08T04:46:09.753 回答