C中链表内的动态数组
Dynamic array inside a linked list in C
经过数小时的疯狂思考,我正在写这篇文章 post。这可能是您今天要阅读的最愚蠢的练习,但对我来说,经过几个小时的练习,情况并非如此。
回到问题。我的教授要求在链表中分配一个动态数组。这一点并不难。我写了结构并定义了两种类型。
接下来就是写2个函数:
- 第一个,称为 init,创建列表的一个新元素,使用 n 整数分配数组,然后 returns 它到 main;
- 显示数组内部内容的打印函数。
代码看起来像那样。
#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);
}
}
经过数小时的疯狂思考,我正在写这篇文章 post。这可能是您今天要阅读的最愚蠢的练习,但对我来说,经过几个小时的练习,情况并非如此。
回到问题。我的教授要求在链表中分配一个动态数组。这一点并不难。我写了结构并定义了两种类型。 接下来就是写2个函数:
- 第一个,称为 init,创建列表的一个新元素,使用 n 整数分配数组,然后 returns 它到 main;
- 显示数组内部内容的打印函数。
代码看起来像那样。
#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);
}
}