【问题标题】:Trouble with insertion of C string into linked list将 C 字符串插入链表的问题
【发布时间】:2013-05-08 04:31:24
【问题描述】:

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

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

ma​​in.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);
    }
}

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

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

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

【问题讨论】:

标签: c linked-list


【解决方案1】:

main 中stock_name 的地址在整个程序中始终保持不变,您将该地址存储到newNode-&gt;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;
}

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

【讨论】:

  • 但是当我在插入函数中执行以下操作时:newNode->stock_name 仍然会得到正确的名称,为什么?
  • 因为你还没有覆盖缓冲区。稍后,当您阅读下一行时。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    您的另一个问题是insert() 函数中存在逻辑缺陷。如果 head 为 NULL,则您没有初始化 newNode-&gt;next。无论哪种方式,您都应该使用newNode-&gt;next = head。如果它是NULL,很好。这样,您的列表尾部就不会指向不确定的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-10
      • 2016-04-11
      • 1970-01-01
      • 2019-05-04
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      • 1970-01-01
      相关资源
      最近更新 更多