问题是,当我调用函数initDeque
来创建deque时,函数必须检查deque是否已经初始化。我的想法是在deque的结构中有变量bool isInit
并检查isInit
是否为真(已启动)/ false(未启动)。但问题是,如果我多次调用initDeque
,它会再次启动deque。这是代码:
int initDeque(deque *d){ //Create new deque
d = (deque*)malloc(sizeof(deque));
if ((d->isInit)==false){
if (!d) {
perror("malloc");
exit(EXIT_FAILURE);
}
d->isInit=true;
d->front=NULL;
d->rear=NULL;
return d;
} else {
printf("Deque is already initialized!");
}
}
和结构:
typedef struct{
link front;
link rear;
bool isInit;
}deque;
我的想法是,当我首先分配内存时,会删除front; rear; isInit;
中存储的所有数据。我该怎么办?
答案 0 :(得分:1)
您可以尝试这样的事情:
deque* initDeque(deque *d){ //Create new deque
if(d == NULL){
d = (deque*)malloc(sizeof(deque));
d->isInit = false;
}
if ((d->isInit)==false){
if (!d) {
perror("malloc");
exit(EXIT_FAILURE);
}
d->isInit=true;
d->front=NULL;
d->rear=NULL;
} else
printf("Deque is already initialized!");
return d;
}
正如本文许多地方所提到的,这是一个奇怪的实现。
通常使用这种数据结构,你有create(),destroy(deque * d),queue(deque * d),dequeue(deque * d)函数。
在每个函数的顶部,您将进行NULL检查(创建除外)
答案 1 :(得分:1)
您应该在创建时初始化双端队列。没有必要重新初始化它。
deque * newDeque(){ //Create new deque
deque* d = malloc(sizeof(deque));
if (!d) {
perror("malloc");
exit(EXIT_FAILURE);
}
d->isInit=true; // not needed anymore
d->front=NULL;
d->rear=NULL;
return d;
}
如果你真的想要你的initDeque函数,这里有一个建议的实现
deque * initDeque(deque * d){ //Create new deque if needed
if (d == NULL) {
deque* d = malloc(sizeof(deque));
if (!d) {
perror("malloc");
exit(EXIT_FAILURE);
}
d->front=NULL;
d->rear=NULL;
}
return d;
}