读书笔记:线性表-单向链表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了读书笔记:线性表-单向链表相关的知识,希望对你有一定的参考价值。

  链表(linklist)

  单项链表可以说是数据结构里面最简单的部分,也是十分重要的部分,数据结构后面的学习中 比如说:栈,队列,树, 图 都要使用这种数据结构来表示。

  不多说,进入我对链表的理解部分。

  

   简介:

  链表是一种数据结构,链表中,数据对象实例的每一个元素都用一个单元或节点来描述。每一个节点中都包含着它的数据[数据部分]和相关节点的位置信息[链接部分],我们称连通两个节点的部分为链(link)或指针(pointer)。链表的第一个节点称为头节点(head),最后一个节点为尾节点。头节点没有前驱,尾节点没有后继(我们一般将尾节点的链或指针指向一个NULL表示链表在这里完结)

通常把节点叫做node,链叫做next

如下图展示一个链表 :

   技术分享

 接下来讲解链表的几项基本操作: 插入,删除, 查找, 遍历。

链表的插入:

      如下图,我们首先利用for迭代找到待插入位置节点(node)的前一个节点(node_prev),把后一个节点叫做(node_next)。

      将新节点(new_node)中的next指向 node,再将node_prev中的next指向new_node技术分享

 

 

 

 

 

 

 

  接下来post我自己写的链表代码 [简单的写了下,多多指教].

  

  1 #pragma once
  2 #include<iostream>
  3 using namespace std;
  4 
  5 class LinkListNode
  6 {
  7 public:
  8     // data mumber
  9     int element;
 10     LinkListNode *next;
 11 
 12      
 13     //construcion function
 14     LinkListNode() = default;
 15 
 16     LinkListNode(const int theElement, LinkListNode *next)
 17     {
 18         this->element = theElement;
 19         this->next = next;
 20     }
 21 };
 22 
 23 class LinkList
 24 {
 25     friend void operator << (ostream &os, LinkList &x);
 26 public:
 27     LinkList()
 28     {
 29         ListSize = 0;
 30         head = NULL;
 31     }
 32 
 33     // Function
 34     void insert(int theIndex, const int theElement);
 35     void erase(int theIndex);
 36     void erase(int firstIndex, int lastIndex);
 37     void output(ostream &os) const;
 38 
 39 
 40     int& operator [] (int theIndex);
 41 private:
 42     LinkListNode *head;
 43     int ListSize;
 44 };
 45 
 46 void operator << (ostream &os, LinkList &x) 
 47 {
 48     x.output(os);
 49 }
 50 
 51 void LinkList::output(ostream &os) const 
 52 {
 53     LinkListNode *p = head;
 54     while (p != NULL)  {
 55         os << p->element <<  ;
 56         p = p->next;
 57     }
 58 }
 59 
 60 // insert Function, you can insert element into List in all place, 
 61 // and if the Index of your input is out of list‘range, the program will making some error information to tell you, and 
 62 // you can change the Index ,so that make it right
 63 void LinkList::insert(int theIndex, const int theElement)
 64 {
 65     char c = y;
 66     while (c != n)  {
 67         try {
 68             if (0 > theIndex || theIndex > ListSize)
 69                 throw range_error("the Index is out of LinkList‘ range ");
 70             //main of function body
 71             else  {
 72                 if(theIndex == 0)
 73                     head = new LinkListNode(theElement, head);
 74                 else {
 75                     LinkListNode *p = head;
 76                     for (int i = 0; i < theIndex - 1; i++)
 77                         p = p->next;
 78                     p->next = new LinkListNode(theElement, p->next);
 79                 }
 80                 ListSize++;
 81                 c = n;
 82             }
 83         }
 84         catch (range_error err)  {
 85             cout << err.what()
 86                 << endl << "input Index again ? \\n" << "y or n" << endl;
 87             cin >> c;
 88             if (c == y)
 89                 cin >> theIndex;
 90         }
 91     }
 92 }
 93 
 94 // Erase function, use it , you can delete a Node form list, but your Index can‘t out ou the list‘range too, and
 95 // the funciton also has a error imformation unit
 96 void LinkList::erase(int theIndex)
 97 {
 98     LinkListNode * delNode;
 99     try  {
100         if (theIndex < 0 || theIndex >= ListSize)
101             throw range_error("error Index \\n[No erase]");
102         else  {
103             if (theIndex == 0) {
104                 delNode = head;
105                 head = head->next;
106             }
107             else {
108                 LinkListNode *p = head;
109                 for (int i = 0; i < theIndex - 1; i++)
110                     p = p->next;
111                 delNode = p->next;
112                 p->next = p->next->next;
113             }
114         }
115         ListSize--;
116         delete delNode;
117     }
118     catch (range_error err) {
119         cout << err.what();
120     }
121 }
122 
123 // This is Erase funciton too, in deffrent to last function, this can delete a range of elements, and it has Error checking too
124 void LinkList::erase(int firstIndex, int lastIndex)
125 {
126     LinkListNode *fNode;
127     LinkListNode *tNode;
128     try {
129         if (firstIndex < 0 || lastIndex >= ListSize)
130             throw range_error("the range of your input is error");
131         else {
132             LinkListNode *p = head;
133             int i;
134             for (i = 0; i < firstIndex - 1; i++)
135                 p = p->next;
136             fNode = p->next;
137             LinkListNode *q = p;
138             for (; i < lastIndex - 1; i++)
139                  p = p->next;
140             tNode = p->next;
141 
142             if (firstIndex == 0)
143                 head = tNode->next;
144             else q->next = tNode->next;
145         }
146         while (fNode != tNode) {
147             LinkListNode *temp = fNode->next;
148             delete fNode;
149             fNode = temp;
150             ListSize--;
151         }
152     } catch(range_error err){
153         cout << err.what();
154     }
155 }
156 
157 // this is a operator, you can input index ,and you will get the element of the list‘index
158 int& LinkList::operator[] (int theIndex)
159 {
160     LinkListNode *p = head;
161     for (int i = 0; i < theIndex; i++)
162         p = p->next;
163     return p->element;
164 }

 

未完[...]

以上是关于读书笔记:线性表-单向链表的主要内容,如果未能解决你的问题,请参考以下文章

线性表—不带头单向非循环链表的增删查改

C语言中数据结构中的单向链表的问题;

一文讲透链表操作,看完你也能轻松写出正确的链表代码

一文讲透链表操作,看完你也能轻松写出正确的链表代码

学习数据结构一:链表

[读书笔记]-大话数据结构-3-线性表-静态链表循环链表和双向链表