我有一个作业要求我使用链接列表来存储一些数据,但是我只能使用 <stdio.h>
。
我正在考虑使用数组,但是在到达数组末端的情况下不可能扩展数组(我从这里不可能阅读:如何更改C中的数组大小?15分钟前)。
然后我以为也许我写了malloc
功能?但这对我来说很麻烦,因为我是新来的
另一个猜测是思考通过分配给函数中的变量而不是返回来创建新节点。我在想,如果我在函数中定义一个变量,它将在每次调用错误的函数时分配一个足够大的内存。
。现在,我不知道该怎么办,我应该坚持使用<stdlib.h>
吗?还是有一种方法,或者我应该只使用链接列表的数组?
由于您无法在堆(malloc,calloc等)上创建列表,因此您必须在列表结构中内部声明您的内存要求并在内部内部管理该内存。
我会让你开始。
#define LIST_MEM_POOL 1024
#define NODE_MEM_POOL 1024
typedef struct {
int item; /* Assuming you are storing integers in the linked list */
struct Node *next;
} Node, *Pnode;
typedef struct {
struct Node *head; /* Assuming singly linked list */
int size;
} List, *Plist;
static List list_memory[LIST_MEM_POOL];
static Node node_memory[NODE_MEM_POOL];
static int used_lists = 0, free_lists = LIST_MEM_POOL;
static int used_nodes = 0, free_nodes = NODE_MEM_POOL;
Plist create_list(void) {
Plist l = 0;
if (used_lists < free_lists) {
l = &list_memory[used_lists++];
l->size = 0;
l->head = 0;
}
return l;
}
使用用于创建列表的相同想法可以应用于创建节点。
您需要在管理此内存方面需要担心一些问题:
- 您将如何处理免费内存?
- 如果某人创建两个列表,将第一个列表释放,将会发生什么,然后试图创建一个新列表?
- 当某人试图创建列表而没有内存的是什么时候会发生什么可用?
从开箱即用;)
#include <stdio.h>
#define N 0x20
struct data_struct
{
char data_array[1];
struct data_struct *next;
};
int main()
{
FILE * fp;
unsigned int i;
static struct data_struct head = {0};
static struct data_struct tmp = {0};
fp = fopen("file.dat", "w+");
head.data_array[0] = 'A';
head.next = (struct data_struct *)(ftell(fp) + sizeof(struct data_struct));
fwrite(&head, 1, sizeof(struct data_struct), fp);
for(i = 0; i < N; i++) {
tmp.data_array[0] = 'B' + i;
tmp.next = (struct data_struct *)(ftell(fp) + sizeof(struct data_struct));
fwrite(&tmp, 1, sizeof(struct data_struct), fp);
}
fseek(fp, 0, SEEK_SET);
fread(&head, 1, sizeof(struct data_struct), fp);
for(i = 0; i < N; i++) {
printf("data_array: %cn", head.data_array[0]);
fseek(fp, (unsigned int)head.next, SEEK_SET);
fread(&head, 1, sizeof(struct data_struct), fp);
}
}