C++ 链表实现

Node.h

    #pragma once
    class Node
    {
    public:
    	int data;
    	Node *next;
    };

List.h

    #pragma once
    #include "Node.h"
    #ifndef LIST_H
    #define LIST_H
    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);
    	Node *m_pList;
    	int m_iLength;
    };
    #endif

List.cpp

    #include"List.h"
    #include<iostream>
    using namespace std;
    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->next = NULL;
    }
    bool List::ListEmpty()
    {
    	return 0 == m_iLength ? true : false;
    }
    int List::ListLength()
    {
    	return m_iLength;
    }
    bool List::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 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 true;
    		}
    	}
    	return false;
    }
    bool List::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 List::ListTraverse()
    {
    	Node *currentNode = m_pList;
    	while (currentNode->next != NULL)
    	{
    		currentNode = currentNode->next;
    		cout<<currentNode->data<<endl;
    	}
    }
    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;
    	m_iLength++;
    	return true;
    }
    bool List::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 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->data = pNode->data;
    	newNode->next = NULL;
    	currentNode->next = newNode;
    	m_iLength++;
    	return true;
    
    }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值