循环单链中尾指针执行一个命令: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所指被删除的节点/
}
帅哥,代码就算了吧,很长的,你可以去书店找《数据结构》严蔚敏的教材
我可以给你说一下其算法思路:
一般的讲,一个顺序队列一定要设计成顺序循环队列的数据结构,否则就会出现“假溢出”的现象。
假溢出是指,这样的溢出并不是由于存储空间不够而造成的,而是由于队列的队尾指针不能自动由所定义的最大值自动转为最小值(即由队尾转向队头)
防止假溢出的方法就是用“顺序循环队列”
假设对头指针是front,队尾指针是rear
那么让队尾指针+1就自动指向对头——这就是循环
这是靠%运算实现的:
(rear+1)%N==front , 其中N是存储空间的大小
那么在顺序循环队列中,如何判断“队列满”和“队列空”这两种状态呢?
一般的做法是,少用一个存储空间。这样的话:
队列空的条件:rear==front
队列满的条件:(rear+1)%N==front
你所说的只用对头指针实现顺序循环队列,我个人认为这样的实现似乎不现实且无意义,你想想什么是队列ne?不就是队头出队尾进吗?你连队尾指针都没有,每次插入数据都要通过遍历算法来遍历整个队列,这样的效率真是垃圾得可以,与其只用对头指针,还不如改用数组,你说呢??
还有,我看到你的补充了,你所说的计数器,其实质不就是队尾指针吗?对头指针永远指向对头,front+Count(Count是计数器值)不就是队尾指针的位置吗?所以计数器不就是换了种形式的队尾指针不是吗?
以上就是关于数据结构如果一个循环单链表示队列(循环队列),编写程序实现循环队列的插入和删除全部的内容,包括:数据结构如果一个循环单链表示队列(循环队列),编写程序实现循环队列的插入和删除、如何只用队头指针实现顺序循环队列、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)