增加头结点的作用
(1)便于首元结点的处理
增加了头结点后,首元结点的地址保存在头结点(即其 “前驱” 结点)的指针域中,则对链表
的第一个数据元素的 *** 作与其他数据元素相同,无需进行特殊处理。
(2)便于空表和非空表的统一处理
当链表不设头结点时,假设 L 为单链表的头指针,它应该指向首元结点,则当单链表为长度
n 为 0 的空表时, L 指针为空(判定空表的条件可记为:L== NULL)。
增加头结点后,无论链表是否为空,头指针都是指向头结点的非空指针。非空单链表,头指针指向头结点。
若为空表,则头结点的指针域为空(判定空表的条件可记为:(L ->next== NULL),
#include "LinkLinearTable.hpp"
#include
using namespace std;
//初始化
Status InitList(LinkList& L)
{
L = new LNode;
if (L == NULL) return ERROR;
L->data = -1;
L->next = NULL;
return OK;
}
//按值查找
LNode* LocateElem(const LinkList& L, ElemType e)
{
LNode* p = L->next;
while (p)
{
if (p->data == e)
{
return p;
}
p = p->next;
}
return NULL;
}
//销毁单链表
Status DestroyList(LinkList& L)
{
LNode* p = L->next;
LNode* t = p;
while (p)
{
t = p->next;
delete p;
p = t;
}
return OK;
}
//清楚链表
Status ClearList(LinkList& L)
{
return Status();
}
//位置pos处将e插入单链表
Status ListInsert(LinkList& L, int pos, ElemType e)
{
LNode* p = L;
int j = 0;
while (p && j < (pos - 1)) {
p = p->next;
j++;
}
if (!p || j > (pos - 1)) {
return ERROR;
}
LNode* s = new LNode;
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
//删除单链表pos位置上的节点
Status ListDelete(LinkList& L, int pos)
{
LNode* p = L;
int j = 0;
while (p && j < (pos - 1)) {
p = p->next;
j++;
}
if (!p || j > (pos - 1)) {
return ERROR;
}
LNode* del = p->next;
p->next = del->next;
delete del;
return OK;
}
//链表遍历
Status ListTraverse(const LinkList& L)
{
LNode* p = L->next;
while (p)
{
cout << p->data << " ";
p = p->next;
}
}
//单链表是否为空
bool IsEmpty(const LinkList& L)
{
return L->next == NULL ? true : false;
}
//获取位置i上的值
Status GetElem(const 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;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)