检查链表是否初始化

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;
}