线性表的链式表示和实现
用任意存储单元存储线性表的数据元素(存储单元可以连续也可以不连续)
结点包括数据域和指针域
链表的存取必须从头指针开始
头指针指示链表中第一个结点
线性表最后一个结点的指针为空
一.线性表的存储结构
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
二.带有头结点的单链表的基本操作(12个)
- 构造空线性表
void InitList(LinkList &L){
L=(LinkList)malloc(sizeof(LNode));
if (!L) exit(OVERFLOW);
L->next=NULL;//头结点的指针域为空
}
- 销毁线性表L
void DestriyList(LinkList &L){
LinkList q;
while(L){
q=L->next;
free(L);
L=q;
}
}
- 将L重置为空表
void ClearList(LinkList L)//不改变L
{
LinkList p=L->next;//p指向第一个结点
L->next=NULL;//头结点指针域为空
DestroyList(p);//销毁p所指的单链表
}
重置为空链表即在不销毁头结点的前提下销毁剩下的结点
- 判断L是否为空,为空返回True
Status ListEmpty(LinkList L){
if(L->next)//非空
return FALSE;
else return TRUE;
}
- 返回L中元素个数
int ListLength(LinkList L){
int i=0;
LinkList p=L->next;//p指向第一个结点
while(p){
i++;
p=p->next;
}
return i;
}
- 第i个元素存在,赋值给e并返回OK,否则返回ERROR
Status GetElem(LinkList L,int i,ElemType &e){
LinkList p=L->next;
int j=1;
while(j<i&&p){
p=p->next;
j++;
}
if(!p||j>i)return ERROR;
e=p->data;
return OK;
}
- 返回第一个与e满足compare关系的元素位序,如果不存在返回0
int LocateElem(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType))
{
int i=0;//计数器初值为0
LinkList p=L->next;
while(p)//未到表尾
{
i++;
if(compare(p->data,e))return i;
p=p->next;
}
return 0;
}
- 返回cur_e的前驱pre_e,返回OK;若操作失败pre_e无定义,返回ERROR
Status PriorElem(LinkList L,ElemType cur_e,ElemType &pre_e){
LinkList q,p=L->next;
for(p&&p->next){
q=p->next;
if(q->data==cur_e){
pre_e=p->data;
return OK;
}
q=p;//p的后继不为cur_e,p后移
}
return ERROR;
}
- 返回cur_e的后继next_e
Status NextElem(LinkList L,ElemType cur_e,ElemType next_e){
LinkList p=L->next;
while(p&&p->next){
if(p->data==cur_e){
next_e=p->next->data;
return OK;
}
p=p->next;
}
return ERROR;
}
- 在第i个位置插入元素e
Status ListInsert(LinkList &L,int i,ElemType e){
LinkList p=L;
j=0;
while(j<i-1&&p){
p=p->next;
j++;
}
if(!p||j>i-1)return ERROR;
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
- 在L中删除第i个元素,并用e返回其值
Status DeleteList(LinkList &L,int i,ElemType &e){
int j=0;
LinkList q,p=L;
while(j<i-1&&p){
j++;
p=p->next;
}
if(j>i-1||!p->next)return ERROR;
q=p->next;
e=q->data;
p->next=q->next;
free(q);
return OK;
}
- 依次对L中的每个元素调用visit()
void ListTraverse(LinkList L,void(*visit)(ElmeType)){
LinkList p=L->next;
while(p){
visit(p->data);
p=p->next;
}
printf("\n")
}