C 循环双链表结束函数
在bool end()函数中,程序是否知道sentinel是开始还是结束?我能做个检查,确保它读到了《哨兵》的结尾吗C 循环双链表结束函数,c,linked-list,c99,sentinel,C,Linked List,C99,Sentinel,在bool end()函数中,程序是否知道sentinel是开始还是结束?我能做个检查,确保它读到了《哨兵》的结尾吗 #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 *s
#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;
}
}
#包括“ring.h”
#包括
#包括
结构节点{
国际项目;
结构节点*prev;
结构节点*下一步;
};
typedef结构节点;
结构环{
节点*哨兵;
节点*电流;
};
环*新环(){
环*p;
节点*n;
p=(环*)malloc(环的大小);
n=malloc(sizeof(node));
p->sentinel=n;
n->next=n;
n->prev=n;
返回p;
}
无效开始(环*r){
r->current=r->sentinel;
}
bool端(环*r){
返回r->current==r->sentinel;
}
无效前进(环*r){
而(r->current!=r->sentinel){
r->current=r->current->next;
}
}
您的规格是:
- 环第一个元件前的起始位置(正常)
- 如果电流超过最后一个元件(ok),则结束测试
- 向前移动环上的一个元素(好的,除非在调用
之后,您有start()
,所以current==sentinel
什么也不做!)向前移动
sentinel->next
上将start更改为位置,即如果环存在,则更改为环的第一个元素,如果环为空,则更改为结束,并且您的操作已完成
如果答案是肯定的,那么你必须能够一方面区分之前,另一方面区分过去
有两种简单的方法:
- 使用布尔值来区分:
当struct ring { node *sentinel; node *current; bool end; };
(或任何其他读取功能)经过末端时,当定位直接超过末端时,您只需将forward
设置为end
,在相反的情况下设置为truetrue
- 使用2个哨兵
您应该使用struct ring { node *before; node *after; node *current; };
before->next=after初始化它们代码>和
之后->之前=之前
bool end(ring *r) {
return r->current->next == r->sentinel;
}
如果环中只有一个元素,则始终在开始函数之后,结束条件将为真
但是,如果有多个元素,那么一旦end返回true,r->current将是sentinel之前的最后一个元素。请更详细地描述循环列表的工作原理。sentinel的具体作用是什么?其目的是允许第一个和最后一个节点指向它,以便在任何地方都没有空指针,因此没有针对空的特殊情况测试。当列表为空时,它只包含sentinel节点,该节点向前和向后指向自身。由于使用bool,您需要在ring.h头文件中包含stdbool.h,但谢谢!他们说。