?? bo2-4.cpp
字號(hào):
// bo2-4.cpp 設(shè)立尾指針的單循環(huán)鏈表(存儲(chǔ)結(jié)構(gòu)由c2-2.h定義)的12個(gè)基本操作
Status InitList_CL(LinkList &L)
{ // 操作結(jié)果:構(gòu)造一個(gè)空的線性表L。
L=(LinkList)malloc(sizeof(LNode)); // 產(chǎn)生頭結(jié)點(diǎn),并使L指向此頭結(jié)點(diǎn)
if(!L) // 存儲(chǔ)分配失敗
exit(OVERFLOW);
L->next=L; // 指針域指向頭結(jié)點(diǎn)
return OK;
}
Status DestroyList_CL(LinkList &L)
{ // 操作結(jié)果:銷毀線性表L。
LinkList q,p=L->next; // p指向頭結(jié)點(diǎn)
while(p!=L) // 沒到表尾
{
q=p->next;
free(p);
p=q;
}
free(L);
L=NULL;
return OK;
}
Status ClearList_CL(LinkList &L) // 改變L
{ // 初始條件:線性表L已存在。操作結(jié)果:將L重置為空表。
LinkList p,q;
L=L->next; // L指向頭結(jié)點(diǎn)
p=L->next; // p指向第一個(gè)結(jié)點(diǎn)
while(p!=L) // 沒到表尾
{
q=p->next;
free(p);
p=q;
}
L->next=L; // 頭結(jié)點(diǎn)指針域指向自身
return OK;
}
Status ListEmpty_CL(LinkList L)
{ // 初始條件:線性表L已存在。
// 操作結(jié)果:若L為空表,則返回TRUE,否則返回FALSE。
if(L->next==L) // 空
return TRUE;
else
return FALSE;
}
int ListLength_CL(LinkList L)
{ // 初始條件:L已存在。操作結(jié)果:返回L中數(shù)據(jù)元素個(gè)數(shù)。
int i=0;
LinkList p=L->next; // p指向頭結(jié)點(diǎn)
while(p!=L) // 沒到表尾
{
i++;
p=p->next;
}
return i;
}
Status GetElem_CL(LinkList L,int i,ElemType &e)
{ // 當(dāng)?shù)趇個(gè)元素存在時(shí),其值賦給e并返回OK,否則返回ERROR
int j=1; // 初始化,j為計(jì)數(shù)器
LinkList p=L->next->next; // p指向第一個(gè)結(jié)點(diǎn)
if(i<=0||i>ListLength_CL(L)) // 第i個(gè)元素不存在
return ERROR;
while(j<i)
{ // 順指針向后查找,直到p指向第i個(gè)元素
p=p->next;
j++;
}
e=p->data; // 取第i個(gè)元素
return OK;
}
int LocateElem_CL(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType))
{ // 初始條件:線性表L已存在,compare()是數(shù)據(jù)元素判定函數(shù)。
// 操作結(jié)果:返回L中第1個(gè)與e滿足關(guān)系compare()的數(shù)據(jù)元素的位序。
// 若這樣的數(shù)據(jù)元素不存在,則返回值為0。
int i=0;
LinkList p=L->next->next; // p指向第一個(gè)結(jié)點(diǎn)
while(p!=L->next)
{
i++;
if(compare(p->data,e)) // 滿足關(guān)系
return i;
p=p->next;
}
return 0;
}
Status PriorElem_CL(LinkList L,ElemType cur_e,ElemType &pre_e)
{ // 初始條件:線性表L已存在。
// 操作結(jié)果:若cur_e是L的數(shù)據(jù)元素,且不是第一個(gè),則用pre_e返回它的前驅(qū),
// 否則操作失敗,pre_e無定義。
LinkList q,p=L->next->next; // p指向第一個(gè)結(jié)點(diǎn)
q=p->next;
while(q!=L->next) // p沒到表尾
{
if(q->data==cur_e)
{
pre_e=p->data;
return TRUE;
}
p=q;
q=q->next;
}
return FALSE;
}
Status NextElem_CL(LinkList L,ElemType cur_e,ElemType &next_e)
{ // 初始條件:線性表L已存在。
// 操作結(jié)果:若cur_e是L的數(shù)據(jù)元素,且不是最后一個(gè),則用next_e返回它的后繼,
// 否則操作失敗,next_e無定義。
LinkList p=L->next->next; // p指向第一個(gè)結(jié)點(diǎn)
while(p!=L) // p沒到表尾
{
if(p->data==cur_e)
{
next_e=p->next->data;
return TRUE;
}
p=p->next;
}
return FALSE;
}
Status ListInsert_CL(LinkList &L,int i,ElemType e) // 改變L
{ // 在L的第i個(gè)位置之前插入元素e
LinkList p=L->next,s; // p指向頭結(jié)點(diǎn)
int j=0;
if(i<=0||i>ListLength_CL(L)+1) // 無法在第i個(gè)元素之前插入
return ERROR;
while(j<i-1) // 尋找第i-1個(gè)結(jié)點(diǎn)
{
p=p->next;
j++;
}
s=(LinkList)malloc(sizeof(LNode)); // 生成新結(jié)點(diǎn)
s->data=e; // 插入L中
s->next=p->next;
p->next=s;
if(p==L) // 改變尾結(jié)點(diǎn)
L=s;
return OK;
}
Status ListDelete_CL(LinkList &L,int i,ElemType &e) // 改變L
{ // 刪除L的第i個(gè)元素,并由e返回其值
LinkList p=L->next,q; // p指向頭結(jié)點(diǎn)
int j=0;
if(i<=0||i>ListLength_CL(L)) // 第i個(gè)元素不存在
return ERROR;
while(j<i-1) // 尋找第i-1個(gè)結(jié)點(diǎn)
{
p=p->next;
j++;
}
q=p->next; // q指向待刪除結(jié)點(diǎn)
p->next=q->next;
e=q->data;
if(L==q) // 刪除的是表尾元素
L=p;
free(q); // 釋放待刪除結(jié)點(diǎn)
return OK;
}
Status ListTraverse_CL(LinkList L,void(*vi)(ElemType))
{ // 初始條件:L已存在。
// 操作結(jié)果:依次對(duì)L的每個(gè)數(shù)據(jù)元素調(diào)用函數(shù)vi()。一旦vi()失敗,則操作失敗
LinkList p=L->next->next;
while(p!=L->next)
{
vi(p->data);
p=p->next;
}
printf("\n");
return OK;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -