目录
1.单链表的整表创建
1.头插法
//随机生成n个元素的值,建立带表头结点的单链线性表L (头插法)
void CreateListHead(LinkList *L,int n)
{
LinkList p; //定义一个指向链表的指针p
int i;
srand(time(0)); //srand(time(NULL))使得随机数种子随时间变化而变化,头文件:<stdlib.h> 简而言之,就是用来初始化随机数种子的
*L = (LinkList)malloc(sizeof(Node)); //sizeof用来生成一段大小为Node的空间
(*L)->next=NULL; //先建立一个带头结点的单链表
for(i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(Node)); //生成新结点
p->data=rand%100+1; //rand函数可以用来产生随机数,头文件:<stdlib.h>
//v1=rand()%100,其中v1=0~99; v2=rand()%100+1,其中v2=1~100; v3=rand()%30+1985,其中v3=1985~2014;
p->next=(*L)->next; //头插法,就是每次都把新结点插入到表头,也就是头结点的后面
//当p结点插入后,L的后面是p结点,p结点后面是原本在L后面的结点 eg:1(头结点) 3 p:2 插入后:1 2(p) 3
(*L)->next=p; //插入到表头
}
}
2.尾插法
//随机生成n个元素的值,建立带头结点的单链线性表L(尾插法)
void CreateListTail(LinkList *L,int n)
{
LinkList p,r;
int i;
srand(time(0)); //初始化随机数种子
*L=(LinkList)malloc(sizeof(Node)); //生成一个结点,作链表L的头结点
r=*L; //r为指向尾部的结点,此时链表只有一个结点,所以r在刚开始又指向头结点,又指向尾结点
for(i=0;i<n;i++)
{
p=(Node *)malloc(sizeof(Node)); //生成新结点
p->data=rand()%100+1; //生成随机数
r->next=p; //r本来指向头结点,将p插入头结点的后面一个位置,所以r->next=p
r=p; //将p插入后,p变成了L的最后一个结点,而r要总是指向尾结点,所以这里要让r指向p
}
r->next=NULL; //此时r指向尾结点,尾结点后没有新结点,所以为NULL
}
2.单链表的整表删除
//初始条件:链表L已经存在 操作结果:将L重置为空表
Status CLearList(LinkList *L)
{
LinkList p,q;
p=(*L)->next; //p指向第一个结点,也就是头结点后面的第一个结点
while(p) //头结点后只要存在结点,就进行循环,将其清除
{
q=p->next; //使q指向p的后继结点
//如果不这么做,那么在清除p结点后,我们将无法找到下一个结点。
free(p);
p=q; //继续清除下一个结点
}
(*L)->next=NULL; //将头结点的指针域置空
return OK;
}
3.单链表结构与顺序存储结构的选择
1.若线性表需要频繁查找,很少进行插入和删除操作时,适合采用顺序存储结构。
2.当线性表中的元素个数变化较大或者根本不知道有多大时,最好用单链表结构。