检查链表是否已初始化

时间:2015-03-20 13:51:41

标签: c linked-list deque

问题是,当我调用函数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;中存储的所有数据。我该怎么办?

2 个答案:

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