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