链式表的实现(C++)

linklist.cpp文件

主要包括基本操作,初始化、销毁链表等。

#include 
# include"linklist.h"

using namespace std;

/******************************
*      链式表     *
*
*/


/*
*初始化链式表
*/
void InitLinkList(LinkList* L)
{
	*L = (LinkList)malloc(sizeof(LNode));
	if (!L)
		exit(OVERFLOW);
	(*L)->next = NULL;
}

/*
*销毁链表,不存在该链表了
*/
void DestroyLinkList(LinkList* L)  // (LinkList* L)表示这个指针指向的内存空间
{
	LinkList temp;
	while (*L)
	{
		temp = (*L)->next;
		free(*L);
		*L = temp;
	}
}
/*
插入元素
*/
Status InsertLinkListElem(LinkList L, int i, Elemtype e)
{
	int j = 0; 
	LinkList s, p = L;
	// 先找到插入位置的前一个位置处的结点
	while (p && j < i - 1)
	{
		++j;
		p = p->next;
	} 
	
	if (!p || j > i - 1)
		return ERROR;
	// 分配内存
	s = (LinkList)malloc(sizeof(LNode));  // 链表存储是不相邻的
	// 添加第i个结点s
	// 插入结点
	s->data = e;
	s->next = p->next;
	p->next = s;
	return OK;
}
/*
*删除元素
*/
Status DeleteLinkListElem(LinkList L, int i, Elemtype* e)
{
	int j = 0;
	LinkList p = L; 
	LinkList q = L;
	while (p->next && j < i - 1)
	{
		++j;
		p = p->next;
	}
	if (!p->next || j > i - 1)
		return ERROR;  // 如果删除的是尾结点报错
	// 删除q结点
	q = p->next;
	p->next = q->next;
	*e = q->data;
	free(q);
	return OK;
}
/*
根据位置获取元素
*/
Status GetLinkListElem(LinkList L, int i, Elemtype* e)
{
	int j = 1;
	LinkList p = L->next;
	while (p && j < i)
	{
		j++;
		p = p->next;
	}
	if (!p || j > i)
		return ERROR;
	*e = p->data;
	return OK;
}
/*
清空线性表,变成了空表
*/
void ClearLinkList(LinkList L)
{
	LinkList p = L->next;
	L->next = NULL;
	DestroyLinkList(&p);
}

/*
判断是否为零
*/
Status isLinkListEmpty(LinkList L)
{
	if (L->next)
		return FALSE;
	else
		return TRUE;
}

/*
获取长度
*/
int GetLinkListLength(LinkList L)
{
	int i = 0;
	LinkList p = L->next;  // 如果是空表,返回0
	while (p)
	{
		++i;
		p = p->next;
	}
	return i;
}
 
/*
比较两个元素是否相等
*/
Status CompareLinkListElem(Elemtype e1, Elemtype e2)
{
	if (e1 == e2)
		return 0;
	else if (e1 < e2)
		return -1;
	else
		return 1;
}

/*
查找指定元素的位置
*/
int FindLinkListElem(LinkList L, Elemtype e, Status(*compare)(Elemtype, Elemtype))
{
	int i = 0;
	LinkList p = L->next;
	while (p)
	{
		++i;
		if (!compare(p->data, e))
			return i;
		p = p->next;
	}
	return 0;
}
/*
获取前驱元素
*/
Status PreLinkListElem(LinkList L, Elemtype cur_e, Elemtype *pre_e)
{
	LinkList q, p = L;
	while (p->next)
	{

		q = p->next;  // 暂时存储前驱节点
		if (cur_e == q->data)
		{
			*pre_e = p->data;
			return OK;
		}
		p = q;
	}
	
}

/*
获取后继元素
*/
Status NextLinkListElem(LinkList L, Elemtype e, Elemtype* next_e)
{
	LinkList p = L;
	while (p->next)
	{
		
		if (p->data == e)
		{
			*next_e = p->next->data;
			return OK;
		}
		p = p->next;		
	}
	return ERROR;
}
/*
访问元素
*/
void visitLinkList(Elemtype e)
{
	cout << dec <next;
	while (p)
	{
		visit(p->data);
		p = p->next;
	}
}


int testLinkList()
{
	LinkList L;
	InitLinkList(&L);
	Elemtype e;
	int i;
	if (L)
		cout << "Init success" << endl;
	if (isLinkListEmpty(L))
		cout << "list is emoty" << endl;
	for (i = 0; i < 100; i++)
		InsertLinkListElem(L, i + 1, i);
	if (GetLinkListElem(L, 1, &e))
		cout << "the first element is " << dec << e << endl;

	cout << "the length of L is " << dec << GetLinkListLength(L) << endl;
	cout << "the 5 at " << dec << FindLinkListElem(L, 5, *CompareLinkListElem) << endl;

	PreLinkListElem(L, 6, &e);
	cout << "the 6's previous element is " << dec << e << endl;

	NextLinkListElem(L, 6, &e);
	cout << "the 6's next element is " << dec << e << endl;

	DeleteLinkListElem(L, 1, &e);
	cout << "delete first element : " << dec << e << endl;

	cout << "list is :" << endl;
	TraverseLinkList(L, visitLinkList);
	ClearLinkList(L);
	cout << "After clear, the length of L is " << dec << GetLinkListLength(L) << endl;
	DestroyLinkList(&L);
	if (!L)
		cout << "destroy success" << endl;

	return 0;
}

linklist.h文件

宏定义和结构体定义,函数声明等

#ifndef __LINKLIST_H__
#define __LINKLIST_H__
#include 
# define OK 1  // 操作成功
# define ERROR 0  // 操作失败
# define TRUE 1  // 真
# define FALSE 0  // 假
using namespace std;
typedef int Elemtype;  // 定义结构体元素的类型
typedef int Status;  // 定义别名
/*
存储结构
*/
typedef struct LNode
{
	Elemtype data;
	struct LNode* next;
}LNode, * LinkList;

void ClearLinkList(LinkList L);
Status compaCompareLinkListElemre(Elemtype e1, Elemtype e2);
Status DeleteLinkListElem(LinkList L, int i, Elemtype* e);
void DestroyLinkList(LinkList* L);
int FindLinkListElem(LinkList L, Elemtype e, Status(*compare)(Elemtype, Elemtype));
Status GetLinkListElem(LinkList L, int i, Elemtype* e);
int GetLinkListLength(LinkList L);
void InitLinkList(LinkList* L);
Status InsertLinkListElem(LinkList L, int i, Elemtype e);
Status isLinkListEmpty(LinkList L);
Status NextLinkListElem(LinkList L, Elemtype e, Elemtype* next_e);
Status PreLinkListElem(LinkList L, Elemtype cur_e, Elemtype* pre_e);
int testLinkList();
void TraverseLinkList(LinkList L, void(*visit)(Elemtype));
void visitLinkList(Elemtype e);

#endif 


最后在main函数中调用testLinkList()函数得到
链式表的实现(C++)_第1张图片

你可能感兴趣的:(源码)