带头结点的单链表的操作 学习总结
首先给出单链表的存储结构定义如下:
struct LNode
{
Elemtype date;
LNode* next;
};
typedef LNode* LinkList;
下面是带头结点的单链表的基本操作:
初始化
// 构造一个空线性表L
void InitList(LinkList& L)
{
// 产生头结点,并使L指向该头结点
L = (LinkList)malloc(sizeof(LNode));
if(!L)
{
// 异常
}
}
销毁线性表
// 前提:线性表L存在
void DestroyList(LinkList& L)
{
LinkList q;
while(L)
{
q = L->next; // q指向头结点之后的第一个结点
free(L);
L = q; // L现在指向头结点之后的第一个结点
}
}
单链表置空
// 前提:单链表存在
void ClearList(LinkList& L)
{
LinkList q = L->next; // q指向头结点之后的结点
L->next = NULL;
DestroyList(q);
}
单链表判空
int ListEmpty(LinkList& L)
{
if (L->next)
{
return FALSE;
}
else
{
return TRUE;
}
}
求单链表的长度
// 前提:单链表存在
int ListLength(LinkList L)
{
int length = 0;
LinkList q = L->next; // q指向头结点之后的结点
while(q)
{
length++;
q = q->next;
}
return length;
}
根据索引查找元素
int GetElem(LinkList L, int Index, ElemType& Element)
{
int LoopId = 1;
LinkList q = L->next;
// 直到q指向第Index个结点或第Index个结点不存在
while(q && LoopId < Index)
{
LoopId++;
q = q->next;
}
if (!q || LoopId > Index)
{
return ERROR;
}
Element = q->data;
return OK;
}
根据元素找索引
int LocateElem(LinkList L, ElemType Element)
{
int Index = 0;
LinkList q = L->next;
while(q)
{
Index++;
if(Element == L->data)
{
return Index;
}
q = q->next;
}
return 0;
}
插入新元素
int ListInsert(LinkList L, int Index, ElemType Element)
{
int NumId = 0;
LinkList p = L;
LinkList s;
// 查找第Index - 1 个结点
while(p && NumId < Index - 1)
{
NumId++;
p = p->next;
}
if (!p || NumId > Index - 1)
{
return ERROR;
}
s = (LinkList)malloc(sizeof(LNode));
s->data = Element;
s->next = p->next;
p->next = s;
return OK;
}
删除元素
int ListDelete(LinkList L, int Index, ElemType& Element)
{
int NumId = 0;
LinkList q, p = L;
// p指向第Index个结点的前驱
while(p->next && NumId < Index - 1)
{
NumId++;
p = p->next;
}
if(!p->next||j>i-1)
return ERROR;
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return OK;
}