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

  链表(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 }

未完[...]

时间: 2024-10-05 18:22:00

读书笔记:线性表-单向链表的相关文章

[考研系列之数据结构]线性表之链表

1.链表分类 通过线性表概述,我们知道了链表这样一种数据结构,它又分成三类,分别是 单向链表 循环链表 双向链表 单向链表 单向链表的指针域只有一个指向下一个节点的指针,需要注意几点: 1.头指针--指向第一个节点 2.最后一个结点的指针指向NULL 3.头结点--在链表的第一个结点之前附设一个结点,它的数据域为空 所以,我们看到:  单向链表为空的<=>链表有且只有一个头结点<=>头结点的指针指向NULL 循环链表 循环链表和单向链表最大的不同就是:最后一个结点的指针不再指向NU

数据结构学习笔记——线性表的应用

数据结构学习笔记——线性表的应用 线性表的应用 线性表的自然连接 计算任意两个表的简单自然连接过程讨论线性表的应用.假设有两个表A和B,分别是m1行.n1列和m2行.n2列,它们简单自然连接结果C=A*B(i==j),其中i表示表A中列号,j表示表B中的列号,C为A和B的笛卡儿积中满足指定连接条件的所有记录组,该连接条件为表A的第i列与表B的第j列相等. 如:         1 2 3                3 5 A  =  2 3 3         B =  1 6       

C语言 严蔚敏数据结构 线性表之链表实现

博主最近在考成都大学皇家计算机科学与技术专业,复习专业课数据结构,正好学习到线性结构中的线性表用链表这种存储结构来实现. 首先,数据结构包括1.数据的操作2.逻辑结构3.存储结构(数据结构三要素. 直接上代码,现阶段代码实现功能有:链表初始化.遍历.增.删.返回链表长度,后续功能陆续发布.其中肯定有很多问题,希望各位码哥留言. Linklist* InitList(int i)//i为链表大小 { Linklist *head; head = (Linklist*)malloc(sizeof(L

3、蛤蟆的数据结构笔记之三线性表单项链表实现

今天励志短语:"人生的价值,即以其人对于当代所做的工作为尺度." 昨天我们看了线性表的一些定义概念,今天来看下其中的单项链表代码如何实现. 1.  声明结构 如下声明一个指向结构的指针.(存放整数的节点,我们也可以根据需要创建字符的链表) typedef struct list_node *list_pointer; typedef struct list_node{ intdata; list_pointerlink; }; list_pointerptr = NULL; 2.  定

线性表和链表

原文出自:http://www.cppblog.com/cxiaojia/archive/2012/07/31/185760.html 谈到链表之前,先说一下线性表.线性表是最基本.最简单.也是最常用的一种数据结构.线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的.线性表有两种存储方式,一种是顺序存储结构,另一种是链式存储结构. 顺序存储结构就是两个相邻的元素在内存中也是相邻的.这种存储方式的优点是查询的时间复杂度为O(1),通过首地址和偏

Python线性表——单链表

1. 线性表简介 线性表是一种线性结构,它是由零个或多个数据元素构成的有限序列.线性表的特征是在一个序列中,除了头尾元素,每个元素都有且只有一个直接前驱,有且只有一个直接后继,而序列头元素没有直接前驱,序列尾元素没有直接后继. 数据结构中常见的线性结构有数组.单链表.双链表.循环链表等.线性表中的元素为某种相同的抽象数据类型.可以是C语言的内置类型或结构体,也可以是C++自定义类型. 2. 数组 数组在实际的物理内存上也是连续存储的,数组有上界和下界.C语言中定义一个数组: 数组下标是从0开始的

第二章:3.线性表---静态链表的表示和实现

前言: 由于一些高级程序设计语言中,并没有 "指针" 类型,因此上一节中用指针来描述的单链表不能被实现,这时候我们就会使用另一种形式链表:静态链表. 目录: 1.线性表的链式表示和实现 1.1线性链表 单链表(指针型线性链表) 静态链表 1.2循环链表 1.3双向链表 正文: 线性表的静态单链表存储结构: #define MAXSIZE 100; //链表的最大长度 typedef   struct{ ElemType  data; int  cur; }component, SLin

再回首,数据结构——线性表、链表上的常见算法

最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会. 希望这些能提供给初学者一些参考. //1.编写算法实现线性表就地逆置的操作 void InverseList (SeqList l) { for (i = 0; i <= (l.length-1)/2; i++) { l.elem[i] <-> l.elem[l.length-1-i]; } } //2.从顺序表中删除自第i个元素开始的k个元素 void DeleteList(SeqList l, int

JAVA实现具有迭代器的线性表(单链表)

一,迭代器的基本知识: 1,为什么要用迭代器?(迭代:即对每一个元素进行一次“问候”) 比如说,我们定义了一个ADT(抽象数据类型),作为ADT的一种实现,如单链表.而单链表的基本操作中,大部分需要用到依次遍历单链表中的每一个元素.一般而言,我们就是用for循环来实现遍历,这样,当你新增一个对单链表的操作并需要使用遍历时,你就得重新写一个for循环而实现遍历.那么,为什么不将迭代(遍历)作为一种基本的ADT操作(基本的ADT操作如:新增一个元素.删除一个元素)呢?于是,迭代器就出场了. 2,鉴于