单链表的整表创建
单链表整体创建思路:
1、声明一指针p和计数器变量i;
2、初始化一空链表L;
3、让L的头结点的指针指向null,即建立一个带头结点的单链表;
4、循环:
生成新的结点赋值给P
随机生成P的数据域的数据
将P插入到头结点与新一结点之间
头插法
void CreatListHead(LinkLinst *L,int n){
LinkList P;
int i;
srand(time(0));
*L=(LinkList) malloc(siezof(Node));
(*L)->next=null;
for(i=0,i<n;++i){
P=(LinkList) malloc(siezof(Node));
P->data=rand()%100+1;
P->next=L->next;
L->next=P;
}
}
如图:
尾插法
void CreatListTail(LinkList *L,int n){
LinkList p,r;
int i;
srand(time(0));
r=*L; //r为指向尾部的结点
*L=(LinkList) malloc(siezof(Node));
for(int i=0;i<n;++i){
p->data=rand()%100+1;
r->next = p;
r=p;
}
r->next = null; //表示当前链表结束
}
如图:
单链表的整表删除
单链表整表删除思路:
1、声明一个结点p,q
2、将第一个结点赋值给P
3、循环
将下一个结点赋值给q
释放P
将q赋值给p
Status ClearList(LinkList *L){
LinkList p,q;
p=(*L)->next;
while(p){
q=p->next;
free(p);
p=q;
}
(*L)->next=null; //头结点指针域为空
return OK;
}
单链表结构与顺序存储结构优缺点
存储分配方式:
1、顺序存储结构用一段连续的存储单元依次存储线性表的数据元素
2、单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素。
时间性能:
1、查找
顺序存储结构o(1);
单链表o(n);
2、插入和删除
顺序存储结构需要平均移动表长一半的元素,时间为o(n)
单链表在线出某位置的指针后,插入和删除时间仅为o(1)
3、空间性能
顺序存储结构需要预分配存储空间,分大了,浪费,分小了易发生上溢
单链表不需要分配存储空间,只要有就可以分配,元素个数也不受限制
静态链表
用数组描述的链表叫静态链表
//线性表的静态链表存储结构
#define MAXSIZE 1000 //假设链表的最大长度是1000
typedef struct{
ElemType data;
int cur; //游标,为0时表示无指向
} Compnet,StaticLinkList[MAXSIZE];
如图:
改图相当于初始化的数组状态
//将一维数组space中各分量链成一备用链表,space[0].cur为头指针,'0'表示空指针
Status InitList(StaticLinkList space){
int i;
for(i=0;i<MAXSIZE-1;++i)
space[i].cur=i+1;
space[MAXSIZE-1].cur=0; //目前静态链表为空,最后一个元素的cur为0
return OK;
}
静态链表的插入操作
//若备用空间链表为空,则返回分配的结点下标,否则返回0
int Malloc_SLL(StaticLinkList space){
int i=space[0].cur;
if(space[0].cur)
space[0].cur=space[i].cur //由于要拿出一个分量来使用了,所以我们就得把它的下一个分量用来做备用。
return i;
}
静态链表得删除操作
//删除在L中第i得数据元素
Status ListDelete(StaticLinkList L,int i){
int j,k;
if(i<1 || i>ListLength(L)){
return ERROR;
}
k=MAX_SIZE - 1;
for(j-1;j<=1;++j)
k=L[k].cur;
j=L[k].cur;
L[k].cur=L[j].cur;
Free_SSL(L,j);
return OK;
}
//将下标为K得空闲结点回收到备用链表
void Free_SSL(StaticLinkList space,int k){
space[k].cur = space[0].cur; //把第一个元素cur赋值给要删除得分量
space[0].cur=k; //把要删除得分量下标赋值给第一个元素的cur
}
静态链表优缺点
优点:在插入和删除操作时,只需要移动游标,不要移动元素,从而改进了在顺序存储结构中得插入和删除操作需要移动大量元素得缺点。
缺点:没有解决连续存储分配带来得表长难以确定得问题,失去了顺序存储结构随机存取的特性。
循环链表
将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表。
双向链表
双向链表是在单链表的每个结点中,在设置一个指向其前驱结点的指针域。
//线性表的双向链表存储结构
typedef struct DulNode{
ElemType data;
struct DulNode *prior;
struct DulNode *next;
}DulNode, *DuLinkList;
如图: