《数据结构之链表篇》--单向链表的C++实现

节点类Node的实现:

头文件:

#pragma once
#ifndef NODE_H_
#define NODE_H_

#include<iostream>
using namespace std;

class Node
{
public:
	int data;
	Node *next;
	void printNode();
};


#endif // !NODE_H_


--CPP文件:
#include "Node.h"

void Node::printNode()
{
	cout << data << endl;
}


--单向链表的实现:
--头文件:

#pragma once
#ifndef LIST_H_
#define LIST_H_

#include"Node.h"
#include<iostream>
using namespace std;

class List
{
public:
	List();
	~List();
	void ClearList();	//清空链表
	bool ListEmpty();	//判空链表
	int ListLength();	//链表长度
	bool GetElem(int i, Node *pNode);	//获得指定元素
	int LocateElem(Node *pNode);	//找寻指定节点
	bool PriorElem(Node *pCurrentNode, Node *pPreNode);	//获得指定节点的前一个节点
	bool NextElem(Node *pCurrentNode, Node *pNextNode);	//获得指定节点的后一个节点
	void ListTraverse();	//遍历链表
	bool ListInsert(int i, Node *pNode);	//在链表指定位置插入元素
	bool ListDelete(int i, Node *pNode);	//在链表指定位置删除元素
	bool ListInsertHead(Node *pNode);	//在链表头插入元素
	bool ListInsertTail(Node *pNode);	//在链表尾部插入元素
private:
	Node *m_pList;
	int m_iLength;
};


#endif // !LIST_H_

--CPP文件:

#include "List.h"

List::List()
{
	m_pList = new Node;
	m_pList->data = 0;
	m_pList->next = NULL;
	m_iLength = 0;
}

List::~List()
{
	ClearList();
	delete m_pList;
	m_pList = NULL;
}

void List::ClearList()
{
	Node *currentNode = m_pList->next;
	while (currentNode!=NULL)
	{
		Node*temp = currentNode->next;
		delete currentNode;
		currentNode = temp;
	}
	m_pList = NULL;
}

bool List::ListEmpty()
{
	return m_iLength == 0 ? true : false;
}

int List::ListLength()
{
	return m_iLength;
}

bool List::GetElem(int i, Node * pNode)
{
	if (i < 0 || i >= m_iLength)
	{
		return false;
	}

	//获取第i个节点
	Node *currentNode = m_pList;
	Node *currentNodeBefore = NULL;
	for (int k = 0; k <= i; k++)
	{
		currentNodeBefore = currentNode;
		currentNode = currentNode->next;
	}
	pNode->data = currentNode->data;
	return true;
}

int List::LocateElem(Node * pNode)
{
	Node *currentNode = m_pList;
	int count = 0;
	while (currentNode->next != NULL)
	{
		currentNode = currentNode->next;
		if (currentNode->data == pNode->data)
		{
			return count;
		}
		count++;
	}
	return -1;
}

bool List::PriorElem(Node * pCurrentNode, Node * pPreNode)
{
	Node *currentNode = m_pList;
	Node *tempNode = NULL;
	while (currentNode->next != NULL)
	{
		tempNode = currentNode;
		currentNode = currentNode->next;
		if (currentNode->data == pCurrentNode->data)
		{
			if (tempNode == m_pList)
			{
				return false;
			}
			pPreNode->data = tempNode->data;
		}
	}
	return false;
}

bool List::NextElem(Node * pCurrentNode, Node * pNextNode)
{
	Node *currentNode = m_pList;
	Node *tempNode = NULL;
	while (currentNode->next != NULL)
	{
		currentNode = currentNode->next;
		if (currentNode->data == pCurrentNode->data)
		{
			if (currentNode->next == NULL)
			{
				return false;
			}
			pNextNode->data = currentNode->next->data;
			return true;
		}
	}
	return false;
}

void List::ListTraverse()
{
	Node *currentNode = m_pList;
	while (currentNode->next != NULL)
	{
		currentNode = currentNode->next;
		currentNode->printNode();
	}
}

bool List::ListInsert(int i, Node * pNode)
{
	if (i<0 || i>m_iLength)
	{
		return false;
	}
	Node *currentNode = m_pList;
	for (int k = 0; k < i; k++)
	{
		currentNode = currentNode->next;
	}
	Node *newNode = new Node;
	if (newNode == NULL)
	{
		return false;
	}
	newNode->data = pNode->data;
	newNode->next = currentNode->next;
	currentNode->next = newNode;
	return true;
}

bool List::ListDelete(int i, Node * pNode)
{
	if (i < 0 || i >= m_iLength)
	{
		return false;
	}
	Node *currentNode = m_pList;
	Node *curentNodeBefore = NULL;
	for (int k = 0; k <= i; k++)
	{
		curentNodeBefore = currentNode;
		currentNode = currentNode->next;
	}
	curentNodeBefore->next = currentNode->next;
	pNode->data = currentNode->data;
	delete currentNode;
	currentNode = NULL;
	m_iLength--;
	return true;
}

bool List::ListInsertHead(Node * pNode)
{
	Node *temp = m_pList->next;
	Node *newNode = new Node;
	if (newNode == NULL)
	{
		return false;
	}
	newNode->data = pNode->data;
	m_pList->next = newNode; 
	newNode->next = temp;
	m_iLength++;
	return true;

}

bool List::ListInsertTail(Node * pNode)
{
	Node *currentNode = m_pList;
	while (currentNode->next != NULL)
	{
		currentNode = currentNode->next;
	}
	Node *newNode = new Node;
	if (newNode == NULL)
	{
		return false;
	}
	*newNode = *pNode;
	newNode->next = NULL;
	currentNode->next = newNode;
	m_iLength++;
	return true;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值