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 }
来源:oschina
链接:https://my.oschina.net/u/4367665/blog/3381973