数据结构 -- 链表的整表创建

1、单链表的整表创建

单链表的整表创建有两种方法、一种是采用头插法、就是始终让新结点在第一个位置。另一种是采用尾插法、每次把新结点都插在终端结点的后面,按照排队时的正常思维,所谓的先来后到。

1.1、尾插法实现

  • 整体思路:

    • 首先定义一个节点p、该节点为头节点。
    • 然后定义一个节点l、代表尾节点。
    • 让p指向l、也就是说、刚开始头尾节点指向同一个位置。
    • 每次生成的新节点都先给l.next、因为l.next代表原先尾节点的指针域、将新节点赋值给原先尾节点的指针域、然后将尾节点l向后移动、也就是将新节点赋值给l、这个时候l.next又为空了、因为此时l的位置又在尾节点上了。
  • 代码如下:

/**
 * 尾插法创建单链表
 **/
#include <stdio.h>
#include <stdlib.h>
typedef struct students
{
    int id;
    struct students *next;
} stus;
//单链表整表创建
stus *initList()
{

    stus *p = (stus *)malloc(sizeof(stus)); //头节点、一直不动、返回出去然后根据头节点遍历链表

    stus *l = p; //尾节点、初始时和头节点指向同一个位置

    int i;

    for (i = 1001; i <= 1005; i++)
    {

        stus *s = (stus *)malloc(sizeof(stus)); //新节点

        s->id = i; //新阶段数据域

        s->next = NULL; //新阶段指针域

        l->next = s;

        l = s; //将尾节点移动到当前新节点的位置
    }
    return p;
}

尾插法每次将新节点放在最后位置、然后移动尾指针向后移动、始终指向最后一个节点。

1.2、头插法实现

  • 整体思路:

    • 首先定义一个节点p、该节点为头节点。
    • 然后执行p->next=NULL、因为是头插法、每次新的节点都在第一个位置、那么首次添加的新节点到最后就跑到最后的位置了、所以要将它的指针域设为空。
    • 每次生成的新节点后、先将p->next赋值给新节点的指针域s->next、也就是说、将原来的头节点赋值给新节点的指针域
    • 最后执行p->next = s、也就是将新节点赋值给头节点的指针域。这样、头节点的next就指向新节点的位置了。
  • 代码实现:

/**
 * 头插法创建单链表
 **/
#include <stdio.h>
#include <stdlib.h>
typedef struct students
{
    int id;
    struct students *next;
} stus;
stus *initList()
{

    stus *p = (stus *)malloc(sizeof(stus)); //头节点、一直不动、返回出去然后根据头节点遍历链表

    p->next=NULL;

    int i;

    for (i = 1001; i <= 1005; i++)
    {

        stus *s = (stus *)malloc(sizeof(stus)); //新节点

        s->id = i; 

        s->next = p->next; 

        p->next = s;

    }
    return p;
}

头插法用的是插队的办法,就是始终让新结点在第一的位置、所以每次都要将原来第一个节点赋值给新节点的next指针域、然后将新节点赋值给头节点的next指针域、这样新节点就是第一个节点了,而原来第一个节点的位置就变成第二个节点的位置了。

posted @ 2021-05-31 11:24  初晨~  阅读(318)  评论(0编辑  收藏  举报