C 结构中的结构?

C 结构中的结构?,c,pointers,struct,linked-list,C,Pointers,Struct,Linked List,这是我的讲师发送的示例代码的代码片段。 我不懂逻辑。请容忍我,我现在正在学习计算机科学。编辑:这似乎是一个链接列表 struct db { int value; struct db *next; } *head, *tail, *curr; void pushF() { int input; system("CLS"); printf("\n\n\tInput value: "); scanf("%d", &input); cu

这是我的讲师发送的示例代码的代码片段。 我不懂逻辑。请容忍我,我现在正在学习计算机科学。编辑:这似乎是一个链接列表

struct db {
    int value;
    struct db *next;
} *head, *tail, *curr;

void pushF()
{
    int input;
    system("CLS");
    printf("\n\n\tInput value: ");
    scanf("%d", &input);

    curr = (struct db*) malloc(sizeof(struct db));
    curr->value = input;

    if (head == NULL) {
        head = tail = curr;
        head->next = NULL;
    } else {
        curr->next = head;
        head = curr;
    }
}
如果输入为1, 我最好的猜测是:

  • 每个结构名称(head、tail和curr)都有三个不同的“int值”和(
    struct data*next
    )-我不明白
  • 程序开始时会提示输入值
  • curr=(struct db*)malloc(sizeof(struct db))我不明白
  • curr
    的整数值设置为1
  • 如果磁头为空,则我不明白
  • head=tail=curr
    -我不明白。我猜这是一条链子
  • 将头部旁边的指针设置为
    NULL
  • 否则,将
    curr
    旁边的指针设置为head,并将head设置为
    curr

这不是结构中的结构示例。相反,struct db*next只是将结构成员
next
声明为指向
struct db
的指针

每个结构名称(head、tail和curr)都有三个不同的“int值”和(
structdata*next

代码创建了指向struct、head(指向列表第一个节点的指针)、curr(当前节点)、tail(指向列表最后一个节点的指针)的3个“实例”指针

curr=(struct db*)malloc(sizeof(struct db))

为一个节点分配内存空间

curr
的整数值设置为1

它将curr->value设置为1

如果磁头为
NULL
。。。头=尾=电流

如果列表为空,则会将head和tail设置为列表中唯一的节点

将头部旁边的指针设置为
NULL

这不是一个好方法,最好设置curr->next==NULL,以便更容易理解

curr
旁边的指针设置为head,并将head设置为
curr

这样做是为了将当前节点插入列表的开头。假设列表以一个节点
A
开始,则您有:

head -> A
A -> NULL   (A.next = NULL)
tail -> A
head -> B
B -> A      (B.next = &A)
A -> NULL   (A.next = NULL)
tail -> A
然后假设您插入了节点B,在此之后您有:

head -> A
A -> NULL   (A.next = NULL)
tail -> A
head -> B
B -> A      (B.next = &A)
A -> NULL   (A.next = NULL)
tail -> A

那么,你的问题到底是什么呢?作为一个补充——研究一下为什么你不应该公布分配结果。我知道这是你的讲师说的,但他/她这样做是错误的。@ChrisTurner对正在发生的事情进行了解释。问题太广泛了,显然有许多概念你不理解。从阅读笔记/课本开始。如果你还有问题,请带着有针对性的问题回来。例如:curr=(structdb*)malloc(sizeof(structdb));[老实说,我不知道这行是做什么的。它对我来说毫无意义。]-这本身就是个问题。这是堆栈数据结构的一个写得很糟糕的链表实现。列表中的每个节点(struct db的一个实例)表示堆栈上的一个条目。
value
成员存储与节点关联的值,而
next
成员显式指向列表中的下一个元素。每次调用
pushF
,都会使用
malloc
动态分配一个新的
struct db
对象,并将输入值写入
value
成员。这个新节点成为列表的头部(堆栈的顶部)。