单链表的整表创建
对于顺序存储结构的线性表的整表创建,我们可以用数组的初始化来直观理解
而单链表和顺序存储结构就不一样了,它不像顺序存储结构数据那么集中,它的数据可以是分散在内存各个角落的,它的增长也是动态的
对于每个链表来说,它所占用的空间大小和位置是不需要预先分配划定的,可以根据系统的情况和实际的需求即时生成
单链表的整表创建算法思路如下:
--声明一结点p和计数器变量i
--初始化一空链表L
--让L的头结点的指针指向NULL,建立一个带头结点的单链表
--循环实现后继结点的赋值和插入
头插法代码如下:
/*
*头插入法-----创建单链表的整表
*/
#include <stdlib.h>
#include <malloc.h>
typedef int ElemType;
typedef struct Stu
{
ElemType data;//数据域
struct Node *next;//指针域
}Node;
typedef struct Node *LinkList;
void CreateListHead(LinkList *L, int n)
{
LinkList p;
int i;
srand(time(0));//随机种子的生成
*L = (LinkList)malloc(sizeof(Node));//创建头结点
(*L)->next = NULL;//先让这个头结点的next指向NULL,加括号是因为括号比->符号运算附低
for ( i = 0; i < n; i++)
{
p = (LinkList)malloc(sizeof(Node));
p->data = rand() % 100 + 1;
p->next = (*L)->next;//让新加的p结点的next指向头结点的next
(*L)->next = p;//再让头结点的next指向当前新增结点,新增的结点每次都是加在头结点后面
}
}
尾插入代码如下:
/*
*尾插入法-----创建单链表的整表
*/
#include <stdlib.h>
#include <malloc.h>
typedef int ElemType;
typedef struct Stu
{
ElemType data;//数据域
struct Node *next;//指针域
}Node;
typedef struct Node *LinkList;
void CreateListHead(LinkList *L, int n)
{
LinkList p, r;
int i;
srand(time(0));//随机种子的生成
*L = (LinkList)malloc(sizeof(Node));//创建头结点
r = *L;//这里等于表中有两个头结点元素
for (i = 0; i < n; i++)
{
p = (LinkList)malloc(sizeof(Node));
p->data = rand() % 100 + 1;
r->next = p;//把新加的结点赋值给r的next
r = p;//新增的结点每次都是加在前一个新增结点后面
}
r->next = NULL;//让新加的结点的next指向NULL,保证每次加的结点都在末尾
}
单链表的整表删除算法思路:
--声明结点p和q
--将第一个结点赋值给p,下一结点赋值给q
--循环执行释放p和将赋值给p的操作
代码如下:
/*
*单链表的整表删除
*/
#include <stdlib.h>
#include <malloc.h>
typedef int ElemType;
typedef struct Stu
{
ElemType data;//数据域
struct Node *next;//指针域
}Node;
typedef struct Node *LinkList;
void ClearList(LinkList *L)
{
LinkList p, q;
p = (L*)->next;//把第一个结点赋值给p
while (p)//只要p!=NULL
{
q = p->next;//把p的下一个结点赋值给q
free(p);//释放p
p = q;//再把q赋值个p
}
(*L)->next = NULL;//最后头结点的next指向NULL,即是空链表了
return OK;
}
单链表结构和顺序存储结构的优缺点:
1,存储分配方式
--顺序存储结构用一段连续的存储单元依次存储线性表的数据元素
--单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素
2,时间性能
--查找
顺序结构O(1)
单链表O(n)
--插入和删除
顺序存储结构需要平均移动表长的一半,时间为O(n)
单链表在计算出某个位置指针后,插入和删除时间都是O(1)
3,空间性能
--顺序存储结构需要预先分配存储空间,分大了,容易造成空间浪费,分小了,容易发生溢出
--单链表不需要分配存储空间,只要内存有就可以分配,元素个数也不受限制
根据上面比较,得出一些经营性的结论:
(1)若线性表需要频繁查找,很少进行插入和删除操作,宜采用顺序存储结构
(2)需要频繁插入和删除操作,宜采用单链表存储结构