您的位置:首页 > 其它

带头结点的单链表的操作 学习总结

2015-09-15 21:04 447 查看

带头结点的单链表的操作 学习总结

首先给出单链表的存储结构定义如下:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: