Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 出列:用C语言从后面和前面放入、获取_List - Fatal编程技术网

List 出列:用C语言从后面和前面放入、获取

List 出列:用C语言从后面和前面放入、获取,list,List,我正在尝试使用链表进行出列,我可以从队列的前面或后面添加随机元素,并希望随机获取和删除它们。我的程序运行,但idk为什么,在某个地方它失败了。随机的它有分割错误,我找不到问题。这是我的密码: 我的职能: void dequeue_put_back(struct DeQueue *q, void *elem) { struct Node *n = new_node(elem, q->elem_size); if (q->head == NULL) {

我正在尝试使用链表进行出列,我可以从队列的前面或后面添加随机元素,并希望随机获取和删除它们。我的程序运行,但idk为什么,在某个地方它失败了。随机的它有分割错误,我找不到问题。这是我的密码:

我的职能:

void dequeue_put_back(struct DeQueue *q, void *elem)
{
        struct Node *n = new_node(elem, q->elem_size);

        if (q->head == NULL) {
                q->head = n;
        q->head->prev = NULL;
                q->tail = n;
        q->tail->prev = head;
        } else {
                q->tail->next = n;
        q->tail->prev = q->tail;
                q->tail = n;
        }

        q->n_elems++;
}

void dequeue_get_front(struct DeQueue *q, void *elem)
{
        memcpy(elem, q->head->elem, q->elem_size);
        struct Node *to_del = q->head;
        q->head = q->head->next;

        free_node(to_del);
    q->head->prev = NULL;
        q->n_elems--;
}

void dequeue_put_front(struct DeQueue *q, void *elem)
{
    struct Node *n = new_node(elem, q->elem_size);
    if (q->head == NULL) {
                q->head = n;
                q->tail = n;
        } else {
        n->next = q->head;
        q->head->prev = n;
        q->head = n;
    }

    q->n_elems++;
}

void dequeue_get_back(struct DeQueue *q, void *elem)
{
    memcpy(elem, q->tail->elem, q->elem_size);
    struct Node *to_del = q->tail;

    q->tail = q->tail->prev;
    free_node(to_del);

    q->n_elems--;
}
我的主要意见是:

int main(int argc, char **argv)
{
        srand(time(0));

        struct DeQueue *q = dequeue_new(sizeof(int));

        int t = 0;
        while (t++ < SIM_DURATION) {
                int action = rand() % 5;
                int r;

                switch (action) {
                case 0: // add random number to dequeue from back
                        r = rand() % 10;
                        dequeue_put_back(q, &r);
                        printf("t = %d: Adding %d to dequeue from its back, dequeue size = %d\n",
                               t, r, dequeue_size(q));
                        break;
                case 1: // get the next item from front
                        if (!dequeue_is_empty(q)) {
                                dequeue_get_front(q, &r);
                                printf("t = %d: Took %d from dequeue from its front, dequeue size = %d\n",
                                       t, r, dequeue_size(q));
                        } else {
                                printf("t = %d:\n", t);
                        }
                        break;
        case 2: // add random number to dequeue front
            r = rand() % 10;
                        dequeue_put_front(q, &r);
                        printf("t = %d: Adding %d to dequeue from its front, dequeue size = %d\n",
                               t, r, dequeue_size(q));
                        break;
        case 3: // get the next item from back
            if (!dequeue_is_empty(q)) {
                                dequeue_get_back(q, &r);
                                printf("t = %d: Took %d from dequeue from its back, dequeue size = %d\n",
                                       t, r, dequeue_size(q));
                        } else {
                                printf("t = %d:\n", t);
                        }
                        break;
                default:
                case 4: // do nothing
                        printf("t = %d:\n", t);
                        break;
                }

                fflush(stdout);
                sleep(1);
        }

        dequeue_free(q);

        return EXIT_SUCCESS;
}

在调试器中运行它。当它崩溃时,它应该打印出堆栈跟踪,告诉您它崩溃的代码行

t = 1:
t = 2:
t = 3: Adding 6 to dequeue from its front, dequeue size = 1
t = 4:
t = 5: Adding 7 to dequeue from its back, dequeue size = 2
t = 6: Adding 4 to dequeue from its back, dequeue size = 3
t = 7:
t = 8: Adding 8 to dequeue from its back, dequeue size = 4
t = 9: Adding 9 to dequeue from its front, dequeue size = 5
t = 10: Adding 1 to dequeue from its back, dequeue size = 6
t = 11: Took 1 from dequeue from its back, dequeue size = 5
Segmentation fault