我正在写一个程序来读取一个文件,然后将数据存储到一个链表中。
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,很好。这样你的列表尾部就不会指向一个不确定的位置。