首页 > 技术文章 > 线性表之单链表

nwjlq 2021-11-13 14:04 原文

1.定义

单链表就是用链式存储的线性表

其每个元素都由两个元素组成,数据域和指针域,其格式如图所示

 

 2.单链表的实现

 头文件:

 1 #ifndef _LINKLIST_H
 2 #define _LINKLIST_H
 3 
 4 struct Node
 5 {
 6     int data;
 7     Node *next;
 8 };
 9 class LinkList
10 {
11 public:
12     LinkList();
13     ~LinkList();
14     bool insert_data(int pos, int data);
15     int delete_data(int pos);
16 
17 public:
18     void show();
19 
20 private:
21     Node *m_head;
22     int m_length;
23 };
24 #endif

源文件:

 1 #include "linklist.h"
 2 #include <iostream>
 3 /*
 4  *@brief:构造函数 实现头节点初始化
 5  *@params:
 6  *@return:
 7 */
 8 LinkList::LinkList() : m_length(0)
 9 {
10     m_head = new Node;
11     m_head->next = NULL;
12 }
13 
14 /*
15  *@brief:析构函数  实现链表销毁操作
16  *@params:
17  *@return:
18 */
19 LinkList::~LinkList()
20 {
21     Node *cur = m_head;
22     Node *next;
23     while (cur)
24     {
25         next = cur->next;
26         delete cur;
27         cur = next;
28     }
29     m_length = 0;
30 }
31 
32 /*
33  *@brief:显示函数 测试使用
34  *@params:void
35  *@return:void
36 */
37 void LinkList::show()
38 {
39     Node *cur = m_head->next;
40     while (cur)
41     {
42         std::cout << cur->data << ' ';
43         cur = cur->next;
44     }
45     std::cout << std::endl;
46 }
47 /*
48  *@brief:在指定位置插入一个结点
49  *@params:  pos:待插入位置
50  *          data:插入的数据
51  *@return:  成功:true
52  *          失败:false
53 */
54 bool LinkList::insert_data(int pos, int data)
55 {
56     if (pos < 1 || pos > m_length + 1)
57         return false;
58 
59     Node *cur = m_head;
60     int moveCount = pos - 1;
61     int i = 0;
62     while (moveCount--) //cur移动到pos结点的前一个结点
63         cur = cur->next;
64 
65     Node *new_node = new Node;
66     new_node->data = data;
67     new_node->next = cur->next;
68     cur->next = new_node;
69     m_length++;
70     return true;
71 }
72 
73 /*
74  *@brief:删除指定位置的数据
75  *@params:  pos:待删除位置
76  *@return:  成功:删除的元素值
77  *          失败:-1
78 */
79 int LinkList::delete_data(int pos)
80 {
81     if (pos < 1 || pos > m_length)
82         return -1;
83 
84     int moveCount = pos - 1;
85     Node *cur = m_head;
86     while (moveCount--) //cur移动到pos前一个结点出
87         cur = cur->next;
88     Node *next = cur->next;
89     int data = next->data;
90     cur->next = next->next;
91     delete next;
92     m_length--;
93     return data;
94 }

3.单链表和顺序表优缺点

顺序表: 优点--可随机存储,存储密度高

                缺点--要去大片连续空间,改变容量不方便

单链表:优点--不要求大片连续空间,改变容量方便

              缺点--不可随机存储,要耗费一定空间存放指针

推荐阅读