繁体   English   中英

C中的指针N链表

[英]pointers N linked list in C

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

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

您的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);
    }
}

您没有将堆内存分配给您创建的“链接”列表。 我认为将元素添加到链表时应该在堆上分配内存。 链表变量'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

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的指针指向已移除该项目。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM