假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾结点,但不设头指针。试设计相应的入队和出队算法。
时间: 2024-04-30 09:05:57 浏览: 156
入队算法:
1. 新建一个待插入的结点P;
2. 若队列为空,则将队尾指针指向P,并将P的下一个结点设为P;
3. 否则,将P的下一个结点设为队尾指针的下一个结点,再将队尾指针的下一个结点设为P,最后将队尾指针指向P。
出队算法:
1. 若队列为空,则提示空队列;
2. 否则,将队头指针指向队头指针的下一个结点;
3. 若队头指针指向队尾指针的下一个结点,则将队尾指针指向队头指针的下一个结点,以保证队列为空时,队尾指针指向队头指针。
关于前面对话的提醒,我有一个笑话:为什么有些人总是在麻烦之外寻找麻烦呢?因为他们喜欢自找麻烦。
相关问题
假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点
这种队列的实现方式比较特殊,因为它是基于循环链表的。循环链表是一种特殊的链表,它的最后一个结点指向第一个结点,形成一个环形结构。而带头结点的循环链表则是在普通循环链表的基础上,增加了一个头结点,用来方便链表的操作。
在这种队列中,我们只需要一个指针来指向队尾元素结点。当队列为空时,这个指针指向头结点。当队列不为空时,这个指针指向队列中最后一个元素的结点。每次入队操作时,我们只需要将新元素插入到队尾元素结点的后面即可。而出队操作则是删除头结点的后继结点。
需要注意的是,由于这是一个循环链表,所以队列的长度是可以无限增长的。因此,在实际应用中,我们需要限制队列的最大长度,以避免内存溢出等问题。
假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾结点,但不设头指针。试设计相应的置队列空、入队列和出队列的算法。
好的,根据你的要求,我不会透露你的任何信息。下面是算法实现:
1. 置队列空算法:
```
void InitQueue(LinkQueue &Q) {
Q.rear = (LinkQueuePtr)malloc(sizeof(QNode));
Q.rear->next = Q.rear;
}
```
2. 入队列算法:
```
void EnQueue(LinkQueue &Q, ElemType e) {
LinkQueuePtr p = (LinkQueuePtr)malloc(sizeof(QNode));
p->data = e;
p->next = Q.rear->next;
Q.rear->next = p;
Q.rear = p;
}
```
3. 出队列算法:
```
bool DeQueue(LinkQueue &Q, ElemType &e) {
if (Q.rear == Q.rear->next) {
return false;
}
LinkQueuePtr p = Q.rear->next->next;
e = p->data;
Q.rear->next->next = p->next;
if (Q.rear == p) {
Q.rear = Q.rear->next;
}
free(p);
return true;
}
```
其中,LinkQueue 是队列的类型,LinkQueuePtr 是指向队列结点的指针类型,QNode 是队列结点的结构体类型,ElemType 是队列元素的数据类型。
阅读全文
相关推荐
















