2

我有一个设置长度的队列实现为一个动态c数组,如下所示:

typedef struct {
    float* queue;
    int size;
    int pointer;
} QueueStruct;

void createQueue(QueueStruct* queueInstance, int size){
    queueInstance->queue = malloc(sizeof(float)*size);
    queueInstance->size = size;
    queueInstance->pointer = 0;
}

void addElementToQueue(QueueStruct* queueInstance,float element){
    queueInstance->queue[pointer] = element;
    if (queueInstance->pointer == queueInstance.size - 1){
        queueInstance->pointer = 0;
    } else {
        ++queueInstance->pointer;
    }
}

void freeQueue(QueueStruct* queueInstance){
    free(queueInstance->queue);
}

我想实现这个功能:

float* returnQueue(QueueStruct queueInstance){
    //I want this function to malloc a new float* and then put the queue in it in the
    // correct order, from start to finish, as pointed too by the pointer.  
    //Im not sure how to do this.
}

任何帮助,将不胜感激。

编辑:更正了一个愚蠢的编程错误 - 这是我程序中实际内容的简化版本。

4

3 回答 3

2

让我们看看我是否正确。

float* returnQueue(QueueStruct *queueInstance){
    int j = 0;
    float *ret = malloc(sizeof(float)*queueInstance->size);  //Allocates the memory you want.
    //Copies the elements from pointer to End into the new buffer (assumes, that the array has been filled at least once, add a marker to make sure)
    if(queueInstance->FilledOnce) { //Marker variable, explanation as above.
        for(int i = queueInstance->pointer; i < queueInstance->size; ++i, ++j)
            ret[j] = queueInstance->queue[i];
    }
    //Copies the newest elements (from beginning to pointer) into the buffer.
    for(int i = 0; i < queueInstance->pointer; ++i, ++j)
        ret[j] = queueInstance->queue[i];
    return ret; //Returns the code in question.
}

要使此代码正常工作,您必须将“FilledOnce”添加到您的结构中,并修改您的“添加”代码,如下所示:

void addElementToQueue(QueueStruct* queueInstance, float element){
    queueInstance->queue[queueInstance->pointer] = element;
    if (queueInstance->pointer == queueInstance.size - 1){
        queueInstance->pointer = 0;
        queueInstance->FilledOnce = 1;
    } else {
        ++queueInstance->pointer;
    }
}

我还建议您在完成后重置变量。

void freeQueue(QueueStruct* queueInstance){
    free(queueInstance->queue);  //Frees the queue
    queueInstance->queue = NULL; //Nulls the reference
    queueInstance->FilledOnce = 0;
    queueInstance->pointer = 0;
    queueInstance->size = 0;
}

这样,如果您重用该结构,您将不会遇到尝试访问未分配内存的问题。请务必检查这些变量。

我希望这有帮助。

于 2012-08-30T12:17:19.237 回答
0

我认为你也应该为你的结构分配内存。您已经创建了结构指针,但忘记为该结构分配内存

使用 QueueStruct queuestruct= malloc(sizeof(Queuestruct))

然后当你将它传递给上面的任何函数时,你可以轻松地为队列指针分配内存,你可以在其中存储队列数组的元素

于 2012-08-30T12:24:12.587 回答
-1

这种实现是不够的。一个pointer变量给了我们队列尾部的位置,但是什么指向它的头部呢?

于 2012-08-30T12:17:21.957 回答