C++数据结构和算法分析C语言

线性表--链表(C++)

2018-06-22  本文已影响9人  修夏之夏i

Node.h

#ifndef NODE_H
#define NODE_H

class Node
{
public:
    int data;//数据域
    Node* next;//指针域 指向下一个节点
    void printNode();
};

#endif //NODE_F

Node.cpp

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

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

LinkList.h

#ifndef LINKLIST_H
#define LINKLIST_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 //LINKLIST_H

LinkList.cpp

#include "LinkList.h"

List::List()
{
    m_pList = new Node;//new运算符在堆中申请内存
    m_pList->data = 0;
    m_pList->next = NULL;
    m_iLength = 0;
}

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

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

bool List::ListEmpty()
{
    if (m_iLength == 0)
        return true;
    else
        return false;
}
int List::ListLength()
{
    return m_iLength;
}

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; //newNode更新为整个链表的尾节点
    m_iLength ++;
    return true;
}

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; // 插入;
}

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::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;//没找到与pNode相同的数据域
}

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;
        }
    }
}

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

test.cpp

#include "LinkList.h"
#include <stdlib.h>

int main()
{
    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(0, &node5);      //测试任意位置插入
    //pList->ListDelete(0, &temp);   //测试删除函数 删除的值放在temp中
    //pList->GetElem(1, &temp); //测试获取元素
    //pList->PriorElem(&node4, &temp);  //测试取元素前驱
    pList->NextElem(&node1, &temp);//测试取元素的后继

    pList->ListTraverse();

    //cout <<"temp="<< temp.data << endl;  //测试删除函数 删除的值是放在temp中的
    //cout << "temp=" << temp.data << endl;  //测试获取元素 获取的元素是放在temp中
    //cout << "temp=" << temp.data << endl; //测试取元素前驱 获取的前驱是放在temp中的
    cout << "temp=" << temp.data << endl; //测试取元素后继 获取的后继是放在temp中的
    
    delete pList;
    pList = NULL;

    system("pause");
}
运行结果: LinkList.png
上一篇下一篇

猜你喜欢

热点阅读