Schwierigkeiten mit der Einfügung von C-string in die Link-Liste
Ich Schreibe an einem Programm, um eine Datei Lesen und speichern Sie dann die Daten in einer verknüpften Liste.
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:%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;
}
main.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] = '\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);
}
}
Hier ist das problem: wenn die Datei das enthält:
YAHOO 120
GOOGLE 10
APPLE 199
meine printList() gab mir dieses:
APPLE 120
APPLE 10
APPLE 199
Habe ich versucht zu Debuggen, die für Stunden und immer noch keinen Reim, warum wird der name nicht gespeichert in meine Link-Liste richtig(aber der Preis ist store richtig..)...jede Hilfe zu schätzen wissen 🙂
- Stellen Sie zu codereview.stackexchange.com
- Überlegen Sie auch, nur mit sys/queue.h anstelle der ziehen Sie Ihre Gehirne heraus.
- thx, aber ich möchte versuchen, das schreiben meiner eigenen Datenstruktur, bevor ich Sie vertraut mit C 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Adresse von
stock_name
im wesentlichen immer konstant durch das Programm und speichern Sie die Adresse annewNode->stock_name
und so erhalten Sie immer die Letzte gespeicherte Zeichenfolge instock_name
.Änderung
Vergessen Sie nicht, um die Freigabe des allokierten Speichers.
Die Sie brauchen, um eine Kopie des Strings gespeichert in stock_name beim Aufruf einfügen. Als ist, werden alle Knoten, zeigen Sie auf den gleichen Puffer, und jedes mal, wenn Sie Lesen eine neue Zeile, die Sie überschreiben den Pufferspeicher. Am Ende bedeutet dies, dass alle Knoten haben den text von APPLE, weil das ist das Letzte, Inhalte, die das Lesen in der shared buffer. Wenn Sie entweder kopieren Sie den Puffer-Inhalt (anstatt nur der Zeiger auf den buffer) oder reservieren einen neuen Puffer jedes mal, wenn Sie aus der Datei Lesen, dies behoben werden.
Ihre grundlegende problem ist, dass C nicht "String" - Typ. Ein string ist einfach ein array von Zeichen, und ein array "zerfällt", um einen Zeiger als argument an eine Funktion. Basierend auf die Art und Weise Sie Sie verwenden, Ihre
insert()
Funktion sollte nicht eine zweitemalloc()
reservieren Speicher für den string und verwenden Siestrdup()
oder ähnliches zu speichern.Ihre andere problem ist, dass du hast einen Logik-Fehler in der
insert()
Funktion. Sie sind nicht initialisierennewNode->next
wennhead
NULL ist. Sie tun solltennewNode->next = head
oder so. Wenn es NULL ist, gut. Ihre Liste der Schwanz wird dann nicht darauf an einen unbestimmten Ort.