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

 运行:

原文地址:https://www.cnblogs.com/fwst/p/3660686.html