对于使用c实现的链表队列,我的入队列和出队列有点问题。我的老师说模板是禁止使用的,我不能改变他给我们的公共和私人功能。我总是遇到一个分割错误。我真的不明白我做错了什么。我还包括了header、enqueue和dequeue函数。
const int MAX_STRING = 6;
typedef char Element300[MAX_STRING + 1];
class Queue300
{
public:
Queue300();
Queue300(Queue300&);
~Queue300();
void enQueue300(const Element300);
void deQueue300(Element300);
void view300();
private:
struct Node300;
typedef Node300 * NodePtr300;
struct Node300
{
Element300 element;
NodePtr300 next;
};
NodePtr300 front, rear;
};
void Queue300::enQueue300(const Element300 input)
{
NodePtr300 temp = NULL;
temp = new (std::nothrow) Node300;
if (temp == NULL)
{
cerr << "The queue is full, could not add(enqueue) any more elements." << endl;
}
else if (front == NULL && rear == NULL)
{
strcpy(temp->element, input);
rear = temp;
rear->next = NULL;
front = rear;
temp = NULL;
}
else
{
strcpy(temp->element, input);
temp = rear->next;
rear = temp;
rear->next = NULL;
temp = NULL;
}
}
void Queue300::deQueue300(Element300 input)
{
NodePtr300 temp = NULL;
if (rear == NULL && front == NULL)
{
cerr << "The queue is already empty, could not delete(dequeue) any more elements." << endl;
}
else if (front == rear)
{
strcpy(temp->element, input);
temp = front;
delete temp;
temp = NULL;
front = NULL;
rear = NULL;
}
else
{
strcpy(temp->element, input);
temp = front;
front = front->next;
temp->next = NULL;
delete temp;
temp = NULL;
}
}
让我们来看看Enqueue:
if (temp == NULL)
{
...
}
else if (front == NULL && rear == NULL)
{
...
}
else
{
strcpy(temp->element, input); // copy input into temp->element
// temp points to rear->next (it is always NULL, isn't it?)
// we lost the Node300 previously pointed by temp.
temp = rear->next;
// rear points to the same location as temp (NULL)
rear = temp;
// rear->next: dereferencing NULL /!\
rear->next = NULL;
temp = NULL;
}
ASCII艺术时间。这是在加入之前:
REAR -------------------
|
v
[0]--> ... -->[N]-->NULL
^
FRONT ---|
您分配一个节点[X]
,由temp
引用:
temp --> [X]
REAR的下一个必须指向同一个节点:
REAR
|
v
[N] --> [X]
^
|
temp
然后,后部必须更新为参考[X]
。就指针操作而言,您甚至不需要temp
指针,但让我们保留它,因为您正在检查之前是否正确分配了节点,这很好。
rear->next = temp;
rear = temp; // or rear = rear->next;
temp->next = NULL; // or rear->next = NULL;
还要注意,您执行的是strcpy(temp-
在排队中,当您说“temp=rear”时-
将新节点添加到链接列表中时,通常最好先在新节点中设置指针:
temp->next = null;
rear->next = temp;
rear=temp;
还有:
>
出列的strcpy走错了路
为了防止缓冲区溢出,您应该真正使用strncpy而不是strcpy,然后确保目标以null结尾,因为元素应该是字符串
我使用的参考资料如下: 出于效率考虑,我们选择队列的前面位于列表的开头,队列的后面位于列表的末尾。这样,我们从头部移除,并在尾部插入。 我想知道为什么在头部插入并在尾巴上移除会不好?这是因为在单链表中,删除尾节点并不容易,因为您必须访问之前的节点,而在单链表中执行此操作的唯一方法是从头开始?
我有一个简单的场景,有两个线程,第一个线程永久读取一些数据,并将这些数据排入队列。第二个线程首先从队列中查看单个对象,并进行一些条件检查。如果这些都是好的,单个对象将被出列并传递给一些处理。 我尝试过使用< code>ConcurrentQueue,这是一个简单队列的线程安全实现,但是这个队列的问题是所有调用都被阻塞了。这意味着,如果第一个线程正在将一个对象入队,第二个线程就不能查看对象或将其出队
我很难理解linkedlist队列的enqueue方法的代码。我理解dequeue()、isEmpty()、First()和size()。首先,这里有一个LinearNode类来创建新的节点对象: 下面是Enqueue方法 在此编辑包含Enqueue方法的LinkQueue类:
我得到了这些结构声明,以便实现使用循环链表的队列集合。 我试图创建一个函数,它将以指定的值排队(将其追加到队列的后面),我需要考虑队列为空和队列有一个或多个元素的两种情况。这是我到目前为止的代码: 这段代码给了我一个运行时错误,所以我不确定出了什么问题。在代码中,我假设队列-
我有一个通用的链表,目前由int组成,我想在默认情况下按升序排序,然后切换一个布尔值,按降序排序。我该怎么做?
说明 获取当前所有排队号码列表 请求地址 http://api.dc78.cn/Api/wwlist 请求方式 GET 请求参数 URL参数 描述 无 POST参数 描述 无 返回 { "status": 1, "name": "凤凰广场店", "list": [ { "id": "8", "time": "2014-11-26 11:42:12", "type": "C", "num": "C0