VS环境下基于C++的单链表实现

------------恢复内容开始------------

  1 #include<iostream>
  2 using namespace::std;
  3 
  4 typedef int ElemType;
  5 struct Node
  6 {
  7     ElemType data;
  8     Node* next;
  9 };
 10 
 11 class LinkList
 12 {
 13 private:
 14     Node* Head;
 15 public:
 16     LinkList()
 17     {
 18         Head = new Node();
 19     }
 20     ~LinkList() {
 21         Node* p;
 22         p = Head->next;
 23         while (p)
 24         {
 25             ListDelete(1);
 26             p = p->next;
 27         }
 28 
 29     };
 30     void CreateList_headInsert(int n)     //头插入法创建有n个节点的线性表
 31     {    
 32         Node* headNode, * newNode;    //这里的 headNode 与 Head 不同,Head是为了使逻辑 0 位置存放表头,而 headNode 则是记录当前最后一个节点
 33         headNode = Head;
 34         cout << "请输入" << n << "个数据元素:" << endl;
 35         for (int i = 1; i < n; i++)
 36         {
 37             newNode = new Node();
 38             cin >> newNode->data;            //输入新节点的数据信息
 39             headNode->next = newNode->next;        //将新节点插入原表头之前
 40             headNode->next = newNode;            //新的表头是 p 节点
 41         }
 42     }
 43 
 44     void CreateList_tailInsert(int n)    //尾插入法创建有n个节点的线性表
 45     {
 46         Node* headNode, * newNode;    //这里的 headNode 与 Head 不同,Head是为了使逻辑 0 位置存放表头,而 headNode 则是记录当前最后一个节点
 47         headNode = Head;
 48         cout << "请输入" << n << "个数据元素:" << endl;
 49         for (int i = 0; i < n; i++)
 50         {
 51             newNode = new Node();
 52             cin >> newNode->data;
 53             headNode->next = newNode;
 54             headNode = newNode;
 55         }
 56     }
 57 
 58     void ListInsert(int i, int e)        //在表中i位置插入e
 59     {
 60         int j = 0;
 61         Node* p;                        // p 用来记录当前指针指向的节点
 62         p = Head;
 63         while (j < i - 1)
 64         {
 65             p = p->next;
 66             j++;
 67         }
 68         if (!p || j > i - 1)            // !p 表示 i 大于表长, j > i-1 表示 i < 0
 69         {
 70             cout << "位置异常,节点插入失败!" << endl;
 71             return;
 72         }
 73         else
 74         {
 75             Node* newNode = new Node();    // newNode 指要插入的新节点
 76             newNode->data = e;
 77             newNode->next = p->next;
 78             p->next = newNode;
 79         }
 80     }
 81 
 82     void ListDelete(int i)                //删除表中i位置上的元素
 83     {
 84         int j = 0;    
 85         Node* p;                        // p 用来记录当前指针指向的节点
 86         p = Head;
 87         while (j < i - 1)
 88         {
 89             p = p->next;
 90             j++;
 91         }
 92         if (!p || j > i - 1)            // !p 表示 i 大于表长, j > i-1 表示 i < 0
 93         {
 94             cout << "位置异常,节点删除失败!" << endl;
 95             return ;
 96         }
 97         else
 98         {
 99             p->next = p->next->next;
100             cout << "删除节点成功" << endl;
101         }    
102     }
103 
104     void GetElem(int i)                    //获取第i个位置上的元素
105     {
106         int j = 0;
107         Node* p;                        // p 用来记录当前指针指向的节点
108         p = Head;
109         while (j < i)
110         {
111             p = p->next;
112             j++;
113         }
114         cout << "" << i << "个元素为" << p->data << endl;
115     }
116         
117     int LocateElem(int e)                //在链表中查找是否存在元素e,若存在则返回位置,否则返回-1
118     {
119         int j = 0;
120         Node* p;                        // p 用来记录当前指针指向的节点
121         p = Head->next;
122         while (p->data != e && p)
123         {
124             p = p->next;
125             j++;
126         }
127         if (p == NULL)
128         {
129             return -1;
130         }
131         else
132         {
133             return j;
134         }
135     }
136 
137     void Listlength()                    //计算表长
138     {
139         int j = 1;
140         Node* p = new Node();                        // p 用来记录当前指针指向的节点
141         p = Head->next;
142         while (p)
143         {
144             if (p->next==NULL)
145                 break;
146             p = p->next;
147             j++;
148         }
149         cout << "链表长度为:" << j << endl;
150     }
151     void TravelList()                    //遍历整张链表
152     {
153         int j = 1;
154         Node* p = new Node();                        // p 用来记录当前指针指向的节点
155         p = Head->next;
156         while (p)
157         {
158             cout << "" << j << " 个元素:" << p->data << endl;
159             p = p->next;
160             j++;
161         }
162     }
163 };
164 
165 int main()
166 {
167     LinkList L ;
168     int i;
169     cout << "请输入想要创建链表的节点个数:" << endl;
170     cin >> i;
171     L.CreateList_tailInsert(i);
172     L.Listlength();
173     L.TravelList();
174     L.ListInsert(1, 1000);
175     L.GetElem(2);
176     return 0;
177 }

人狠话不多直接上代码先。单链表与线性表相对,是数据存储的两大方式。链表虽然摒弃了线性表可以随机存储以及易于求得表长的优点,但是他插入、删除节点更加快速,对内存的利用率更高(不必硬性要求开辟一块连续长度的内存空间)。

单链表实现的功能主要如下:

 1 #include<iostream>
 2 using namespace::std;
 3 
 4 typedef int ElemType;
 5 struct Node
 6 {
 7     ElemType data;
 8     Node* next;
 9 };
10 
11 class LinkList
12 {
13 private:
14     Node* Head;
15 public:
16     LinkList()
17     {
18         Head = new Node();
19     }
20     ~LinkList() {
21 
22     };
23     void CreateList_headInsert(int n)     //头插入法创建有n个节点的线性表
24     {    
25 
26     }
27 
28     void CreateList_tailInsert(int n)    //尾插入法创建有n个节点的线性表
29     {
30     
31     }
32 
33     void ListDelete(int i)                //删除表中i位置上的元素
34     {
35     
36     }
37 
38     void GetElem(int i)                    //获取第i个位置上的元素
39     {
40 
41     }
42         
43     int LocateElem(int e)                //在链表中查找是否存在元素e,若存在则返回位置,否则返回-1
44     {
45     
46     }
47 
48     void Listlength()                    //计算表长
49     {
50     
51     }
52     void TravelList()                    //遍历整张链表
53     {
54 
55     }
56 };

其中建立链表时插入节点方式有两种,一种是头插法,一种是尾插法。

头插法:

例如链表中现在有三个元素  a -> b -> c ,新的节点 d 需要插入,则应该让 d -> next = a; 之后 d 变成新的表头,即 headNode = d;  //headNode始终表示链表的第一个节点

尾插法:

同样的,例如链表中现在有三个元素  a -> b -> c ,新的节点 d 需要插入,则应该让 c -> next = d; 之后 d 变成新的表尾,即 p = d;  //p 始终表示链表最后一个节点

其中需要注意的一点是(可能我C++习惯还没养成,欠缺熟练度)在使用 Node* p = new Node();时,我开始没加(),导致每次运行都显示堆栈溢出,这里强调一下,new后面的一定要加()【但是看的那本书没有加   ---数据结构与算法分析{人民邮电出版社},书山的是在VC6.0环境下运行的,而我用的时VS2019,也没有弄明白,还请大神把个忙解释一下】  

不足之处欢迎大家指正哈!

猜你喜欢

转载自www.cnblogs.com/Rebel3/p/Data_Structure.html