数据结构4---单链表

单链表:

增加头结点的作用
(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;
}

你可能感兴趣的:(数据结构与算法,数据结构)