码迷,mamicode.com
首页 > 编程语言 > 详细

线性表之单链表C++实现

时间:2018-08-02 02:01:18      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:strong   清空   turn   ext   调用   链表   指定   lse   while   

需要实现的方法

#pragma once
#include"Node.h"
#ifndef LIST_H
#define LIST_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

1.构造函数

堆中为头结点m_pList申请内存

m_pList数据域置为0

指向地址为空,事实上这里声明了一个头结点,头结点没有后继结点并且数据域为空

长度置为0

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

2.析构函数

调用清空链表方法

删除头结点并置空

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

3.清空链表

声明一个Node*类型的指针指向m_pList的下一个结点,特别指明:m_pList是头结点,m_pList->next是头结点的指针域

判断currentNode是否为空,即判断m_pList的指针域是否为空,为空说明currentNode是尾结点,尾结点没有后继结点

currentNode不为空时,声明一个Node*类型的指针temp指向currentNode的下一个结点,也可以理解为temp接收currentNode的指针域值

删除当前的currentNode,再把temp保存的currentNode的指针域赋值回去

依次类推...

循环结束,再把尾结点指针域置空

清空链表和析构函数的区别:清空链表是将头结点之后的结点全部清空,析构函数是把头结点和之后的结点全部清空

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

4.链表判空与获取长度

没什么好说的

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

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

5.在头结点后面插入元素

pNode指针作为参数传入

temp保存头结点的指针域,指向第一个结点

在堆中申请一个newNode指针的内存

没申请到内存返回错误

申请到内存,参数的数据域赋值给新结点数据域

头结点指向新结点

新结点指向原来头结点的下一个结点,这样链表就连接起来了

bool List::ListInsertHead(Node *pNode)
{
    Node *temp = m_pList->next;
    Node *newNode = new Node;
    if (newNode == NULL) //判断申请的结点内存是否为空
    {
        return false;
    }
    else
    {
        newNode->data = pNode->data;
        m_pList->next = newNode;
        newNode->next = temp; 
        m_iLength++;
        return true;
    }
}

6.在尾结点后面插入元素

pNode指针作为参数传入

currentNode接收头结点

判断currentNode是否是尾结点,因为尾结点后继结点为空

循环到最后一个结点,此时currentNode->next=NULL

在堆中申请一个newNode的内存

没申请到内存返回错误

申请到内存

pNode的数据域赋值给newNode的数据域

新结点指针域置空

currentNode指向新结点

新结点指向空,这样链表就连接起来了,新结点成为了新的尾结点

链表长度++

返回正确

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;
    }
    else
    {
        newNode->data = pNode->data;
        newNode->next = NULL;
        currentNode->next = newNode;
        m_iLength++;
        return true;
    }
}

 7.插入元素

判断参数i的合法性

i不能小于0,i不能大于链表长度

currentNode保存头结点

声明newNode

pNode数据域赋值给newNode数据域

新结点指向原来结点的下一个结点

原来的结点指向新结点

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;
    }
    else
    {
        newNode->data = pNode->data;
        newNode->next = currentNode->next;
        currentNode->next = newNode;
        return true;
    }
}

 

线性表之单链表C++实现

标签:strong   清空   turn   ext   调用   链表   指定   lse   while   

原文地址:https://www.cnblogs.com/Java-Starter/p/9404774.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!