数据结构 -- 链表的整表创建
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指针域、这样新节点就是第一个节点了,而原来第一个节点的位置就变成第二个节点的位置了。