结构体定义
struct LNode
{
ElemType data; //数据域
struct LNode *next; //next指针域
};
typedef struct LNode *LinkList;//定义为LinkList的指针类型
初始化
初始化操作是构造一个空的线性表L。即把头结点的下一个结点置为空即可。
Status InitList(LinkList *L)
{
*L=(LinkList)malloc(sizeof(struct LNode));
if(!(*L))
exit(OVERFLOW);
(*L)->next=NULL;
return OK;
}
插入
其基本操作是再第i号元素前插入新的元素e,L的长度便增加1.
基本思路:
删除
其基本操作是:删除线性表L的第i个数据元素,并用e返回其值,线性表L的长度便减1。
遍历
其基本操作是:依次对线性表L的每个数据元素调用函数visit()。一旦visit()失败,则操作失败。
Status ListTraverse(LinkList L,void(*vi)(ElemType))
{
LinkList p=L->next;
while(p)
{
vi(p->data);
p=p->next;
}
printf("\n");
return OK;
}
void visit(ElemType e)
{
printf("%d ",e);
}
获取内容
其基本操作是用e返回线性表L中的第i个数据元素的值。
Status GetElem(LinkList L,int i,ElemType *e)
{
int j=1;
LinkList p=L->next;
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||j>i)
return ERROR;
*e=p->data;
return OK;
}
检索
其基本操作是:返回线性表L中第一个与e满足关系compare()的数据元素的位序,若这样的数据元素不存在,则返回值为0。
Status LocateElem(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType))
{
int i=1;
LinkList p=L->next;
while(p)
{
if(compare(p->data,e))
return i;
p=p->next;
i++;
}
return 0;
}
Status comp(ElemType c1,ElemType c2)
{
if(c1==c2)
return TRUE;
else
return FALSE;
}
判空
判空的操作是若线性表L为空表则返回TRUE,否则返回FALSE。
Status ListEmpty(LinkList L)
{
if(!L->next)
return TRUE;
else
return FALSE;
}
求长度
基本操作:从链表的首元结点开始计数,得到的计数结果即是该链表的长度。
Status ListLength(LinkList L)
{
LinkList p=L->next;
int i=0;
while(p)
{
i++;
p=p->next;
}
return i;
}
清空
基本操作是:将链表中的所有结点删除,剩下一个头结点。
Status ClearList(LinkList L)
{
LinkList p=L->next,q;
while(p)
{
q=p->next;
free(p);
p=q;
}
L->next=NULL;
return OK;
}
销毁
其基本操作是:释放掉所有的结点包括头结点。
Status DestroyList(LinkList *L)
{
LinkList p;
while(*L)
{
p=(*L)->next;
free(*L);
*L=p;</