1 #include<bits/stdc++.h>//c++万能头文件,写了这个其他头文件不用写 2 using namespace std;//使用名字空间,你不用管 3 4 #define List_Init_Size 100 5 #define List_Inrement 10 6 #define pr printf 7 8 struct List{ 9 int *elem;//表的基地址 10 int length;//当前表长 11 int listsize;//当前表的容量 12 }; 13 14 //初始化线性表 15 bool InitList(List &L) 16 { 17 L.elem = (int *)malloc(List_Init_Size*sizeof(int)); 18 if(L.elem == NULL) exit(-1); //如果分配内存失败,就退出程序 19 20 L.length = 0; 21 L.listsize = 100; 22 return 1; 23 } 24 25 //线性表插入元素 26 bool ListInsert(List &L,int i,int e) 27 { 28 if(i < 1 || i > L.length + 1) 29 { 30 puts("Oh! Baby! The insertion position is invalid. Please re-enter the insertion position!"); 31 return 0; 32 } 33 //需要清楚,下标是从0开始, 34 //该函数实现的是在第i个元素前面插入一个元素,所有必须判断插入位置的合法性 35 //除了插在最后的元素后面外其他都需要把后面的元素往后移动 36 37 if(L.length >= L.listsize) 38 { 39 //表的容量不够,因为插入的会增加一个元素所以有等号 。 40 //增加容量 41 int *newbase = (int *)realloc(L.elem,(List_Init_Size + List_Inrement)*sizeof(int)); 42 //realloc函数用来为ptr重新分配大小为size的一块内存,看似很简单, 43 //在使用过程中却会发生各种错误。 44 //函数形式为: 45 //void * realloc ( void * ptr, size_t new_size ); 46 47 if(newbase == NULL) 48 { 49 //意味着重新分配内存失败 50 puts("Sorry Baby! Reassigning memory failed!"); 51 exit(-1);//退出程序 52 } 53 L.elem = newbase; 54 L.listsize += List_Inrement; 55 } 56 57 int *q = L.elem + (i-1);//获取第i个元素的地址 58 59 //第i的后面元素往后移动 60 for(int *p = L.elem + (L.length-1); p >= q; p--) 61 *(p+1) = *p; 62 63 *q = e; 64 ++L.length;//添加一个元素,长度加一 65 return 1; 66 } 67 68 //线性表删除元素 69 bool List_Delete(List &L,int i,int &e) 70 { 71 //先判断位置是否合法 72 if(i < 1 || i > L.length) 73 { 74 puts("Oh baby! The deletion location is illegal, please re-enter!"); 75 return 0; 76 } 77 int *q = L.elem + (L.length - 1); 78 int *p = L.elem + (i-1); 79 e = *p; 80 ++p;//这里是为了把第I后面的元素往前移动,此时的p为第i+1个元素的位置 81 for(p; p <= q; p++) 82 *(p-1) = *p; 83 --L.length;//删除一个元素,长度减一 84 return 1; 85 } 86 87 //获取线性表当前的元素个数 88 int getListLength(List &L) 89 { 90 return L.length; 91 } 92 93 //获取线性表元素 94 bool getElem(List &L,int q,int &e) 95 { 96 if(q < 1 || q > L.length) 97 { 98 puts("Oh! Baby! The position is invalid. Please re-enter the position!"); 99 return 0; 100 } 101 int *p = L.elem; 102 e = *(p + (q - 1)); 103 return 1; 104 } 105 106 //遍历线性表 107 void List_Traver(List &L) 108 { 109 puts("Let's do it! Traver! Traver_List!"); 110 int *p = L.elem; 111 for(p; p <= L.elem + (L.length - 1); p++) 112 cout << *p << " "; 113 puts(""); 114 } 115 116 //获取要查找的第一个满足某个比较关系的元素位置,我就判断大于,小于,等于吧 117 int LocateElem(List &L,int e,string s) 118 { 119 int *p = L.elem; 120 int len = L.length; 121 int now = 1; 122 if(s == ">") 123 { 124 for(p ;p <= L.elem + (len - 1);p++) 125 { 126 if(*p > e) 127 { 128 return now; 129 } 130 now++; 131 } 132 puts("Oh baby! Sorry, there is no such number!"); 133 return 0; 134 } 135 else if(s == "<") 136 { 137 for(p ;p <= L.elem + (len - 1);p++) 138 { 139 if(*p < e) 140 { 141 return now; 142 } 143 now++; 144 } 145 puts("Oh baby! Sorry, there is no such number!"); 146 return 0; 147 } 148 else{ 149 for(p ;p <= L.elem + (len - 1);p++) 150 { 151 if(*p == e) 152 { 153 return now; 154 } 155 now++; 156 } 157 puts("Oh baby! Sorry, there is no such number!"); 158 return 0; 159 } 160 } 161 //销毁线性表,清除堆内存。防止内存泄露 162 void List_Destroed(List &L) 163 { 164 int *p; 165 //只能从后面销毁 166 for(p = L.elem + (L.length - 1); p >= L.elem; p--) 167 { 168 free(p); 169 } 170 } 171 172 173 int main() 174 { 175 List L; 176 int ok = InitList(L); 177 if(ok) 178 { 179 puts("Oh Yes! Linear table created successfully!"); 180 cout << "base address = " << L.elem << endl; 181 cout << "L.length = " << L.length << endl; 182 cout << "L.listsize = "<< L.listsize << endl; 183 } 184 185 for(int i = 1;i <= 10;i++) 186 { 187 if(ListInsert(L,i,i)) 188 { 189 puts("GO"); 190 } 191 else { 192 puts("Something Wrong!"); 193 exit(-1); 194 } 195 } 196 197 puts("Check the creation of a linear table"); 198 cout << "base address = " << L.elem << endl; 199 cout << "L.length = " << L.length << endl; 200 cout << "L.listsize = "<< L.listsize << endl; 201 202 List_Traver(L); 203 204 int selem; 205 bool flag = getElem(L,7,selem); 206 if(flag) 207 { 208 cout << "7th number is equal to " << selem << endl; 209 } 210 int pos = LocateElem(L,5,"<"); 211 if(pos) { 212 cout << pos << endl; 213 } 214 215 pos = LocateElem(L,5,"="); 216 if(pos) { 217 cout << pos << endl; 218 } 219 220 pos = LocateElem(L,5,">"); 221 if(pos) { 222 cout << pos << endl; 223 } 224 225 cout << "sizeof(L) = " << sizeof(L) << endl; 226 List_Destroed(L);//销毁 227 cout << "sizeof(L) = " << sizeof(L) << endl;//检查是否销毁成功,如果成功, 228 //下面的语句就不执行 ,因为销毁之后不可用了。 229 List_Traver(L); 230 return 0; 231 }