• C++单链表类(带头结点)


    Link.h

    #ifndef _LINK_0411
    #define _LINK_0411
    #include <string>
    #include <iostream>
    //定义数据类型为整型 
    typedef int ElementType; 
    //定义结点 
    struct Node
    { 
        ElementType data; 
        Node * next;
    };
    //带头结点链表 
    class Link 
    { 
    public: 
        Link(); 
        ~Link(); 
        //选择排序 
        void select_sort(); 
        //冒泡排序 
        void bubble_sort(); 
        //头部插入 
        void insert_head(ElementType data); 
        //尾部插入 
        void insert_tail(ElementType data); 
        //查找结点,返回序号,如果不存在返回-1 
        int find(ElementType data); 
        //删除结点 
        bool delete_node(int pos); 
        //逆置 
        void reverse(); 
        //打印链表 
        void display(); 
        //打印提示信息 
        void printhelp(); 
        //返回长度
        int size(); 
    private: 
        //头结点指针 
        Node * pHead; 
        //链表长度 
        size_t iSize; 
    }; 
    #endif

    Link.cpp

      1 #include "Link.h"
      2 
      3 Link::Link():pHead(NULL), iSize(0)
      4 {
      5     pHead = new Node;
      6     pHead->next = NULL;
      7 }
      8 
      9 Link::~Link()
     10 {
     11     Node * tmpNode = NULL;
     12     Node * p = pHead->next;
     13     while (p != NULL)
     14     {
     15         tmpNode = p->next;
     16         delete p;
     17         p = tmpNode;
     18     }
     19     delete tmpNode;
     20     tmpNode = NULL;
     21 
     22     delete pHead;
     23     p = NULL;
     24 
     25     iSize = 0;
     26 }
     27 
     28 /**********************************
     29    链表选择排序(递增)
     30 ***********************************/
     31 void Link::select_sort()
     32 {
     33     Node * p , *q;
     34     int temp;
     35 
     36     for (p = pHead; p != NULL; p = p->next)
     37         for (q = p->next; q != NULL; q = q->next)
     38         {
     39             if (p->data > q->data)
     40             {
     41                 temp = p->data;
     42                 p->data = q->data;
     43                 q->data = temp;
     44             }
     45         }
     46 }
     47 
     48 /**********************************
     49    链表冒泡排序(递增)
     50 ***********************************/
     51 void Link::bubble_sort()
     52 {
     53     Node *p;
     54     int temp;
     55 
     56     /************************************************************************/
     57     /*       冒泡排序是每次从头开始比较相邻的两个数,大小相反则交换,结束的 */
     58     /*        条件是这一轮中没有发生交换,flag用来记录是否发生了交换          */
     59     /************************************************************************/
     60     int flag;
     61     while (true)
     62     {
     63         flag = 0;
     64         for (p = pHead; p->next != NULL; p = p->next)
     65         {
     66             if (p->data > p->next->data)
     67             {
     68                 temp = p->data;
     69                 p->data = p->next->data;
     70                 p->next->data = temp;
     71                 flag = 1;
     72             }
     73         }
     74         if (flag == 0)
     75             break;
     76     }
     77 }
     78 
     79 /********************************
     80    链表头部插入
     81 *****************************/
     82 void Link::insert_head(ElementType data)
     83 {
     84     Node * tmpNode = new Node;
     85     tmpNode->data = data;
     86     
     87     tmpNode->next = pHead->next;
     88     pHead->next = tmpNode;
     89     
     90     iSize++;
     91 
     92     tmpNode = NULL;
     93 }
     94 
     95 /********************************
     96    链表尾部插入
     97 *****************************/
     98 void Link::insert_tail(ElementType data)
     99 {
    100     Node * tmpNode = new Node;
    101     tmpNode->data = data;
    102     tmpNode->next = NULL;
    103 
    104     Node * p = NULL;
    105     p = pHead;
    106     while (p->next != NULL)
    107     {
    108         p = p->next;
    109     }
    110 
    111     p->next = tmpNode;
    112     iSize++;
    113 
    114     //delete tmpNode;
    115     tmpNode = NULL;
    116     //delete p;
    117     p = NULL;
    118 }
    119 
    120 /********************************
    121    打印链表
    122 *****************************/
    123 void Link::display()
    124 {
    125     int count = 1;
    126     Node * tmpNode = NULL;
    127 
    128     tmpNode = pHead->next;
    129     while (tmpNode != NULL)
    130     {
    131         std::cout<<tmpNode->data<<" ";
    132         tmpNode = tmpNode->next;
    133 
    134         /********************************
    135         *  输出格式控制,每行10个
    136         **********************************/
    137         if (count % 10 == 0)
    138         {
    139             std::cout<<std::endl;
    140         }
    141         count++;
    142     }
    143     std::cout<<std::endl;
    144     tmpNode = NULL;
    145 }
    146 
    147 /********************************
    148    查找结点
    149 *****************************/
    150 int Link::find(ElementType data)
    151 {
    152     int pos = 0;
    153     Node * tmpNode = NULL;
    154 
    155     tmpNode = pHead->next;
    156     while (tmpNode != NULL)
    157     {
    158         if ( tmpNode->data == data)
    159         {
    160             return pos;
    161         }
    162         tmpNode = tmpNode->next;
    163         pos++;
    164     }
    165 
    166     tmpNode = NULL;
    167     return -1;
    168 }
    169 
    170 /********************************
    171    删除结点
    172 *****************************/
    173 bool Link::delete_node(int pos)
    174 {
    175     //序号超过链表范围则报错退出
    176     if (pos > iSize -1)
    177     {
    178         return false;
    179     }
    180     else
    181     {
    182         int k = 0;
    183         Node * tmpNode = NULL;
    184         tmpNode = pHead;
    185         while ( k < pos)
    186         {
    187             tmpNode = tmpNode->next;
    188             k++;
    189         }
    190         Node * p = NULL;
    191         p = tmpNode->next;
    192 
    193         tmpNode->next = tmpNode->next->next;
    194         delete p;
    195         p = NULL;
    196         iSize--;
    197         return true;
    198     }
    199 }
    200 
    201 /********************************
    202    返回链表的长度
    203 *****************************/
    204 int Link::size()
    205 {
    206     return iSize;
    207 }
    208 
    209 /********************************
    210    链表的逆置
    211 *****************************/
    212 void Link::reverse()
    213 {
    214     Node * preNode = NULL;
    215     Node * curNode = NULL;
    216     Node * afterNode = NULL;
    217 
    218     if ( iSize == 1 || iSize == 0)
    219     {
    220         return;
    221     }
    222     else if ( iSize >= 2)
    223     {
    224         preNode = pHead->next;
    225         curNode = preNode->next;
    226         afterNode = curNode->next;
    227 
    228         preNode->next = NULL;
    229         
    230         while (afterNode != NULL)
    231         {
    232             curNode->next = preNode;
    233 
    234             preNode = curNode;
    235             curNode = afterNode;
    236 
    237             afterNode = afterNode->next;
    238         }
    239 
    240         /********************************************************************
    241         * 将当前结点的next置为前一个结点的过程是在每一次循环的开始,而最后一次
    242         * 循环后无法进入下一次循环,需要补一次设置curNode的next的过程
    243         *********************************************************************/
    244         curNode->next = preNode;
    245 
    246         pHead->next = curNode;
    247     }
    248     preNode = NULL;
    249     curNode = NULL;
    250     afterNode = NULL;
    251 }
    252 
    253 void Link::printhelp()
    254 {
    255     std::cout<<"*****************************************
    ";
    256     std::cout<<"当前链表为:"<<std::endl;
    257     if (iSize == 0)
    258         std::cout<<"NULL"<<std::endl;
    259     else
    260         display();
    261     std::cout<<"输入你的选择:
    "
    262         "0.从头部插入结点
    "
    263         "1.从尾部插入结点
    "
    264         "2.逆置链表
    "
    265         "3.打印链表
    "
    266         "4.删除结点
    "
    267         "5.输出链表长度
    "
    268         "6.查找结点
    "
    269         "7.选择排序
    "
    270         "8.冒泡排序
    "
    271         "9.退出"<<std::endl;
    272     std::cout<<"*****************************************
    ";
    273 }

    main函数

    // linklist.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "Link.h"
    
    int main(int argc, char * argv[])
    {
        Link myLink;
        int pos;
        char choice;
        ElementType find_num = 3;
        int delchoice;
    
        for (int i = 0 ; i < 48; i ++)
        {
            myLink.insert_head(rand()%100);
        }
    
        myLink.printhelp();
        std::cout<<"请选择:";
        while ( std::cin>> choice)
        {
            switch(choice)
            {
            case '0':
            case '1':
                std::cout<<"
    暂无此功能!
    ";
                break;
            case '2':
                myLink.reverse();
                std::cout<<"
    逆置成功!
    ";
                break;
            case '3':
                myLink.display();
                std::cout<<"
    打印成功!
    ";
                break;
            case '4':
                std::cout<<"
    输入要删除的节点序号:";
                std::cin>>delchoice;
                if (myLink.delete_node(delchoice) == true)
                {
                    std::cout<<"
    删除成功!
    ";
                }
                else 
                {
                    std::cout<<"
    删除失败!
    ";
                }
                break;
            case '5':
                std::cout<<"链表长为:"<<myLink.size()<<std::endl;
                break;
            case '6':
                goto exit;
                break;
            case '7':
                myLink.select_sort();
                break;
            case '8':
                myLink.bubble_sort();
                break;
            case '9':
                goto exit;
                break;
            default:
                break;
            }
            myLink.printhelp();
            std::cout<<"请选择:";
        }
    
    exit:    
        system("pause");
        return 0;
    }

     运行:

  • 相关阅读:
    Netty源码分析-ChannelPipeline事件传播
    Netty源码分析-NioEventLoop事件轮询
    Netty源码分析-ServerBootstrap启动过程
    Canal基本原理
    [Android]proguard重新编译和如何不混淆第三方jar包
    [Android]listview recycleview的复用问题
    [Android] android .keystore文件转x509pem工具
    [Android] android studio 2.0即时运行功能探秘
    大神都是有个起点的
    Python列表的用法和基本操作
  • 原文地址:https://www.cnblogs.com/fwst/p/3660686.html
Copyright © 2020-2023  润新知