2010-03-09 81 views
1

这不是作业,它只是一个事实,我已经失学20多年了,我从来没有必要使用链表。所以我在这里摆脱了我的元素。 反正我有制作本地数据副本进入链表

struct Data_Struct { 
    char *Name; 
    char *Task; 
    char *Pos; 
    struct Data_Struct *Next; 
}; 
typedef struct Data_Struct MyData; 

这是一个链表一个非常简单的结构。

正如你所看到的,数据存储在char *中,当我填充列表时,我在那里复制指针。 一切都很好。当这些指针被覆盖并且我丢失了原始数据时,问题就开始了。我试图将数据复制到每个“list_add()”的本地char * malloc中,但是我一直在崩溃或丢失数据。 是的,我确实分配了,是的,我会复制数据并检查它是否正确复制。我尝试过使用memcpy,strcpy等等。

我出来的东西试试,所以我的问题是,我如何确保我将添加到列表中的数据是本地的。如何将那些进入列表的char *复制到局部变量中。

虽然如何做到这一点以及为什么我的代码不好的解释是好的,我更喜欢代码与解释。 谢谢。

Jess。

回答

4

你不想“复制到本地”,你想按照你所说的去做;使用malloc()分配新内存,将数据存储在那里,并将指针保存在列表节点中。

如果有,可以使用strdup()malloc() + strcpy()合并成一个调用。

很难理解在什么情况下你会遇到数据被覆盖,你在做什么导致这个问题的列表节点?

基本前插应该是这样的,你的节点定义:

MyData * list_prepend(MyData* head, const char *name, const char *task, 
        const char *pos) 
{ 
    MyData *node = malloc(sizeof *node); 
    node->Name = strdup(name); 
    node->Task = strdup(task); 
    node->Pos = strdup(pos); 
    node->Next = head; 
    return node; 
} 

显然,这没有错误处理(malloc()strdup()可都失败)。请注意,这是一个前加,并且返回列表的新头部。