无法理解链表(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
的指针