我有一项任务要求我使用链接列表来存储一些数据,但我只能使用<stdio.h>
。
我正在考虑使用数组,但是如果到达数组的末尾就无法扩展数组(我从这里读到它是不可能的:How can I change the size of an array in C?大约15分钟前。)
然后我想也许我会写malloc
函数?但这对我来说很麻烦,因为我是C的新人。
另一个猜测是通过分配函数中的变量而不是返回来创建新节点。我在想如果我在函数中定义一个变量,每当我调用错误的函数时,它会为内存大小分配一个新的内存。
现在,我不知道该怎么做,我是否应该坚持允许使用<stdlib.h>
?或者有没有办法或者我应该只使用带链表的数组?
答案 0 :(得分:2)
由于您无法在堆上创建列表(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;
}
用于创建列表的相同想法可以应用于创建节点。
在管理此内存方面,您需要担心一些问题:
答案 1 :(得分:2)
开箱即用;)
#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: %c\n", head.data_array[0]);
fseek(fp, (unsigned int)head.next, SEEK_SET);
fread(&head, 1, sizeof(struct data_struct), fp);
}
}