------------恢复内容开始------------
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,也没有弄明白,还请大神把个忙解释一下】
不足之处欢迎大家指正哈!
原文:https://www.cnblogs.com/Rebel3/p/Data_Structure.html