Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.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
C++ 双链表停止工作_C++_Doubly Linked List - Fatal编程技术网

C++ 双链表停止工作

C++ 双链表停止工作,c++,doubly-linked-list,C++,Doubly Linked List,我尝试实现一个包含任务控制块(TCB)的双链接列表,每个任务控制块包含一个指向函数的指针和一个空指针。我运行我的程序没有使用循环,它工作正常。然而,当我使用for循环时,它停止工作。我的计划如下: #include <iostream> #include <stdlib.h> using namespace std; class TCB { public: void *data; TCB *next; TCB *prev; public:

我尝试实现一个包含任务控制块(TCB)的双链接列表,每个任务控制块包含一个指向函数的指针和一个空指针。我运行我的程序没有使用循环,它工作正常。然而,当我使用for循环时,它停止工作。我的计划如下:

#include <iostream>
#include <stdlib.h>

using namespace std;

class TCB {
public:
    void *data;
    TCB *next;
    TCB *prev;
public:
    void (*myTask)(void *);
};

typedef void (*task)(void *data);

class Queue {
public:
    TCB *head;
    TCB *tail;
    int numberOfElenments;
public:
    void QueueInsert(void *data, task myTask);
    void QueueRemove(TCB *task);
};

// Insert at tail
void Queue::QueueInsert(void *value, task myTask)
{
    TCB *newTask = (TCB*)calloc(1, sizeof(TCB));

    newTask->data = value;
    newTask->myTask = myTask;

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

    numberOfElenments++;
}

// Remove a particular node in queue
void Queue::QueueRemove(TCB *task)
{
    if(head == NULL) {
                // do nothing
    }

    if(task == head && task == tail) {
        head = NULL;
        tail = NULL;
    } else if(task == head) {
        head = task->next;
        head->prev = NULL;
    } else if(task == tail) {
        tail = task->prev;
        tail->next = NULL;
    } else {
        TCB *after = task->next;
        TCB *before = task->prev;
        after->prev = before;
        before->next = after;
    }

    numberOfElenments--;
    free(task);
}

void foo(void *data) {
    cout<<"Hello world!"<<endl;
}

void foo2(void *data) {
    cout<<"Hello, I am foo2!"<<endl;
}

int main(){
    Queue *q;
    q->QueueInsert(NULL, foo);
    q->QueueInsert(NULL, foo2);
    TCB *task;
    task = q->head;

    for(int i = 0; i < 2; i++) {
        task->myTask(task->data);
        task = task->next;
    }

    return 0;
}
#包括
#包括
使用名称空间std;
TCB类{
公众:
作废*数据;
TCB*下一步;
TCB*prev;
公众:
作废(*myTask)(作废*);
};
typedef void(*任务)(void*数据);
类队列{
公众:
TCB*头;
TCB*尾部;
整数个元素;
公众:
void QueueInsert(void*数据,任务myTask);
无效队列删除(TCB*任务);
};
//插入尾部
void Queue::QueueInsert(void*值,任务myTask)
{
TCB*newTask=(TCB*)calloc(1,sizeof(TCB));
新任务->数据=值;
newTask->myTask=myTask;
if(head==NULL){
头=新任务;
尾=新任务;
}否则{
tail->next=newTask;
newTask->prev=尾部;
尾=新任务;
}
元素数++;
}
//删除队列中的特定节点
无效队列::队列删除(TCB*任务)
{
if(head==NULL){
//无所事事
}
如果(任务==头部和任务==尾部){
head=NULL;
tail=NULL;
}else if(任务==头){
头=任务->下一步;
head->prev=NULL;
}else if(任务==尾部){
尾部=任务->上一步;
tail->next=NULL;
}否则{
TCB*after=任务->下一步;
TCB*before=task->prev;
后->前=前;
之前->下一步=之后;
}
元素数--;
免费(任务);
}
void foo(void*数据){
库特
您的队列指向垃圾内存地址,您需要实例化一个对象:

 Queue *q = new Queue();
或者更好,在堆栈上分配它

 Queue q;
“我的程序有什么问题?”——大多数情况下,你几乎不使用C++。为什么你认为你需要自制容器类?然后把它标记为答案:(V以下的分数)
 Queue q;