/**********************************************************
* 单链表的存储结构定义
***********************************************************/
typedef struct LNode {
ElemType data;
struct LNode *next;
} LNode, *LinkList;
/**********************************************************
* 单链表的基本操作的实现
***********************************************************/
//创建并初始化为空表
Status InitList(LinkList &L)
{ L=(LNode*)malloc(sizeof(LNode));
if(L==NULL) return ERROR;
L->next=NULL;
return OK;
}
//销毁整个表(从此之后不再可用)
Status DestroyList(LinkList &L)
{
// TODO (#1#): 销毁表
return ERROR;
//-------------------------------------
}
//将表L置空
Status ClearList(LinkList &L)
{ L->next=NULL;
return OK;
}
//判断表L是否为空表
bool ListEmpty(LinkList L)
{ if(L->next==NULL) return true;
return false;
//-------------------------------------
}
//求表L的长度
int ListLength(LinkList L)
{ LNode* p=L->next;
int j=0;
while(p||p!=NULL)
{p=p->next;
j++;
}
return j;
}
//取表L中的第i个元素,并用e返回. 操作成功返回OK,失败时返回ERROR
Status GetElem(LinkList L, int i, ElemType &e)
{ LNode* p=L->next;
int j=1;
while(p||j<i)
{ p=p->next;
j++;
}
if(!p||j>i) return ERROR;
e=p->data;
return OK;
//-------------------------------------
}
//在表L中定位元素e首次出现的位置. 操作成功返回位序,失败时返回0
// compare(a,b) 为比较函数,匹配时返回true,否则返回false
int LocateElem(LinkList L, ElemType e, bool (*compare)(ElemType,ElemType))
{ int j=1;
LNode* p = L->next;
while(p!=NULL) {
if( compare(p->data,e) ) return j;
p=p->next;
j++;
}
return 0;
}
//在表L中插入第i个元素e. 操作成功返回OK,失败时返回ERROR
Status ListInsert(LinkList &L, int i, ElemType e)
{ LNode* p=L;
int j=0 ;
while(p&&j<i-1)
{p=p->next;
j++;
}
if(!p||j>i-1) return ERROR;
LNode* s=(LNode*)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
//删除表L中第i个元素,结果用e返回. 操作成功返回OK,失败时返回ERROR
Status ListDelete(LinkList &L, int i, ElemType &e)
{ LNode* p=L->next;
int j=1;
while(p&&j<i-1)
{p=p->next;
j++;
}
if(!p||j>i-1) return ERROR;
p->next=p->next->next;
free(p);
return OK;
}
//遍历表L,对每个元素调用visit(x).
Status ListTraverse(LinkList L, Status (*visit)(ElemType))
{
LinkList p = L->next;
while ( p ) {
if ( visit(p->data)==ERROR ) return ERROR;
p = p->next;
}
return OK;
}