/*申请新单元:若备用链表非空,从被备用链表中新分配出一个结点(备用链表的第一个结点),返回该结点在数组中的下标(位置),否则返回0*/ int Malloc(SLinkList space) { int i = space[0].cur; //备用链表的第一个结点
if(i) //非空
space[0].cur = space[i].cur; //备用链表的头结点指向原第二个结点(现第一个结点)
return i; }
/*将下标为k的空闲结点回收到备用链表中(成为备用链表中的第一个结点)*/ void Free(SLinkList space ,int k) { space[k].cur = space[0].cur; space[0].cur = k; }
/*构造一个空的链表L,表头为L的最后一个单元L[MAXSIZE-1],其余单元链成一个备用链表,表头为L的第一单元L[0],"0"表示“空指针”*/ void InitList(SLinkList L) { int i; L[MAXSIZE-1].cur = 0; //空链表的表头
for(i=0;i<MAXSIZE-2;i++) //其余(除了链表表头和备用链表表头)maxsize-2个单元链成备用链表
L[i].cur = i+1; L[MAXSIZE-2].cur = 0; //备用链表的尾元素指向空
}
/*将表L重置为空链表*/ void ClearList(SLinkList L) { int k,j,i; i = L[MAXSIZE-1].cur; //i指向链表中的第一个结点
L[MAXSIZE-1].cur = 0; //置为空表
k = L[0].cur; //k指向备用链表的第一个结点
L[0].cur = i; //把链表的结点连接到备用链表的表头
while(i) //寻找链表尾,保存到j中
{ j = i; i = L[i].cur; } L[j].cur = k; //备用链表的第一结点接到链表的尾部
}
/*若L是空表,返回TRUE,否则返回FALSE*/ Status ListEmpty(SLinkList L) { if(L[MAXSIZE-1].cur == 0) return TRUE; else return FALSE; }
/*返回L中的数据元素个数*/ int ListLength(SLinkList L) { int j = 0; int i = L[MAXSIZE-1].cur; while(i) { j++; i = L[i].cur; } return j; }
/*用e返回L中的第i个元素的值*/ Status GetElem1(SLinkList L,int i,elemtype *e)//不调用ListLength()
{ int k = L[MAXSIZE-1].cur; int j = 0; if(i<1) return ERROR; while(k) { if(++j == i) { *e = L[k].data; return OK; } k = L[k].cur; } return ERROR; }
Status GetElem2(SLinkList L,int i,elemtype *e)//调用ListLength()
{ int m,k=MAXSIZE-1; if(i<1||i>ListLength(L)) return ERROR; for(m=0;m<i;m++) k = L[k].cur; *e = L[k].data; return OK; }
/*在静态链表中查找第一值为e的元素,返回它在表中的为序,没找到则返回0*/ int FindElem(SLinkList L,elemtype e) { int i = L[MAXSIZE-1].cur; while(i && L[i].data != e) i = L[i].cur; return i; }
/*若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,成功返回ok,否则error*/ Status PriorElem(SLinkList L,elemtype cur_e,elemtype * pre_e) { int j,i=L[MAXSIZE-1].cur; //i指向链表的第一个结点位置
if(!i) //若L为空
return ERROR; do { j = i; i = L[i].cur;//指向下一个元素
} while(i && cur_e != L[i].data); if(i) { *pre_e = L[j].data; return OK; } return ERROR; }
/*若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,成功返回ok,否则error*/ Status NextElemtype(SLinkList L,elemtype cur_e,elemtype * next_e) { int j,i=FindElem(L,cur_e); if(i) { j=L[i].cur; if(j) { *next_e = L[j].data; return OK; } } return ERROR; }
/*在L中第i个元素之前插入新的数据元素e*/ Status ListInsert(SLinkList L,int i,elemtype e) { int m,j,k = MAXSIZE-1; if(i<1 || i>ListLength(L)+1) return ERROR; j = Malloc(L); if(j)//申请成功
{ L[j].data = e; for(m=0;m<i-1;m++)//将k移到第i-1个位置
k = L[k].cur; L[j].cur = L[k].cur; L[k].cur = j; return OK; } return ERROR; }
/*删除在L中第i个元素,用e返回其值*/ Status ListDelete(SLinkList L,int i,elemtype *e) { int j,k=L[MAXSIZE-1].cur; if(i<1 || i>ListLength(L)) return ERROR; for(j=0;j<i-1;j++) //使k指向第i-1个元素
k = L[k].cur; j = L[k].cur; //待删除的位置
L[k].cur = L[j].cur; *e = L[j].data; Free(L,j); return OK; }
/*依次对L中的每一个元素调用函数visit()*/ void ListTraverse(SLinkList L,void(*visit)(elemtype)) { int i = L[MAXSIZE-1].cur; while(i) { visit(L[i].data); i = L[i].cur; } }
|