链表知识点

(1)准备工作1:结构体成员为本结构体类型的指针变量的情况(链域)

struct  STI
{
    int score;
    int age;
    struct  STI st;
};
上述定义时错误的,错误原因:长度不确定。

struct  STI
{
    int score;
    int age;
    struct  STI *st;
};
上述定义时正确的,因为,任何类型指针,长度都是4B;因此,上述定义的结构体struct STI长度是确定的,为12B;识别方式也是确定的(前两个成员按补码解释,第三个成员按指针解释)。

(2)准备工作2

typedef  struct  POINT // 屏幕上的点信息,由行、列坐标构成

{

     int  row;

     int  col;

     struct  POINT  *next;

}POINT;

 

POINT  a, b, c, d, *p;

a.row = 3; a.col = 4;

b.row = 13; b.col = 14;

c.row = 23; c.col = 24;

d.row = 33; d.col = 34;

p = &a;

a.next = &b;

b.next = &c;

c.next = &d;

d.next = NULL; d.next = &a;

a.row => 3
a.next->row => 13             左式念做:a的next成员所指向的实例的row成员
a.next->next->row => 23    念做:a的next成员所指向的实例的next成员所指向的实例的row成员
p->row => 3

p = p->next;    将“p所指向的实例的next成员的值”,赋值给p空间。
上述语句的多次执行,可以实现将p指针的指向,在整个“链条”的各个节点上依次“滑动”,可以以此实现对链条中的每一个节点的访问(遍历)
for(p = &a; ? ; p = p->next)
    p->row
for循环条件的确定:
假设p已经指向链表中的最后一个节点(d),再次执行p = p->next;会发生什么?
结果是,p的值会被赋值为NULL,也就是0!0是假,可以以此结束循环!
所以:
for(p = &a; p; p = p->next)
    p->…
 

猜你喜欢

转载自blog.csdn.net/weixin_42072280/article/details/82714493