Linked-List没有malloc但是有另一种方法

时间:2016-12-12 14:40:37

标签: c arrays linked-list malloc

我有一项任务要求我使用链接列表来存储一些数据,但我只能使用<stdio.h>

我正在考虑使用数组,但是如果到达数组的末尾就无法扩展数组(我从这里读到它是不可能的:How can I change the size of an array in C?大约15分钟前。)

然后我想也许我会写malloc函数?但这对我来说很麻烦,因为我是C的新人。

另一个猜测是通过分配函数中的变量而不是返回来创建新节点。我在想如果我在函数中定义一个变量,每当我调用错误的函数时,它会为内存大小分配一个新的内存。

现在,我不知道该怎么做,我是否应该坚持允许使用<stdlib.h>?或者有没有办法或者我应该只使用带链表的数组?

2 个答案:

答案 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);
    }
}