[英]Circular Doubly Linked List End Function
在bool end()函数中,程序将知道前哨是开始还是结束? 我是否可以进行检查以确保其最终读取了前哨?
#include "ring.h"
#include <stdlib.h>
#include <stdio.h>
struct node {
int item;
struct node *prev;
struct node *next;
};
typedef struct node node;
struct ring {
node *sentinel;
node *current;
};
ring *new_ring() {
ring *p;
node *n;
p = (ring *) malloc (sizeof(ring));
n = malloc(sizeof(node));
p->sentinel = n;
n->next = n;
n->prev = n;
return p;
}
void start(ring *r) {
r->current = r->sentinel;
}
bool end(ring *r) {
return r->current == r->sentinel;
}
void forward(ring *r) {
while (r->current != r->sentinel) {
r->current = r->current->next;
}
}
您的规格是:
start()
,您有current == sentinel
,所以forward
什么都不做!) 但是您应该回答这个问题:是否需要实现对称功能?
如果答案是否定的,则只需更改sentinel->next
上的开始位置,即如果ring的第一个元素存在(如果存在),然后更改到end(如果环为空),就可以了。
如果答案是肯定的,那么你必须要能够前未区分一方面,和过去的另一端 。
有两种简单的方法:
使用布尔值来区分:
struct ring { node *sentinel; node *current; bool end; };
您只需设置end
,以true
当你直接过去时的结束位置forward
(或任何其它读取功能)进入过去的结束,并真正在相反的情况。
使用2个前哨
struct ring { node *before; node *after; node *current; };
您应该使用before->next = after;
来初始化它们before->next = after;
和after->prev = before
据我了解,您需要使用end函数来确定这是环的最后一个节点还是起点。
您可以修改您的end函数,使其看起来像这样。
bool end(ring *r) {
return r->current->next == r->sentinel;
}
如果环中只有一个元素,则始终在启动函数之后,终止条件为true。
但是,如果有多个元素,那么一旦end返回true,r-> current将成为前哨之前的最后一个元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.