如何在保留旧内容的同时将动态数组的大小加倍

时间:2017-10-07 05:34:20

标签: c

对于我的C数据结构赋值的一部分,我的任务是获取指向2个双向链表的节点的数组(一个表示主服务队列,另一个表示"存储桶" of蜂鸣器准备好在队列中第一次重复使用或使用,大小加倍,同时保持原始内容。该想法是每个节点具有与指针阵列映射的数字索引相对应的ID。因此,例如,索引3中的指针将始终指向ID为3的节点。布尔inQ用于与此问题无关的内容。

我编写了大部分代码,但它似乎运行不正确(它在数组调整大小之前将所有原始指针更改为列表中的最后一个节点)因此,因为数组的起始大小是10个元素,当我在功能后打印出内容时,显示9 9 9 9 9 9 9 9 9 9.

以下是我使用的结构:

typedef struct node {
int id;
int inQ;
struct node *next;
struct node *prev;
}NODE;

typedef struct list
{
NODE *front;
NODE *back;
int size;
} LIST;

//referred to as SQ in the separate header file
struct service_queue
{
LIST *queue;
LIST *bucket;
NODE **arr;
int arrSize;
int maxID;
};

这是有问题的功能:

SQ  sq_double_array(SQ *q)
{
NODE **arr2 = malloc(q->arrSize * 2 * sizeof(NODE*));
int i;

//fill the first half of the new array with the node pointers of the first array
for (i = 0; i < q->arrSize; i++)
{
    arr2[i] = malloc(sizeof(NODE));
    if (i > 0)
    {
        arr2[i - 1]->next = arr2[i];
        arr2[i]->prev = arr2[i - 1];
    }
    arr2[i]->id = q->arr[i]->id;
    arr2[i]->inQ = q->arr[i]->inQ;
    arr2[i]->next = q->arr[i]->next;
    arr2[i]->prev = q->arr[i]->prev;
}

//fill the second half with node pointers to the new nodes and place them into the bucket
for (i = q->arrSize; i < q->arrSize * 2; i++)
{
    //Point the array elements equal to empty nodes, corresponding to the inidicies
    arr2[i] = malloc(sizeof(NODE));
    arr2[i]->id = i;
    arr2[i]->inQ = 0;

    //If the bucket is empty (first pass)
    if (q->bucket->front == NULL)
    {
        q->bucket->front = arr2[i];
        arr2[i]->prev = NULL;
        arr2[i]->next = NULL;
        q->bucket->back = arr2[i];
    }

    //If the bucket has at least 1 buzzer in it
    else
    {
        q->bucket->back = malloc(sizeof(NODE));
        q->bucket->back->next = arr2[i];
        q->bucket->back = arr2[i];
        q->bucket->back->next = NULL;
    }
}
q->arrSize *= 2;
q->arr = arr2;
return *q;
}

请记住,这必须只在c中完成,这就是为什么我不使用&#39; new&#39;

1 个答案:

答案 0 :(得分:3)

您可以使用realloc功能:

void *realloc(void *ptr, size_t size);

引自手册页:

  

realloc()函数改变指向的内存块的大小   通过ptr来调整字节大小。该          内容将在从区域开始到最小区域的范围内保持不变          和新的尺寸。如果新尺寸大于旧尺寸,则添加的内存不会是初始尺寸 -          化的。如果ptr为NULL,则对于所有size值,调用等效于malloc(size);如果          size等于零,而ptr不为NULL,则调用等效于free(ptr)。除非ptr          为NULL,它必须由之前调用malloc(),calloc()或realloc()返回。如果          指向的区域被移动,自由(ptr)完成。