数据结构学习日记(5)——单链表的代码实现

链表是顺序表的一种,而单链表是链表中最简单的一种,所以单链表的代码实现逻辑还是比较简单的。

#ifndef NODE_H
#define NODE_H
#include <iostream>

using namespace std;

class Node
{
public:
    int date; //数据域这里定为int型
    Node *next; // 这里的指针是指向下一个结点的,所以类型为Node
    void printNode();
};

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

#endif
这个是链表元素的头文件

............................................................................

#ifndef  MYQUEUE_H
#define  MYQUEUE_H

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include "Node.h"

using namespace std;

class List
{
public:
    explicit List(); //链表与顺序表不同,不需要一开始就指定好大小,每增加一个结点都可以从堆里面临时      申请
                             //并将临时申请的内存赋值之后挂载在链表当中
    ~List();
    void ClearList();
    bool ListEmpty();
    int ListLength();
    bool GetElem(int i, Node *e);
    int LocateElem(Node *e); // 定位指定元素的位置
    bool ListInsert(int i, Node *e);
    bool PriorElem(Node *currentNode, Node *preNode);
    bool NextElem(Node *currentNode, Node *nextNode);
    bool listDelete(int i, Node *tNode);
    bool ListInsertHead(Node *pNode);
    bool ListInsertTail(Node *pNode);
    void ListTraverse();
private:
    Node *m_plist;
    int m_length;
};

List::List()
{
    m_length = 0; // 虽然定义了一个结点,但是没有什么意义并不在当前的链表中,所以长度还是赋值为0
    m_plist = new Node;
    m_plist->date = 0;
    m_plist->next = NULL;
}

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()
 {
     if (m_length == 0)
         return true;
     else
         return false;
 }

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

 bool  List::GetElem(int i,Node *e)
 {  
     if (i < 0 || i >= m_length)
         return false;
     else
     {
         Node *currentnode = m_plist;
         for (int k(0); k <= i; ++k)
         {
             currentnode = currentnode->next;
         }
         e->date = currentnode->date;
         return true;
     }

 }

 int List::LocateElem(Node *e)
 {   
     Node *currentnode = m_plist;
     int count(0);
         while (currentnode->next != NULL)
         {           
             currentnode = currentnode->next;
             if (currentnode->date==e->date)
             {
                 return count;
             }
             count++;
         }
         return -1;  //没有找到的时候要return -1
 }

 bool List::ListInsert(int i, Node *e)
 {  
     if (i<0 || i>m_length)
     {
         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->date = e->date;
     Newnode->next = currentnode->next;
     currentnode->next = Newnode;
     return true;        
 }

 bool List::PriorElem(Node *currentNode,Node *preNode)
 {
     Node *currentnode = m_plist;
     Node *tempNode = NULL;
     while (currentnode->next != NULL)
     {   
         tempNode = currentnode;
         currentnode = currentnode->next;
         if (currentnode->date == currentNode->date)
         {
             preNode->date = tempNode->date;
             return true;
         }
     }
     return false;
 }

 bool List::NextElem(Node *currentNode, Node *nextNode) //用currentNode 来定位要找到的那个数据,然后将它的下个数据存在nextNode中
 {
     Node *currentnode = m_plist;
     while (currentnode->next != NULL)
     {
         currentnode = currentnode->next;
         if (currentnode->date == currentNode->date)
         {
             if (currentnode->next == NULL)
             {
                 return false;
             }
             currentnode = currentnode->next;
             nextNode->date = currentnode->date;
             return true;
         }
     }
     return false;
 }

 bool List::listDelete(int i, Node *tNode) //删除的是第i个结点的下一个结点
 {   
     if (i<0 || i>=m_length)
     return false;
     Node *currentnode = m_plist;
     Node *previousnode = NULL;
     for (int k(0); k <=i; k++)
     {   
         previousnode = currentnode;
         currentnode = currentnode->next;
     } 
     previousnode->next = currentnode->next;
     tNode->date = currentnode->date;
     delete currentnode;
     currentnode = NULL;
     m_length--;
     return true;
 }

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

 bool List::ListInsertHead(Node *pNode)
 {   
     Node *temp = m_plist->next;
     Node *NewNode = new Node;
     if (NewNode == NULL)
     {
         return false;
     }
     NewNode->date = pNode->date;
     m_plist->next = NewNode;
     NewNode->next = temp;
     m_length++;
     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->date = pNode->date;
     Newnode->next = NULL;
     currentnode->next = Newnode->next;
     m_length++;
     return true;
 }
#endif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值