这次主要关注点在:静态链表,双向链表,循环链表。
1.静态链表
线性表的静态链表的存储结构
<pre name="code" class="cpp">
#define MAXSIZE 1000
typedef struct
{
ElemType data;
int cur;
}
Component,staticLinkList[MAXSIZE];
动态链表:采用malloc()和free()两个函数实现申请和释放。
静态链表:将所有未被使用过的及已被删除的的分量用游标做成一个备用链表,每当进行插入时,便可以从备用链表上去的第一个节点作为待插入的新节点。
若备用节点空间链表非空,则返回分配的节点下标,否则返回0
/* 在链表L中第i个元素之前插入数据元素e
Status ListInsert( StatticLinkList L, int i , ElemTpye e)
{
int j,k,l;
k =MAX_SIZE-1;
if(ii<1||i>ListLength(L)+1)
return ERROR;
j = Malloc_SSL(L); //获得空闲分量下标
if(j)
{
L[j].data = e;
for( l=1;l<=i-1;l++)
k = L[k].cur;
L[j].cur = L[k].cur;
L[k].cur=j;
return OK;
}
return ERROR;
}
/*删除在L中第i个元素e*/
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<i-1 ;j++)
k = L[k].cur;
j = L[k].cur;
L[k].cur =L[j].cur;
Free_SSL(L,j); //
return OK;
}
静态链表修改时,只需要修改游标(cur),并未解决连续修改带来的表长不确定,,失去顺序存储结构随即存储的特性。是为了给没有指针的高级语言设计的一种巧妙的实现单链表能力的方法。
2、循环链表
循环链表和单链表的主要差异在与判断条件,原来判断条件是p->next是否为空,现在的判断条件p->next不等于头结点,则循环未结束。
p = rearA->next;
rearA->next = rearB->next->next
reaB->next= p;
free(p);