Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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 - Fatal编程技术网

C 关于链表的第一个和最后一个元素的混淆

C 关于链表的第一个和最后一个元素的混淆,c,linked-list,C,Linked List,我不知道我们是在链表的前面还是后面添加元素。让我们假设我们有一个如下的链表:x->a->c->v;这里,x是第一个元素还是最后一个元素?其次,如果我想添加x->a->c->v->h或h->x->a->c->v,该怎么办?当我遇到以下问题时,我感到困惑: 考虑实现循环单链表数据结构。假设循环链表的指针ptr指向其link字段指向链表第一个节点的最后一个节点。完成下面指定的add(…)和delete(…)算法。您可以用伪代码或C代码编写。假设链表节点结构具有以下声明: typedef struct

我不知道我们是在链表的前面还是后面添加元素。让我们假设我们有一个如下的链表:
x->a->c->v
;这里,
x
是第一个元素还是最后一个元素?其次,如果我想添加
x->a->c->v->h
h->x->a->c->v
,该怎么办?当我遇到以下问题时,我感到困惑:

考虑实现循环单链表数据结构。假设循环链表的指针
ptr
指向其
link
字段指向链表第一个节点的最后一个节点。完成下面指定的
add(…)
delete(…)
算法。您可以用伪代码或C代码编写。假设链表节点结构具有以下声明:

typedef struct list_node* list_pointer;
typedef struct list_node {
     int value;
     list_pointer link;
}

list_pointer ptr = NULL;
请注意,如果循环链表为空,则其指针
ptr
将设置为
NULL

// Add node at the front of the circular list ptr; ptr points at the last node in the list
void add(list_pointer *ptr, list_pointer node) { ... }

// Delete the front node from the list ptr
list_node delete(list_pointer *ptr) { ... }

第一个元素是
x
,因为如果沿着
next
指针链遍历列表,那么这是第一个元素


添加到链接列表时,可以在第一个元素之前或最后一个元素之后添加。在第一个元素之前添加更有效,因为您不必遵循整个
next
指针链来查找结尾

第一个元素是
x
,因为如果您沿着
next
指针链遍历列表,那么这是第一个元素


添加到链接列表时,可以在第一个元素之前或最后一个元素之后添加。在第一个元素之前添加更有效,因为您不必遵循整个
next
指针链来查找结尾

您可以选择自己列表的方向。通常通过将指向上一个和下一个节点的指针命名为“上一个”和“下一个”。如何命名它们决定了顺序。如果您有一个双链接列表,则节点具有两个指针

然而,您总是存储指向第一个和最后一个元素的指针。这样,您就可以拥有
前推
前推
后推
后推
功能

但是,如果您有一个向前列表,(您只在节点中存储
next
指针,那么就不能有
pop\u back
,因为您的最后一个节点没有到上一个节点的链接,并且您不知道新的最后一个元素会变成什么

那么

  • 转发列表可以有:
    向前推
    向前推
    向后推
  • 向后列表可以有:
    向前推
    向后推
    向后弹出
  • 和一个双链接列表:
    push_-front
    pop_-front
    push_-back
    pop_-back

您可以选择自己列表的方向。通常通过将指向上一个和下一个节点的指针命名为“上一个”和“下一个”。命名方式决定了顺序。如果您有一个双链接列表,则您的节点具有两个指针

然而,您总是存储指向第一个和最后一个元素的指针。这样,您就可以使用
向前推
向前推
向后推
向后推
功能

但是,如果您有一个向前列表,(您只在节点中存储
next
指针,那么就不能有
pop\u back
,因为您的最后一个节点没有到上一个节点的链接,并且您不知道新的最后一个元素会变成什么

那么

  • 转发列表可以有:
    向前推
    向前推
    向后推
  • 向后列表可以有:
    向前推
    向后推
    向后弹出
  • 和一个双链接列表:
    push_-front
    pop_-front
    push_-back
    pop_-back

链表常用的术语是

在非循环列表中,就像您在问题中显示的列表一样,
head
节点将是列表中没有其他节点指向的节点,因此您需要另一个指针,
listHead
指针指向它。由于您通常从
listHead
指向的节点开始遍历列表,因此
head节点也可以被认为是列表中的第一个节点

在非循环列表中,
tail
节点是不指向任何其他节点的节点。它可以被视为列表中的
最后一个
节点

现在,在循环列表中,就像您链接的文本中引用的列表一样,
,以及
第一个
最后一个
的定义可能会更复杂一些,因为每个节点都指向另一个节点,并且有另一个节点指向它。循环列表开始和结束的位置通常是dete由列表的排序顺序(如果有)终止,或其他一些遍历条件控制列表的遍历顺序

一个基本的循环列表可以包括一个
listHead
指针,该指针指向在浏览列表时应该访问的
第一个
节点

一些更高级的循环列表将改为使用
listTail
指针,指向列表的最后一个节点。这是因为,使用循环列表,如果您有指向
tail
节点的指针,则很容易到达
head
节点,因为
tail
节点将指向
head
节点。因此,通过提供指向
尾部
节点的指针,您可以快速访问列表中的
最后一个
第一个
节点。这是链接文本所描述的数据结构类型

现在,关于插入的问题,这是真实的