0%

链表入门

静态列表与动态列表

  1. 静态列表:所有结点都是在程序中定义。
  2. 动态列表:所有结点临时开辟,用完释放,即一个个开辟结点并输入节点的值,建立前后连接关系。

    -> : 指向运算符

    1
    p -> next        <=>        (*p)next 
  • 指向结构体的指针不指向结构体成员,因为类型不同
  • 定义动态链表,需要约定好链表结束的条件。
  • 动态链表: 让p1指向新开辟的结点,p2指向链表最后一个结点,把p1所指的结点连接在p2所指的结点后面。
  1. 用malloc开辟结点1(n=1),使p1指向它。
    1
    p1 = (struct Name *) malloc (Name长度); 
  2. 输入节点数据;
  3. 链入结点2(n=2),p1的值赋给p2 -> next,此时p2指向第一个节点,故 p2 -> next = p1 将结点2的地址赋给结点1的 next;
  4. 使 p2 = p1,即使p2指向新结点。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    struct Student* creat()
    {
    struct Student *p1, *p2, *head;
    n = 0;
    p1 = p2 = (struct Student *)malloc(Len);
    scanf("%d%d",&(*p1).num, &(*p1).age);
    head = NULL;
    while((*p1).num != 0)
    {
    n++;
    if(n == 1)
    head = p1;
    else
    (*p2).next = p1; //这里跟我的顺序不太一样,可以思考一下
    p2 = p1;
    p1 = (struct Student *)malloc(Len);
    // p2 = p1;
    scanf("%d%d",&(*p1).num, &(*p1).age);
    }
    (*p2).next = NULL;
    return head;
    }
    在建立链表的循环中,例1是
  • 连接
  • 创建
  • 赋值(此时p2在旧结点p1在新结点

例1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct Student* creat()
{
struct Student *p1, *p2, *head;
head = (struct Student *)malloc(Len);
p1 = p2 = head;
scanf("%d%d",&(*p1).id, &(*p1).age);
do
{
p1 = (struct Student *)malloc(Len);
(*p2).next = p1;
p2 = p1;
scanf("%d%d",&(*p1).id, &(*p1).age);
}
while((*p2).id != 0);
(*p1).next = NULL;
return head;
}

在建立链表的循环中,例2是

  • 创建
  • 链接
  • 赋值(此时p2与p1都在新结点

例2


完结 撒花 ฅ>ω<*ฅ