Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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,我不明白链表是怎么工作的 假设我有一些代码 typedef struct trip { int id, year, something; char name[100], destination[100]; struct trip *next; //X1 }TRIP; //X2 FILE *fr; TRIP *p_a, *p_p;

我不明白链表是怎么工作的

假设我有一些代码

typedef struct trip {
    int id, year, something;
    char name[100], destination[100];
    struct trip *next;                       //X1

}TRIP;                                       //X2
    FILE *fr;
    TRIP *p_a, *p_p;                         //X3
    fr =fopen("list.txt","r");
    int j=0;
    p_p = (TRIP *) malloc(sizeof(TRIP));
    p_a = p_p;
    while ((fscanf(fr,"%d",&p_a->id)), p_a->id>0 )
    {
            fscanf(fr,"%s",&p_a->name);
            fscanf(fr,"%s",&p_a->destination);
            fscanf(fr,"%d",&p_a->year);
            fscanf(fr,"%d",&p_a->something);
            p_a->next = (TRIP *) malloc(sizeof(TRIP));
            p_a = p_a->next;

    }
    p_a->next = NULL;                        //X4
    fclose(fr);
    return p_p;
}
我不知道有些线路是干什么的。这些行用x1x2x3x4注释。 谁能给我解释一下吗?

x1

结构跳闸*下一步//X1

在“trip”数据结构中,它包含指向另一个trip数据结构的指针

通过使链表指向另一个结构,您可以使用它来“链接”链表的元素

x2

}旅行//X2

这将(我忘记了合适的词)别名结构。跳闸=跳闸

这就是说

trip a; // OR
TRIP a;
两者都有效吗

x3

行程*p_a,*p_p//X3

这是声明两个变量,p_a,p_p,类型为TRIP*(或TRIP*,它们是等价的)

此类型是指向行程数据结构的指针

x4

p_a->next=NULL//X4

这是指针中的成员选择。也就是说,它现在将p_a指向的trip结构中的“next”元素的值设置为NULL

如果有帮助的话,那就相当于

(*p_a).next = NULL
x1

结构跳闸*下一步//X1

在“trip”数据结构中,它包含指向另一个trip数据结构的指针

通过使链表指向另一个结构,您可以使用它来“链接”链表的元素

x2

}旅行//X2

这将(我忘记了合适的词)别名结构。跳闸=跳闸

这就是说

trip a; // OR
TRIP a;
两者都有效吗

x3

行程*p_a,*p_p//X3

这是声明两个变量,p_a,p_p,类型为TRIP*(或TRIP*,它们是等价的)

此类型是指向行程数据结构的指针

x4

p_a->next=NULL//X4

这是指针中的成员选择。也就是说,它现在将p_a指向的trip结构中的“next”元素的值设置为NULL

如果有帮助的话,那就相当于

(*p_a).next = NULL

x1:
next
是指向
struct trip
的另一个实例的指针。图片可能有助于:

+-------+------+       +-------+------+       +-------+------+
| stuff | next | ----> | stuff | next | ----> | stuff | next | ----|||
+-------+------+       +-------+------+       +-------+------+
其中
stuff
是您存储在该节点中的所有其他数据(
id
年份
某物
名称
目的地
)。
next
成员存储另一个节点的地址

C允许您声明指向该
struct
类型定义中的
struct
类型的指针:

struct foo {
  ...
  struct foo *fooptr;
  ...
};
创建指向它的指针不需要知道
struct
类型的大小,指向所有
struct
类型的指针都具有相同的大小和表示形式。也就是说,指向
struct foo
的指针的大小与指向
struct bar
的指针的大小相同,即使
struct foo
struct bar
可能具有完全不同的定义

x2:
typedef
功能允许您为类型创建别名-
TRIP
是类型名称
struct TRIP
的别名。如果您想简化复杂类型或抽象出实现细节(stdio.h中的
文件
typedef name就是后者的一个示例),这一点非常有用


x3:此行声明
p_a
p_p
作为指向
struct trip
的指针

x1:
next
是指向
struct trip
的另一个实例的指针。图片可能有助于:

+-------+------+       +-------+------+       +-------+------+
| stuff | next | ----> | stuff | next | ----> | stuff | next | ----|||
+-------+------+       +-------+------+       +-------+------+
其中
stuff
是您存储在该节点中的所有其他数据(
id
年份
某物
名称
目的地
)。
next
成员存储另一个节点的地址

C允许您声明指向该
struct
类型定义中的
struct
类型的指针:

struct foo {
  ...
  struct foo *fooptr;
  ...
};
创建指向它的指针不需要知道
struct
类型的大小,指向所有
struct
类型的指针都具有相同的大小和表示形式。也就是说,指向
struct foo
的指针的大小与指向
struct bar
的指针的大小相同,即使
struct foo
struct bar
可能具有完全不同的定义

x2:
typedef
功能允许您为类型创建别名-
TRIP
是类型名称
struct TRIP
的别名。如果您想简化复杂类型或抽象出实现细节(stdio.h中的
文件
typedef name就是后者的一个示例),这一点非常有用

x3:此行声明
p_a
p_p
作为指向
struct trip
的指针