帅哥,代码就算了吧,很长的,你可以去书店找《数据结构》严蔚敏的教材
我可以给你说一下其算法思路:
一般的讲,一个顺序队列一定要设计成顺序循环队列的数据结构,否则就会出现“假溢出”的现象。
假溢出是指,这样的溢出并不是由于存储空间不够而造成的,而是由于队列的队尾指针不能自动由所定义的最大值自动转为最小值(即由队尾转向队头)
防止假溢出的方法就是用“顺序循环队列”
假设对头指针是front,队尾指针是rear
那么让队尾指针+1就自动指向对头——这就是循环
这是靠%运算实现的:
(rear+1)%N==front , 其中N是存储空间的大小
那么在顺序循环队列中,如何判断“队列满”和“队列空”这两种状态呢?
一般的做法是,少用一个存储空间。这样的话:
队列空的条件:rear==front
队列满的条件:(rear+1)%N==front
你所说的只用对头指针实现顺序循环队列,我个人认为这样的实现似乎不现实且无意义,你想想什么是队列ne?不就是队头出队尾进吗?你连队尾指针都没有,每次插入数据都要通过遍历算法来遍历整个队列,这样的效率真是垃圾得可以,与其只用对头指针,还不如改用数组,你说呢??
还有,我看到你的补充了,你所说的计数器,其实质不就是队尾指针吗?对头指针永远指向对头,front+Count(Count是计数器值)不就是队尾指针的位置吗?所以计数器不就是换了种形式的队尾指针不是吗?
设顺序双向循环队列的数据结构定义为:
设Q为BSeqCQuene类变量,并设初始化 *** 作时有Q->rear=Q->front=0,要求:
(1)给出顺序双向循环队列满和空的条件;
(2)给出顺序双向循环队列抽象数据类型BSeqCQuene的入队和出队的 *** 作算法。
例题23分析
(1)对于正向循环队列,front为队头指针,rear为队尾指针,正向循环队列的数据元素下标值递增;对于反向循环队列,则rear为队头指针,front为队尾指针,反向循环队列的数据元素下标值递减。设计双向循环队列的方法类似于顺序循环队列的设计方法,即把表元素设计成首尾衔接。因此,有
正向循环队列:队列空的条件为Q->rear=Q->front
队列满的条件为(Q->rear+1)%MaxSize=Q->front
反向循环队列:队列空的条件为Q->rear=Q->front
队列满的条件为Q-> front -1=Q-> rear
(当Q->front-1<0时,令Q->front= MaxSize-1)
(2)算法思想:正向循环队列的入队和出队 *** 作算法与顺序循环队列的入队和出队 *** 作算法完全相同;反向循环队列的入队和出队 *** 作算法与顺序循环队列的入队和出队 *** 作算法思想类似,但要把rear看做是队头指针,把front看做是队尾指针,入队 *** 作且当front-1<0时,令front= MaxSize-1。其算法描述如下:
//定义队列结构体
typedef struct Qnode
{
int data;
struct Qnode next;
} Queue , QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
} linkQnode;
//创建一个队列
initQueue (linkQnode q)
{
q -> front = q -> rear = (QueuePtr) malloc (sizeof (Queue));
if (!q -> front) exit (0);
q -> front -> next = NULL;
}
//入队列
EnterQueue (linkQnode q , int item)
{
QueuePtr p;
p = (QueuePtr) malloc (sizeof (Queue));
if (!p) exit (0);
p -> data = item;
p -> next = NULL;
q -> rear -> next = p;
q -> rear = p;
}
//出队列
DelQueue (linkQnode q , int item)
{
QueuePtr p;
if (q -> front = q -> rear) return;
p = q -> front -> next;
item = p -> data;
q -> front -> next = p -> next;
if (q -> rear == p)
q -> rear = q -> front;
free (p);
}
for (i=CAN_recv_head,INC3(i);i!=CAN_recv_head;INC3(i)) 后面有没有;?
或者if(id3==CAN_recv_queue[i]) IRET //收到重复包 后面缺少{}?
如果for (i=CAN_recv_head,INC3(i);i!=CAN_recv_head;INC3(i)) 后面有;,
可能是进行队列遍历,等待外部中断,如果队列遍历一圈都没等到外部中断,就退出for语句,后面估计有延时错误处理,
如果for语句后面没有;,那就是和if语句一起的,则if语句后面可能缺少{},
那么for语句就是防止接收循环队列溢出
循环单链中尾指针执行一个命令:rear=rear->next; 不就成头指针了~
插入:
InserterList_Dul(DuLNode l,Datatype p,Datatype e)/将E元素插入到循环单链表L中的P指针所指的元素前面/
{
s=(struct DuLNode )malloc(sizeof(sturct DuLNode));/申请一个节点,让指针S指向它/
s->data=e; /将S送入新节点/
s->next=p;/使新节点的后继指针指向P/
s->prior=p->prior;/使新节点的前驱指针指向P的前驱指针/
p->prior->next=s;/使P的前驱节点的后继指针指向新节点/
p->prior=s;/使P的前驱指针指向新节点/
}
删除:
DeleteList_Dul(DulNOde l,DuLnode p) /删除循环单链表L中P指针所指的元素/
{
p->prior->next=p->next;/使P的前驱节点的后继指针指向P的后继节点/
p->next->prior=p->prior;/使P的后继节点的前向指针指向P的前驱节点/
free(p);/释放P所指被删除的节点/
}
以上就是关于如何只用队头指针实现顺序循环队列全部的内容,包括:如何只用队头指针实现顺序循环队列、我要交课程设计,最好详细点。。。。。。。谢谢了、c语言 队列的 *** 作等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)