检查链表是否初始化
Check if linked list was initialized
问题是,当我调用函数 initDeque
来创建双端队列时,函数必须检查双端队列是否已经初始化。我的想法是在 deque 的结构中有变量 bool isInit
并检查 isInit
是否为真(已启动)/假(未启动)。但问题是,如果我多次调用 initDeque
,它会再次启动双端队列。这是代码:
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;
中的所有数据。我该怎么办?
您可以尝试这样的操作:
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;
}
正如在这个 post 的许多地方提到的,这是一个奇怪的实现。
通常,对于这种数据结构,您会有 create()、destroy(deque *d)、queue(deque *d)、dequeue(deque *d) 函数。
在每个函数的顶部都有一个 NULL 检查(创建除外)
您应该在创建双端队列时对其进行初始化。无需重新初始化它。
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;
}
问题是,当我调用函数 initDeque
来创建双端队列时,函数必须检查双端队列是否已经初始化。我的想法是在 deque 的结构中有变量 bool isInit
并检查 isInit
是否为真(已启动)/假(未启动)。但问题是,如果我多次调用 initDeque
,它会再次启动双端队列。这是代码:
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;
中的所有数据。我该怎么办?
您可以尝试这样的操作:
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;
}
正如在这个 post 的许多地方提到的,这是一个奇怪的实现。
通常,对于这种数据结构,您会有 create()、destroy(deque *d)、queue(deque *d)、dequeue(deque *d) 函数。
在每个函数的顶部都有一个 NULL 检查(创建除外)
您应该在创建双端队列时对其进行初始化。无需重新初始化它。
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;
}