1.单链表整表创建的算法思路:
- 声明一结点p和计数器变量i;
- 初始化一空链表L;
- 让L的头结点的指针指向NULL,即建立一个带头结点的单链表;
- 循环实现后继结点的赋值和插入。
2.头插法建立单链表
- 头插法从一个空表开始,生成新结点,读取数据存放到新结点的数据域中,然后将新结点插入到当前链表的表头上,直到结束为止。
- 就是把新加进的元素放在表头后的第一个位置:
先让新结点的next指向头结点之后
然后让表头的next指向新结点
void CreateListHead(LinkList *L,int n)
{
LinkList p;
int i;
srand(time(0)); //初始化随机数种子
*L=(LinkList)malloc(sizeof(Node));
(*L)->next=NULL;
for(i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(Node)); //生成新结点
p->data=rand()%100+1;
p->next=(*L)->next;
(*L)->next=p;
}
}
3.尾插法建立单链表
void CreateListTail(LinkList *L,int n)
{
LinkList p,r;
srand(time(0));
*L=(LinkList)malloc(sizeof(Node));
r=*L;
for(int i=0;i<n;i++)
{
p=(Node *)malloc(sizeof(Node));
p->data=rand()%100+1;
r->next=p;
r=p;
}
r->next=NULL;
}
4.单链表的整表删除
思路:
- 声明结点p和q;
- 将第一个结点赋值给p,下一个结点赋值给q;
- 循环执行释放p和将q的操作;
Status ClearList(LinkList *L)
{
LinkList p,q;
p=(*L)->next;
while(p)
{
q=p->next;
free(p);
p=q;
}
(*L)->next=NULL;
return OK;
}
5.单链表结构与顺序存储结构优缺点
-
存储分配方式:
顺序存储结构用一般连续的存储单元依次存储线性表的数据元素。
单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素。 -
时间性能:
-
查找:
顺序存储结构O(1)
单链表O(n) -
插入和删除
顺序存储结构需要平均移动表长一半的元素,时间为O(n)
单链表在计算出某位置的指针后,插入和删除时间仅为O(1) -
空间性能:
顺序存储结构需要预分配存储空间,分大了,容易造成空间浪费,分小了,容易发生溢出。
单链表不需要分配存储空间,只需有就可以分配,元素个数也不受限制。