长大是人必经的溃烂 ---大卫塞林格
代码是年轻人的新生!!!!!!
程序 = 数据结构 + 算法 --Niklaus EmilWirth
这篇博客在参考一些书籍和教学视频的基础上整理而来,中间夹杂了一些自己写的代码
1、List
先贴一个基础的整型顺序链表list的c++代码
List.cpp
1 #include <iostream> 2 #include "List.h" 3 4 using namespace std; 5 6 //创建链表 7 List::List(int Size) 8 { 9 m_iSize =Size; 10 m_pList = new int[m_iSize]; 11 m_iLength = 0; 12 } 13 List::~List() 14 { 15 delete []m_pList; 16 m_pList = NULL; 17 } 18 //清空链表 19 void List::ClearList() 20 { 21 m_iLength = 0; 22 } 23 bool List::IsEmpty() 24 { 25 if (m_iLength==0) 26 { 27 return true; 28 } 29 else 30 { 31 return false; 32 } 33 } 34 int List::GetLength() 35 { 36 return m_iLength; 37 } 38 bool List::GetElement(int i,int *e) 39 { 40 if (i<0||i>m_iSize) 41 { 42 return false; 43 } 44 *e = m_pList[i]; 45 return true; 46 } 47 int List::LocateElement(int *e) 48 { 49 for (int i=0;i<m_iLength;i++) 50 { 51 if (m_pList[i] == *e) 52 { 53 return i; 54 } 55 } 56 } 57 /********************************************************** 58 获取指定元素的前驱 59 **********************************************************/ 60 bool List::PriorElement(int *PreElement,int *CurrentElement) 61 { 62 int temp = LocateElement(CurrentElement); 63 if (temp == -1) 64 { 65 return false; 66 } 67 else 68 { 69 if (temp == 0) 70 { 71 return false; 72 } 73 else 74 { 75 *PreElement = m_pList[temp-1]; 76 return true; 77 } 78 } 79 } 80 /******************************************************* 81 获取指定元素的后继 82 ********************************************************/ 83 bool List::NextElement(int *NeElment,int *CurrentElement) 84 { 85 int temp = LocateElement(CurrentElement); 86 if (temp == -1) 87 { 88 return false; 89 } 90 else 91 { 92 if (temp == m_iLength) 93 { 94 return false; 95 } 96 else 97 { 98 *NeElment = m_pList[temp+1]; 99 return true; 100 } 101 } 102 } 103 /************************************ 104 在顺序表中的指定位置插入元素 105 *************************************/ 106 bool List::ListInsert(int i,int *e) 107 { 108 if(i<0||i>m_iLength) 109 { 110 return false; 111 } 112 for (int k=m_iLength-1;k>=i;k--) 113 { 114 m_pList[k+1] = m_pList[k]; 115 } 116 m_pList[i] = *e; 117 m_iLength++; 118 } 119 /*********************************** 120 删除顺序表指定的元素 121 ************************************/ 122 bool List::ListDelete(int i,int *e) 123 { 124 *e = m_pList[i]; 125 if(i<0||i>m_iLength) 126 { 127 return false; 128 } 129 for (int k=i+1;k<m_iLength;i++) 130 { 131 m_pList[k-1] = m_pList[k]; 132 } 133 m_iLength--; 134 } 135 /*********************************** 136 遍历顺序表中的数据 137 ************************************/ 138 void List::ListTranverse() 139 { 140 for (int i=0;i<m_iLength;i++) 141 { 142 cout<<m_pList[i]<<endl; 143 } 144 } 145 //bool List::ListInsertHead(int *e) 146 //{ 147 // 148 //} 149 //bool List::ListInsertTail(int *e) 150 //{ 151 // 152 //}
List.h
#ifndef LIST_H #define LIST_H class List { public: List(int Size); ~List(); void ClearList(); bool IsEmpty(); int GetLength(); bool GetElement(int i,int *e); int LocateElement(int *e); bool PriorElement(int *PreElement,int *CurrentElement); bool NextElement(int *NeElment,int *CurrentElement); bool ListInsert(int i,int *e); bool ListInsertHead(int *e); bool ListInsertTail(int *e); bool ListDelete(int i,int *e); void ListTranverse(); protected: int *m_pList; int m_iSize; int m_iLength; }; #endif
主函数:
#include <stdio.h> #include <stdlib.h> #include "List.h" using namespace std; int main(void) { int e1 = 3; List *list1 = new List(10); list1->ListInsert(0,&e1); list1->ListTranverse(); system("pause"); return 0; }
以上代码为整型的顺序list链表,加入一个模板(ps:由于vs中模板的定义个声明不能分开写,我的代码做了一点小小的修改),
修改以上代码,如下所示:
List.h
1 #ifndef LIST_H 2 #define LIST_H 3 4 5 template<typename T1> 6 class List 7 { 8 public: 9 List(int Size); 10 ~List(); 11 void ClearList(); 12 bool IsEmpty(); 13 int GetLength(); 14 bool GetElement(int i,T1 *e); 15 int LocateElement(T1 *e); 16 bool PriorElement(T1 *PreElement,T1 *CurrentElement); 17 bool NextElement(T1 *NeElment,T1 *CurrentElement); 18 bool ListInsert(int i,T1 *e); 19 bool ListInsertHead(T1 *e); 20 bool ListInsertTail(T1 *e); 21 bool ListDelete(int i,T1 *e); 22 void ListTranverse(); 23 protected: 24 T1 *m_pList; 25 int m_iSize; 26 int m_iLength; 27 }; 28 29 #endif
List.cpp
1 #include <iostream> 2 #include "List.h" 3 4 using namespace std; 5 6 //创建链表 7 template<typename T1> List<T1>::List(int Size) 8 { 9 m_iSize =Size; 10 m_pList = new T1[m_iSize]; 11 m_iLength = 0; 12 } 13 template<typename T1> List<T1>::~List() 14 { 15 delete []m_pList; 16 m_pList = NULL; 17 } 18 //清空链表 19 template<typename T1> void List<T1>::ClearList() 20 { 21 m_iLength = 0; 22 } 23 template<typename T1> bool List<T1>::IsEmpty() 24 { 25 if (m_iLength==0) 26 { 27 return true; 28 } 29 else 30 { 31 return false; 32 } 33 } 34 template<typename T1> int List<T1>::GetLength() 35 { 36 return m_iLength; 37 } 38 template<typename T1> bool List<T1>::GetElement(int i,T1 *e) 39 { 40 if (i<0||i>m_iSize) 41 { 42 return false; 43 } 44 *e = m_pList[i]; 45 return true; 46 } 47 template<typename T1> int List<T1>::LocateElement(T1 *e) 48 { 49 for (int i=0;i<m_iLength;i++) 50 { 51 if (m_pList[i] == *e) 52 { 53 return i; 54 } 55 } 56 } 57 /********************************************************** 58 获取指定元素的前驱 59 **********************************************************/ 60 template<typename T1> bool List<T1>::PriorElement(T1 *PreElement,T1 *CurrentElement) 61 { 62 int temp = LocateElement(CurrentElement); 63 if (temp == -1) 64 { 65 return false; 66 } 67 else 68 { 69 if (temp == 0) 70 { 71 return false; 72 } 73 else 74 { 75 *PreElement = m_pList[temp-1]; 76 return true; 77 } 78 } 79 } 80 /******************************************************* 81 获取指定元素的后继 82 ********************************************************/ 83 template<typename T1> bool List<T1>::NextElement(T1 *NeElment,T1 *CurrentElement) 84 { 85 int temp = LocateElement(CurrentElement); 86 if (temp == -1) 87 { 88 return false; 89 } 90 else 91 { 92 if (temp == m_iLength) 93 { 94 return false; 95 } 96 else 97 { 98 *NeElment = m_pList[temp+1]; 99 return true; 100 } 101 } 102 } 103 /************************************ 104 在顺序表中的指定位置插入元素 105 *************************************/ 106 template<typename T1> bool List<T1>::ListInsert(int i,T1 *e) 107 { 108 if(i<0||i>m_iLength) 109 { 110 return false; 111 } 112 for (int k=m_iLength-1;k>=i;k--) 113 { 114 m_pList[k+1] = m_pList[k]; 115 } 116 m_pList[i] = *e; 117 m_iLength++; 118 } 119 /*********************************** 120 删除顺序表指定的元素 121 ************************************/ 122 template<typename T1> bool List<T1>::ListDelete(int i,T1 *e) 123 { 124 *e = m_pList[i]; 125 if(i<0||i>m_iLength) 126 { 127 return false; 128 } 129 for (int k=i+1;k<m_iLength;i++) 130 { 131 m_pList[k-1] = m_pList[k]; 132 } 133 m_iLength--; 134 } 135 /*********************************** 136 遍历顺序表中的数据 137 ************************************/ 138 template<typename T1> void List<T1>::ListTranverse() 139 { 140 for (int i=0;i<m_iLength;i++) 141 { 142 cout<<m_pList[i]<<endl; 143 } 144 } 145 //bool List::ListInsertHead(int *e) 146 //{ 147 // 148 //} 149 //bool List::ListInsertTail(int *e) 150 //{ 151 // 152 //}
main.cpp
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include "List.h" 4 #include "List.cpp" 5 6 using namespace std; 7 8 int main(void) 9 { 10 float e1 = 3.2; 11 List<float> *list1 = new List<float>(10); 12 list1->ListInsert(0,&e1); 13 list1->ListTranverse(); 14 system("pause"); 15 return 0; 16 }
好了,完整实现,以上是一个顺序链表,换句话说就是一个数组的源码。接下来继续分享链表的源码
原文地址:https://www.cnblogs.com/yiqinari/p/10017822.html
时间: 2024-10-16 22:36:05