单链表的整表创建
扫描二维码
随时随地手机看文章
1、顺序存储结构的创建,其实就是一个数组的初始化,即声明一个固定类型和大小的数组并赋值的过程。
而单链表和顺序存储结构就不一样,它不像顺序存储结构那么几种,它可以很散,是一种动态结构。对于每个链表来说,
它所占用空间的大小和位置是不需要预先分配划定的,可以根据系统的情况和实际需求即时生成。
所以创建单链表的过程就是一个动态生成链表的过程。即从“空表”的初始状态起,依次建立各元素结点,并逐个插入链表。
---- 单链表整表创建的算法思路:
-- 1)声明一结点p和计数器变量 i ;
-- 2)初始化一空链表L;
-- 3)让L的头结点的指针指向NULL,即建立一个带头结点的单链表;
-- 4)循环:生成一新结点赋值给p 随机生成一数字赋值给p的数据域p->data 将p插入到头结点与前一新结点之间。
实现代码算法如下:
#include#includeusing namespace std; typedef int Elemtype; typedef struct node { Elemtype data; struct node *link; } Node,*LinkList; //typedef struct node *LinkList; //typedef Node *LinkList; /* 随机产生n个元素的值,建立带表头结点的单链线性表L(头插法)*/ void CreateList(LinkList *L,int n) { LinkList p; int i; srand((unsigned)time(0)); //初始化随机数种子 *L = (LinkList)malloc(sizeof(Node)); (*L)->link = NULL; //先建立一个带头结点的单链表 for(i=0;idata = rand()%100+1; //随机生成100以内的数字 p->link = (*L)->link; //指向第一个结点 (*L)->link = p; //插入到表头 } }
这段算法代码里,我们其实用的是插队的办法,就是始终让新结点在第一的位置。可以把这种算法简称为头插法。
也可以每次把新结点都插在终端结点的后面,按照排队时的正常思维,所谓的先来后到,这种算法称之为尾插法。
实现代码算法如下:
#include#includeusing namespace std; typedef int Elemtype; typedef struct node { Elemtype data; struct node *link; } Node,*LinkList; //typedef struct node *LinkList; //typedef Node *LinkList; /* 随机产生n个元素的值,建立带表头结点的单链线性表L(尾插法)*/ void CreateList(LinkList *L,int n) { LinkList p,r; int i; srand((unsigned)time(0)); //初始化随机数种子 *L = (LinkList)malloc(sizeof(Node)); r = *L; //r为指向尾部的结点 for(i=0;idata = rand()%100+1; //随机生成100以内的数字 r->link = p; //将表尾终端结点的指针指向新结点 r = p; //将当前的新结点定义为表尾终端结点 } r->link = NULL; }
L是指整个单链表,而 r 是指向尾结点的指针,r是会随着循环不断的变化,L则是随着循环增长为一个多结点的链表。