Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 循环双链表结束函数_C_Linked List_C99_Sentinel - Fatal编程技术网

C 循环双链表结束函数

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

在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 *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
    设置为
    true
    ,在相反的情况下设置为true

  • 使用2个哨兵

    struct ring {
      node *before;
      node *after;
      node *current;
    };
    
    您应该使用
    before->next=after初始化它们
    之后->之前=之前


据我所知,您需要使用end函数来确定这是环的最后一个节点还是开始

您可以修改end函数,使其看起来像这样

bool end(ring *r) {
    return r->current->next == r->sentinel;
}
如果环中只有一个元素,则始终在开始函数之后,结束条件将为真


但是,如果有多个元素,那么一旦end返回true,r->current将是sentinel之前的最后一个元素。

请更详细地描述循环列表的工作原理。sentinel的具体作用是什么?其目的是允许第一个和最后一个节点指向它,以便在任何地方都没有空指针,因此没有针对空的特殊情况测试。当列表为空时,它只包含sentinel节点,该节点向前和向后指向自身。由于使用bool,您需要在ring.h头文件中包含stdbool.h,但谢谢!他们说。