2016-12-01 49 views
0

我在C中有一个双链表,它的节点持有一个char *。 我的节点结构是这样的:打印LinkedList时程序崩溃

struct LinkedListNode{ 
char* data; 
LinkedListNode* next; 
LinkedListNode* prev; }; 

为LinkedList的的结构是这样的:

struct LinkedList{ 
LinkedListNode* head; 
LinkedListNode* tail;}; 

头是一个指向列表的第一个节点,尾指针列表的最后一个节点。我的问题是,我正在尝试编写一个函数来测试链接列表的一些标准函数,这些函数正在为实践目的而实现。于是,我开始在下面的函数生成一个列表:

LinkedList* make_test_list(){ 
LinkedList* newlist = LinkedList_create(); 
printf("Hier2"); 
LinkedListNode n1; 
LinkedListNode n2; 
LinkedListNode n3; 
LinkedListNode n4; 
LinkedListNode n5; 
n1.data = "abc"; 
n2.data = "def"; 
n3.data = "ghi"; 
n4.data = "pqr"; 
n5.data = "mno"; 
n1.next = &n2; 
n2.next = &n3; 
n2.prev = &n1; 
n3.next = &n4; 
n3.prev = &n2; 
n4.next = &n5; 
n4.prev = &n3; 
n5.prev = &n4; 
n5.next = NULL; 
newlist->head = &n1; 
newlist->tail = &n5; 
return newlist;} 

这似乎是做工精细,因为我可以重新访问每个节点的数据,如果我尝试打印这个功能里面。 LinkedList_create()包含以下代码:

LinkedList* LinkedList_create(){ 
LinkedList* list = malloc(sizeof(struct LinkedList)); 
list->head = NULL; 
list->tail = NULL; 
return list; 
} 

所以我想要做的下一件事是打印在一个单独的功能,我的名单。 功能看起来像这样:

void LinkedList_print(LinkedList* list){  
LinkedListNode* p = list->head; 
while(p != NULL)){ 
    printf("%s\n", p->data); 
    p = p->next; 
}} 

但不知何故,它不起作用。我认为我在分配指针时犯了一个错误。调用看起来是这样的:

int main(){ 
LinkedList* myList = make_test_list(); 
printf("List before: \n"); 

LinkedList_print(myList); 
} 

我会很高兴,如果你能帮助我在这一个,因为我很新的C和新的由自己管理的内存分配。

干杯!

+0

请显示[mcve]。不要描述你的代码,而是展示它。 –

回答

1

您的LinkedListNode变量(n1-n5)对于make_test_list函数是本地的。如果您想在该函数之外访问它们,则需要为它们分配内存。

例如:

LinkedListNode *n1 = malloc(sizeof(*n1)); 
n1->data = "abc"; 
... 
newlist->head = n1; 
... 

当然,你也想确保你free内存更高版本。我也假设LinkedList_create正确实施,因为它没有在这里显示。

+0

你,先生,是我的英雄! – Yannickl96