数据结构——链表(c++ 实现)

一.静态链表

静态链表没有指针但是也可以实现链表的结构,可以通过数组来实现,如下图所示,头结点数为1,说明下一个指向1;然后1的头结点数是4,下一个元素便指向4号,4号的头结点数为2.。。。。。

 

一.单链表

 

代码实例:

#include<stdlib.h>
#include<iostream>
using namespace std;

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

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



class List
{

private:
	Node *m_pList;
	//int m_iSize;
	int m_iLength;


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

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

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

	}

	bool ListEmpty()
	{
		if (m_iLength == 0)
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	int ListLength()
	{
		return m_iLength;
	}



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

	}

	bool 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++;

	}

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

	bool GetElem(int i, Node *pNode)
	{
		if (i < 0 || i >= m_iLength)
		{
			return false;
		}
		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 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 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 true;
			}
		}
		return false;
	}


	bool NextElem(Node *pCurrentNode, Node *pNextNode)
	{
		Node *currentNode = m_pList;
		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 ListTraverse()
	{
		Node *currentNode = m_pList;
		while (currentNode->next != NULL)
		{
			currentNode = currentNode->next;
			currentNode->printNode();
		}
	
	}

};

int main(void)
{
	Node node1;
	node1.data = 3;
	Node node2;
	node2.data = 4;
	Node node3;
	node3.data = 5;
	Node node4;
	node4.data = 6;

	Node node5;
	node5.data = 7;
	Node temp;

	List *pList = new List();

	/*pList->ListInsertHead(&node1);
	pList->ListInsertHead(&node2);
	pList->ListInsertHead(&node3);
	pList->ListInsertHead(&node4);*/

	pList->ListInsertTail(&node1);
	pList->ListInsertTail(&node2);
	pList->ListInsertTail(&node3);
	pList->ListInsertTail(&node4);

	pList->ListInsert(1, &node5);
	
	//pList->ListDelete(1, &temp);
	pList->NextElem(&node5, &temp);

	pList->ListTraverse();
	cout <<"temp:"<< temp.data << endl;


	delete pList;
	pList = NULL;

	system("pause");
	return 0;
}

 

 

二.循环链表

 

三.双向链表

有两个指针域,一个指针域走正向一个指针域走反向!

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值