单链表——SList

单链表:

 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
 如图显示:

这里写图片描述

这里写图片描述

DATA域中存放节点的数据,而NEXT域则存放节点下一个要指向的位置(后继)。
链表就如同现实生活中的火车一样,每个车厢都需要一个链子来进行链接,这“链子”就是指针了。
不多说了,直接上代码如何进行表示单链表。

首先我把链表分为以下几步:
1、创建链表
2、销毁链表
3、清空链表
4、获得链表的长度
5、链表的插入
6、链表头节点的插入
删除节点和插入操作相类似

//首先定义节点,如果数据不多,不具备多种属性,可以采用C语言中的Struct,使用C++中的class也是可以的
typedef struct Node
{
    int data;
    Node *next;
    void print();
};
//或者
class Node
{
 public:
     int data;
     Node *next;
     void print();
     };
void Node::print()
{
    cout << data << endl;
}

//开始定义链表类
#include <iostream>
using namespace std;
class List
{
public:
     List();                                                  //创建链表
    ~List();                                                  //销毁链表
    void ClearList();                                         //清空链表
    int ListLength();                                         //链表长度
    void ListTraverse();                                      //遍历链表
    bool ListInsert(int i, Node *pNode);                       //链表插入
    bool ListInsertHead(Node *pNode);                         //插入在头结点之后
private:
    Node *m_plist;
    int m_iLength;                                           //链表长度
};

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;
}
int List::ListLength()
{
    return m_iLength;
}
void List::ClearList()
{
    Node *currentElem = m_plist->next;         //定义一个节点指向链表所指的下一位置
    while (currentElem != NULL)
    {
        Node *temp = currentElem->next;
        delete currentElem;
        currentElem = temp;
    }
    m_plist->next = NULL;
}
bool List::ListInsertHead(Node *pNode)
{
    Node *temp = m_plist->next;          //pNode节点将要插入,temp保存当前链表的下一个节点  
    Node *newNode = new Node;            //定义新节点
    if (newNode == NULL)
    {
        return false;
    }
    newNode->data = pNode->data;         //将当前链表的值赋给新节点
    m_plist->next = newNode;            //当前链表和新节点建立链接
    newNode->next = temp;              //新节点插入完毕,链接temp
    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 = m_plist->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;
}
void List::ListTraverse()
{
    Node *currentNode = m_plist;              //头节点
    while(currentNode->next != NULL)
    {
        currentNode = currentNode->next;
        currentNode->printNode();
    }
}

int main()
{
    Node node1;
    node1.data = 3;
    Node node2;
    node2.data = 4;
    Node node3;
    node3.data=7;
    int a;
    List *pList = new List();
    pList->ListInsertHead(&node1);
    pList->ListInsertHead(&node2);
    pList->ListInsert(1, &node3);
    a = pList->ListLength();
    cout << "Length: " << a << endl;
    pList->ListTraverse();
    delete pList;
    pList = NULL;
    system("pause");
    return 0;
}

大概就这样!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值