C中链表内的动态数组

Dynamic array inside a linked list in C

经过数小时的疯狂思考,我正在写这篇文章 post。这可能是您今天要阅读的最愚蠢的练习,但对我来说,经过几个小时的练习,情况并非如此。

回到问题。我的教授要求在链表中分配一个动态数组。这一点并不难。我写了结构并定义了两种类型。 接下来就是写2个函数:

  1. 第一个,称为 init,创建列表的一个新元素,使用 n 整数分配数组,然后 returns 它到 main;
  2. 显示数组内部内容的打印函数。

代码看起来像那样。

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

struct elements{
    int  *array;
    int size;
    struct elements* next; 
};
typedef struct elements elementOfList; 
typedef elementOfList* ListOfElements;

ListOfElements init(int n){
    ListOfElements new;
    new->array = malloc(sizeof(int)*n);
    for(int i = 0; i < n; i++)  new->array[i] = 0;
    new->size = n;
    new->next = NULL;
    return new;
}

void print_list(ListOfElements list){
    if(list == NULL) return;

    printf("%d",list->size);
    print_list(list->next);
}

int main(){

    ListOfElements list = init(4);
    print_list(list);
    // -> n = 4 | 0, 0, 0, 0,

    list->next = init(12);
    print_list(list);
    // -> n = 4 | 0, 0, 0, 0,
    // -> n = 12 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, %

    return 0;
}

如您所见,将“listOfElements”返回到 main 让我遇到了麻烦。在这一点上,我想我搞砸了很多事情。该算法在第二次打印时进入循环。第一个阵列的打印没问题,但第二个……该死…… (我知道我实际上不打印数组。我打印数组的大小只是为了让它现在更具可读性)。

我认为我的错误与“init”函数有关。出了点问题,我不明白哪里出了问题。我希望有人可以帮助我,甚至向我建议对程序进行一些修复。

在我等待有人阅读这篇文章的同时post我会尝试把我的程序在做什么该死的事情写在纸上。

感谢您的关注,祝您有愉快的一天。

函数 init 应分配类型为 elementOfList

的对象
ListOfElements init(int n)
{
    ListOfElements new = malloc( sizeof( *new ) );
    
    if ( new != NULL )
    {
        new->array = malloc( n * sizeof( int ) );

        if ( new->array == NULL ) n = 0;

        new->size = n;
        for ( int i = 0; i < n; i++ )  new->array[i] = 0;
        // or you can use memset instead of the for loop

        new->next = NULL;   
    }

    return new;
}

和函数 print_list 应该输出内部数组的元素。例如

void print_list(ListOfElements list)
{
    if ( list != NULL )
    {
        printf("-> %d | ",list->size);
      
        for ( int i = 0; i < list->size; i++ )
        {
            if ( i != 0 ) printf( ", " ); 
            printf( "%d", list->array[i] );
        }

        putchar( '\n' );

        print_list(list->next);
    }
}