《C++数据结构-快速拾遗》 手写链表
注释:吕鑫老师C++对于找工作真的是很好的教程,基本什么方面都讲的很细致,但是对于大多数人只有快进快进再快进~~
注释:基本链表信息自己百度,这里只是一个快速拾遗过程。
1.链表定义
1 typedef int DATA;//int的别名,为了便于管理 2 3 //定义链表一个链节点 4 typedef struct SNode 5 { 6 DATA data;//数据,可以是结构体和类等,4字节 7 SNode *pNext;//指针,指向下一个节点,4字节 8 };
2.插入一个节点
1 #include <iostream> 2 3 using namespace std; 4 5 //#define DATA int 6 typedef int DATA;//int的别名,为了便于管理 7 8 //定义链表一个链节点 9 typedef struct SNode 10 { 11 DATA data;//数据,可以是结构体和类等,4字节 12 SNode *pNext;//指针,指向下一个节点,4字节 13 }; 14 SNode* g_pHead = NULL;//第一个链表是空链表 15 //从头插入一个数据 16 void AddHead(DATA data) 17 { 18 SNode* p = new SNode;//申请一个堆空间,8字节 19 p->data = data; 20 p->pNext = g_pHead; 21 g_pHead = p;//把新插入的节点当做头 22 } 23 int main(int argc, char**argv[]) 24 { 25 AddHead(1); 26 AddHead(2); 27 AddHead(3); 28 cout<<g_pHead->data<<endl<<g_pHead->pNext->data<<endl<<g_pHead->pNext->pNext->data<<endl; 29 return 0; 30 }
3.从尾部插入一个节点
1 #include <iostream> 2 3 using namespace std; 4 5 //#define DATA int 6 typedef int DATA;//int的别名,为了便于管理 7 8 //定义链表一个链节点 9 typedef struct SNode 10 { 11 DATA data;//数据,可以是结构体和类等,4字节 12 SNode *pNext;//指针,指向下一个节点,4字节 13 }; 14 SNode* g_pHead = NULL;//第一个链表是空链表 15 //从尾插入一个数据 16 void AddTail(DATA data) 17 { 18 SNode* p = g_pHead;//防止改变头结点的指针 19 //建立新的节点 20 SNode* p1 = new SNode; 21 p1->data = data; 22 p1->pNext = NULL; 23 if(!p)//如果一开始就是空链表 24 { 25 g_pHead = p1; 26 return; 27 } 28 while(p->pNext)//找到最尾部的节点 29 { 30 p = p->pNext; 31 } 32 p->pNext = p1; 33 } 34 int main(int argc, char**argv[]) 35 { 36 /* AddHead(1); 37 AddHead(2); 38 AddHead(3); */ 39 AddTail(11); 40 AddTail(12); 41 AddTail(13); 42 while(g_pHead) 43 { 44 cout<<g_pHead->data<<endl; 45 g_pHead = g_pHead->pNext; 46 } 47 //cout<<g_pHead->data<<endl<<g_pHead->pNext->data<<endl<<g_pHead->pNext->pNext->data<<endl; 48 return 0; 49 }
4.修改节点数据
1 #include <iostream> 2 3 using namespace std; 4 5 //#define DATA int 6 typedef int DATA;//int的别名,为了便于管理 7 8 //定义链表一个链节点 9 typedef struct SNode 10 { 11 DATA data;//数据,可以是结构体和类等,4字节 12 SNode *pNext;//指针,指向下一个节点,4字节 13 }; 14 SNode* g_pHead = NULL;//第一个链表是空链表 15 //从尾插入一个数据 16 void AddTail(DATA data) 17 { 18 SNode* p = g_pHead;//防止改变头结点的指针 19 //建立新的节点 20 SNode* p1 = new SNode; 21 p1->data = data; 22 p1->pNext = NULL; 23 if(!p)//如果一开始就是空链表 24 { 25 g_pHead = p1; 26 return; 27 } 28 while(p->pNext)//找到最尾部的节点 29 { 30 p = p->pNext; 31 } 32 p->pNext = p1; 33 } 34 void Modify(DATA data, DATA newData) 35 { 36 SNode* p = g_pHead; 37 SNode* p1 = new SNode; 38 if (!p) 39 { 40 p1->data = newData; 41 p1->pNext = NULL; 42 g_pHead = p1; 43 return; 44 } 45 while(p) 46 { 47 if (p->data==data) 48 { 49 p->data = newData; 50 } 51 p = p->pNext; 52 } 53 } 54 int main(int argc, char**argv[]) 55 { 56 /* AddHead(1); 57 AddHead(2); 58 AddHead(3); */ 59 AddTail(11); 60 AddTail(12); 61 AddTail(13); 62 Modify(13,16); 63 while(g_pHead) 64 { 65 cout<<g_pHead->data<<endl; 66 g_pHead = g_pHead->pNext; 67 } 68 cout<<"hell2"; 69 return 0; 70 }
5.查找和打印链表
1 #include <iostream> 2 3 using namespace std; 4 5 //#define DATA int 6 typedef int DATA;//int的别名,为了便于管理 7 8 //定义链表一个链节点 9 typedef struct SNode 10 { 11 DATA data;//数据,可以是结构体和类等,4字节 12 SNode *pNext;//指针,指向下一个节点,4字节 13 }; 14 SNode* g_pHead = NULL;//第一个链表是空链表 15 //从尾插入一个数据 16 void AddTail(DATA data) 17 { 18 SNode* p = g_pHead;//防止改变头结点的指针 19 //建立新的节点 20 SNode* p1 = new SNode; 21 p1->data = data; 22 p1->pNext = NULL; 23 if(!p)//如果一开始就是空链表 24 { 25 g_pHead = p1; 26 return; 27 } 28 while(p->pNext)//找到最尾部的节点 29 { 30 p = p->pNext; 31 } 32 p->pNext = p1; 33 } 34 //查找某个数据 35 bool Find(DATA data) 36 { 37 SNode* p = g_pHead; 38 while(p) 39 { 40 if(p->data == data) return true; 41 p = p->pNext; 42 } 43 return false; 44 } 45 void print() 46 { 47 SNode* p = g_pHead; 48 while(p) 49 { 50 cout<<p->data<<endl; 51 p = p->pNext; 52 } 53 } 54 int main(int argc, char**argv[]) 55 { 56 /* AddHead(1); 57 AddHead(2); 58 AddHead(3); */ 59 AddTail(11); 60 AddTail(12); 61 AddTail(13); 62 //Modify(13,16); 63 print(); 64 cout<<"shifou : "<<Find(10); 65 return 0; 66 }
6.删除链表节点
1 #include <iostream> 2 3 using namespace std; 4 5 //#define DATA int 6 typedef int DATA;//int的别名,为了便于管理 7 8 //定义链表一个链节点 9 typedef struct SNode 10 { 11 DATA data;//数据,可以是结构体和类等,4字节 12 SNode *pNext;//指针,指向下一个节点,4字节 13 }; 14 SNode* g_pHead = NULL;//第一个链表是空链表 15 //从尾插入一个数据 16 void AddTail(DATA data) 17 { 18 SNode* p = g_pHead;//防止改变头结点的指针 19 //建立新的节点 20 SNode* p1 = new SNode; 21 p1->data = data; 22 p1->pNext = NULL; 23 if(!p)//如果一开始就是空链表 24 { 25 g_pHead = p1; 26 return; 27 } 28 while(p->pNext)//找到最尾部的节点 29 { 30 p = p->pNext; 31 } 32 p->pNext = p1; 33 } 34 //删除某个节点 35 bool Delete(DATA data) 36 { 37 SNode* p = g_pHead;//当前节点 38 SNode* p1 = NULL;//下一个节点 39 if(!p) return false;//空链表直接返回 40 if(p->data == data )//删除第一个节点 41 { 42 g_pHead = p->pNext; 43 delete p; 44 return true; 45 } 46 while(p)//删除中间和结尾节点 47 { 48 if(p->data == data) 49 { 50 p1->pNext = p->pNext; 51 delete p; 52 return true; 53 } 54 p1 = p; 55 p = p->pNext; 56 } 57 return false; 58 } 59 void print() 60 { 61 SNode* p = g_pHead; 62 while(p) 63 { 64 cout<<p->data<<endl; 65 p = p->pNext; 66 } 67 } 68 int main(int argc, char**argv[]) 69 { 70 /* AddHead(1); 71 AddHead(2); 72 AddHead(3); */ 73 AddTail(11); 74 AddTail(12); 75 AddTail(13); 76 //Modify(13,16); 77 Delete(13); 78 print(); 79 cout<<"shifou : "<<Find(10); 80 return 0; 81 }
7.排序链表
以后面试再看链表外排和内排:https://chuanke.baidu.com/v1760453-135963-545032.html
1 #include <iostream> 2 3 using namespace std; 4 5 //#define DATA int 6 typedef int DATA;//int的别名,为了便于管理 7 //定义一个结构体当做数据 8 /* typedef struct DATA 9 { 10 int nNumb; 11 char sName[20]; 12 float fMath; 13 }; */ 14 //定义链表一个链节点 15 typedef struct SNode 16 { 17 DATA data;//数据,可以是结构体和类等,4字节 18 SNode *pNext;//指针,指向下一个节点,4字节 19 }SNode; 20 SNode* g_pHead = NULL;//第一个链表是空链表 21 //从尾插入一个数据 22 void AddTail(DATA data) 23 { 24 SNode* p = g_pHead;//防止改变头结点的指针 25 //建立新的节点 26 SNode* p1 = new SNode; 27 p1->data = data; 28 p1->pNext = NULL; 29 if(!p)//如果一开始就是空链表 30 { 31 g_pHead = p1; 32 return; 33 } 34 while(p->pNext)//找到最尾部的节点 35 { 36 p = p->pNext; 37 } 38 p->pNext = p1; 39 } 40 //打印全部节点数据 41 void print() 42 { 43 SNode* p = g_pHead; 44 while(p) 45 { 46 cout<<p->data<<endl; 47 p = p->pNext; 48 } 49 } 50 //交换数据的排序 51 void sortByNum(bool reverse = true) 52 { 53 SNode* p = g_pHead; 54 SNode* m = NULL; 55 while(p) 56 { 57 m = p->pNext; 58 while(m) 59 { 60 if(p->data > m->data && reverse) 61 { 62 DATA midData; 63 midData = p->data; 64 p->data = m->data; 65 m->data = midData; 66 } 67 else if(p->data < m->data && !reverse) 68 { 69 DATA midData; 70 midData = p->data; 71 p->data = m->data; 72 m->data = midData; 73 } 74 m = m->pNext; 75 } 76 p=p->pNext; 77 } 78 } 79 int main(int argc, char*argv[]) 80 { 81 /* AddHead(1); 82 AddHead(2); 83 AddHead(3); */ 84 AddTail(11); 85 AddTail(2); 86 AddTail(13); 87 AddTail(10); 88 AddTail(14); 89 AddTail(1); 90 //Modify(13,16); 91 //Delete(13); 92 print(); 93 sortByNum(false); 94 print(); 95 return 0; 96 }
8.总链表(结构体版)
1 #include <iostream> 2 3 using namespace std; 4 5 //#define DATA int 6 typedef int DATA;//int的别名,为了便于管理 7 //定义一个结构体当做数据 8 /* typedef struct DATA 9 { 10 int nNumb; 11 char sName[20]; 12 float fMath; 13 }; */ 14 //定义链表一个链节点 15 typedef struct SNode 16 { 17 DATA data;//数据,可以是结构体和类等,4字节 18 SNode *pNext;//指针,指向下一个节点,4字节 19 }SNode; 20 SNode* g_pHead = NULL;//第一个链表是空链表 21 //从尾插入一个数据 22 void AddTail(DATA data) 23 { 24 SNode* p = g_pHead;//防止改变头结点的指针 25 //建立新的节点 26 SNode* p1 = new SNode; 27 p1->data = data; 28 p1->pNext = NULL; 29 if(!p)//如果一开始就是空链表 30 { 31 g_pHead = p1; 32 return; 33 } 34 while(p->pNext)//找到最尾部的节点 35 { 36 p = p->pNext; 37 } 38 p->pNext = p1; 39 } 40 //从头插入一个数据 41 void AddHead(DATA data) 42 { 43 SNode* p = new SNode;//申请一个堆空间,8字节 44 p->data = data; 45 p->pNext = g_pHead; 46 g_pHead = p;//把新插入的节点当做头 47 } 48 //修改链表节点数据 49 void Modify(DATA data, DATA newData) 50 { 51 SNode* p = g_pHead; 52 SNode* p1 = new SNode; 53 if (!p) 54 { 55 p1->data = newData; 56 p1->pNext = NULL; 57 g_pHead = p1; 58 return; 59 } 60 while(p) 61 { 62 if (p->data==data) 63 { 64 p->data = newData; 65 } 66 p = p->pNext; 67 } 68 } 69 //查找某个数据 70 bool Find(DATA data) 71 { 72 SNode* p = g_pHead; 73 while(p) 74 { 75 if(p->data == data) return true; 76 p = p->pNext; 77 } 78 return false; 79 } 80 //删除某个节点 81 bool Delete(DATA data) 82 { 83 SNode* p = g_pHead;//当前节点 84 SNode* p1 = NULL;//下一个节点 85 if(!p) return false;//空链表直接返回 86 if(p->data == data )//删除第一个节点 87 { 88 g_pHead = p->pNext; 89 delete p; 90 return true; 91 } 92 while(p)//删除中间和结尾节点 93 { 94 if(p->data == data) 95 { 96 p1->pNext = p->pNext; 97 delete p; 98 return true; 99 } 100 p1 = p; 101 p = p->pNext; 102 } 103 return false; 104 } 105 //打印全部节点数据 106 void print() 107 { 108 SNode* p = g_pHead; 109 while(p) 110 { 111 cout<<p->data<<endl; 112 p = p->pNext; 113 } 114 } 115 //交换数据的排序 116 void sortByNum(bool reverse = true) 117 { 118 SNode* p = g_pHead; 119 SNode* m = NULL; 120 while(p) 121 { 122 m = p->pNext; 123 while(m) 124 { 125 if(p->data > m->data && reverse) 126 { 127 DATA midData; 128 midData = p->data; 129 p->data = m->data; 130 m->data = midData; 131 } 132 else if(p->data < m->data && !reverse) 133 { 134 DATA midData; 135 midData = p->data; 136 p->data = m->data; 137 m->data = midData; 138 } 139 m = m->pNext; 140 } 141 p=p->pNext; 142 } 143 } 144 int main(int argc, char*argv[]) 145 { 146 /* AddHead(1); 147 AddHead(2); 148 AddHead(3); */ 149 AddTail(11); 150 AddTail(2); 151 AddTail(13); 152 AddTail(10); 153 AddTail(14); 154 AddTail(1); 155 //Modify(13,16); 156 //Delete(13); 157 print(); 158 sortByNum(false); 159 print(); 160 return 0; 161 }
9.总链表(类版本)
1 #include <iostream> 2 3 using namespace std; 4 /* 5 typedef struct DATA 6 { 7 int sNum; 8 char sName[20]; 9 }DATA; 10 */ 11 typedef int DATA; 12 typedef struct SNode 13 { 14 DATA data; 15 SNode* pNext; 16 }SNode; 17 class CList 18 { 19 public: 20 CList(); 21 ~CList(); 22 CList(CList&p); 23 void AddTail(DATA data); 24 void AddHead(DATA data); 25 void Modify(DATA data, DATA newData); 26 bool Find(DATA data); 27 bool Delete(DATA data); 28 void print(); 29 void sortByNum(bool reverse = true); 30 private: 31 SNode* m_pHead; 32 }; 33 34 int main(int argc,char*argv[]) 35 { 36 CList list1, list2; 37 list1.AddHead(10); 38 list1.AddHead(6); 39 list1.AddHead(11); 40 list1.AddHead(8); 41 list1.AddHead(10); 42 list1.AddHead(1); 43 list1.print(); 44 45 list1.sortByNum(); 46 list1.print(); 47 list2 = list1; 48 list2.print(); 49 return 0; 50 } 51 52 CList::CList() 53 { 54 m_pHead = NULL;// 55 } 56 57 CList::~CList() 58 {//析构函数,C++自动清除堆空间数据 59 } 60 CList::CList(CList& p) 61 { 62 memcpy(this,&p,sizeof(p));//拷贝构造函数 63 } 64 //从尾插入一个数据 65 void CList::AddTail(DATA data) 66 { 67 SNode* p = m_pHead;//防止改变头结点的指针 68 //建立新的节点 69 SNode* p1 = new SNode; 70 p1->data = data; 71 p1->pNext = NULL; 72 if (!p)//如果一开始就是空链表 73 { 74 m_pHead = p1; 75 return; 76 } 77 while (p->pNext)//找到最尾部的节点 78 { 79 p = p->pNext; 80 } 81 p->pNext = p1; 82 } 83 //从头插入一个数据 84 void CList::AddHead(DATA data) 85 { 86 SNode* p = new SNode;//申请一个堆空间,8字节 87 p->data = data; 88 p->pNext = m_pHead; 89 m_pHead = p;//把新插入的节点当做头 90 } 91 //修改链表节点数据 92 void CList::Modify(DATA data, DATA newData) 93 { 94 SNode* p = m_pHead; 95 SNode* p1 = new SNode; 96 if (!p) 97 { 98 p1->data = newData; 99 p1->pNext = NULL; 100 m_pHead = p1; 101 return; 102 } 103 while (p) 104 { 105 if (p->data == data) 106 { 107 p->data = newData; 108 } 109 p = p->pNext; 110 } 111 } 112 //查找某个数据 113 bool CList::Find(DATA data) 114 { 115 SNode* p = m_pHead; 116 while (p) 117 { 118 if (p->data == data) return true; 119 p = p->pNext; 120 } 121 return false; 122 } 123 //删除某个节点 124 bool CList::Delete(DATA data) 125 { 126 SNode* p = m_pHead;//当前节点 127 SNode* p1 = NULL;//下一个节点 128 if (!p) return false;//空链表直接返回 129 if (p->data == data)//删除第一个节点 130 { 131 m_pHead = p->pNext; 132 delete p; 133 return true; 134 } 135 while (p)//删除中间和结尾节点 136 { 137 if (p->data == data) 138 { 139 p1->pNext = p->pNext; 140 delete p; 141 return true; 142 } 143 p1 = p; 144 p = p->pNext; 145 } 146 return false; 147 } 148 //打印全部节点数据 149 void CList::print() 150 { 151 SNode* p = m_pHead; 152 while (p) 153 { 154 cout << p->data << endl; 155 p = p->pNext; 156 } 157 } 158 //交换数据的排序 159 void CList::sortByNum(bool reverse) 160 { 161 SNode* p = m_pHead; 162 SNode* m = NULL; 163 while (p) 164 { 165 m = p->pNext; 166 while (m) 167 { 168 if (p->data > m->data && reverse) 169 { 170 DATA midData; 171 midData = p->data; 172 p->data = m->data; 173 m->data = midData; 174 } 175 else if (p->data < m->data && !reverse) 176 { 177 DATA midData; 178 midData = p->data; 179 p->data = m->data; 180 m->data = midData; 181 } 182 m = m->pNext; 183 } 184 p = p->pNext; 185 } 186 }
9.改进版
作者:影醉阏轩窗
-------------------------------------------
个性签名:衣带渐宽终不悔,为伊消得人憔悴!
如果觉得这篇文章对你有小小的帮助的话,记得关注再下的公众号,同时在右下角点个“推荐”哦,博主在此感谢!