指针C中的N个链表

时间:2014-02-13 18:25:30

标签: c pointers linked-list

我写了下面的代码,它不起作用。应用程序在打印方法上崩溃。 知道哪里出错了吗?

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    int item;
    struct LinkedList *Next;
} LinkedList;

int main()
{
    LinkedList vaz;
    vaz.item = 14123;
    vaz.Next = 0;
    add(&vaz,123);
    add(&vaz,9223);
    Print(&vaz);
    return 0;
}
void Print(LinkedList* Val)
{
    if(Val != 0){
        printf("%i\n",(*Val).item);
        Print((*Val).Next);
    }
}
void add(LinkedList *Head, int value)
{
    if((*Head).Next == 0 )
    {
        LinkedList sab;
        sab.item = value;
        sab.Next = 0;
        (*Head).Next = &sab;
    }
    else{
       add((*Head).Next,value);
    }
}

4 个答案:

答案 0 :(得分:2)

你的add方法应该动态分配内存,你正在使用自动分配(局部变量),当你“离开”这个函数时它会被释放。当您稍后尝试访问此内存时,这将导致未定义的行为。

void add(LinkedList *Head, int value)
{
    if((*Head).Next == 0 )
    {
        LinkedList sab; <-- need to be allocated dynamically
        sab.item = value;
        sab.Next = 0;
        (*Head).Next = &sab;
    }
    else{
       add((*Head).Next,value);
    }
}

答案 1 :(得分:1)

您没有将堆内存分配给您创建的链接列表。我认为在向链表添加元素时应该在堆上分配内存。链表变量'sab'是方法的本地变量,因此一旦函数超出范围,内存就会被释放。

要添加元素,您需要执行以下操作:

LinkedList *sab = (struct LinkedList*) malloc (sizeof(struct LinkedList));
if( sab != NULL )
{
    sab->item = value;
    sab->next = NULL;
}

有关详细信息,请参阅:http://www.cprogramming.com/snippets/source-code/singly-linked-list-insert-remove-add-count

答案 2 :(得分:1)

add应按如下方式动态分配内存:

void add(LinkedList *Head, int value)
{
    if (Head == NULL)
        return;

    if((*Head).Next == NULL )
    {
        LinkedList *sab = malloc(sizeof(LinkedList));

        if ( sab == NULL ) {
            // Error: ran out of memory (really shouldn't happen, but could)
            return;
        }

        (*sab).item = value;
        (*sab).Next = NULL;
        (*Head).Next = sab;
    }
    else{
       add((*Head).Next,value);
    }
}

此外,在这种情况下,递归调用是“过度杀伤”。一个简单的循环就足够了:

void add(LinkedList *Head, int value)
{
    if (Head == NULL)
        return;

    while ((*Head).Next != NULL)
        Head = (*Head).Next;

    LinkedList *sab = malloc(sizeof(LinkedList));

    if ( sab == NULL ) {
        // Error: ran out of memory (really shouldn't happen, but could)
        return;
    }

    (*sab).item = value;
    (*sab).Next = NULL;
    (*Head).Next = sab;
}

我同样避免了递归的打印调用:

void Print(LinkedList* Val)
{
    while (Val != NULL) {
        printf("%i\n", (*Val).item);
        Val = (*Val).Next;
    }
}

如果您有一个从列表中删除项目的函数,则需要确保在指向该项目的指针上执行free

答案 3 :(得分:1)

您的LinkedList *Head没有任何内存首先为其分配内存,如下所示 -

LinkedList *Head = (struct LinkedList*)malloc(sizeof(struct LinkedList));