1.  /*  
  2.  
  3. 每个函数都做了很清晰的注释,适合初学数据结构的朋友。  
  4.  
  5. 表中在Lb中但不在La中的元素插入到La中  
  6.  
  7. */ 
  8.  
  9.  
  10.    
  11. //c_1.h  
  12. # include <string.h>  
  13. # include <ctype.h>  
  14. # include <malloc.h>  
  15. # include <limits.h>  //INT_MAX  
  16. # include <stdio.h>  
  17. # include <stdlib.h> //atoi()  
  18. # include <io.h> //eof()  
  19. # include <math.h>  
  20. # include <process.h>  
  21. # include <iostream.h>  
  22. //函数结果状态保存码  
  23. # define OK        1  
  24. # define TRUE    1  
  25. # define FLASE   0  
  26. # define ERROR  0  
  27. # define  INFEASIBLE   -1  
  28. typedef   int Status;  
  29. typedef   int   Boolean;  
  30. typedef   int   ElemType;  
  31.    
  32.    
  33. //c_2.h 线性表的动态分配顺序存储结构  
  34. # define LIST_INIT_SIZE    10  //线性表存储空间的初始分配量  
  35. # define LIST_INCREMENT  2  //线性表存储空间的分配增量  
  36.    
  37. struct SqList  
  38. {  
  39.         ElemType   *elem;  //存储空间基址  
  40.         int   length;           //当前长度  
  41.         int listsize;       //当前分配的存储容量以sizeof(ElemType)为单位  
  42. };  
  43.    
  44. //base_operation.cpp  
  45. //顺序表示的线性表包括算法,2.3,2.4,2.5,2.6  
  46. void  InitList(SqList  &L)  //算法2.3  
  47. {  
  48. //操作结果:构造一个空的顺序线性表L  
  49. L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));  
  50. if(! L.elem)  
  51. {  
  52. exit(OVERFLOW);  
  53. }  
  54. L.length = 0;//空表长度为0  
  55. L.listsize = LIST_INIT_SIZE;  //初始化存储分量  
  56. }  
  57.    
  58. void DestoryList(SqList  &L)  
  59. {  
  60. //初始条件:顺序线性表L已存在  
  61. //操作结果:销毁顺序线性表L  
  62. free(L.elem);  
  63. L.elem = NULL;  
  64. L.length = 0;  
  65. L.listsize = 0;  
  66. }  
  67.    
  68. void ClearList(SqList  &L)  
  69. {  
  70. //初始条件;顺序表L已存在  
  71. //操作结果:将L置为空表  
  72.    
  73. L.length = 0;  
  74. }  
  75.    
  76. Status  ListEmpty(SqList  L)  
  77. {  
  78. //初始条件:顺序表L已存在  
  79. //操作结果:若L表为空表,则返回TRUE,否则返回FALSE  
  80. if(L.length == 0)  
  81. {  
  82. return  TRUE;  
  83. }  
  84. else 
  85. {  
  86. return FLASE;  
  87. }  
  88.    
  89. }  
  90.    
  91. int  ListLength(SqList L)  
  92. {  
  93. //初始条件:顺序线性表L已存在  
  94. //操作结果:返回L中数据元素的个数  
  95.    
  96. return  L.length;  
  97. }  
  98.    
  99. Status  GetElem(SqList  L,int i,ElemType  &e)  
  100. {  
  101. //初始条件:顺序线性表L已存在,1<=i<=ListLength(L)  
  102. //操作结果:用e返回L中第i个数据元素的值  
  103. if(i < 1 || i > L.length)  
  104. {  
  105. return ERROR;   
  106. }  
  107. e = *(L.elem + i - 1);  
  108.    
  109. return  OK;  
  110. }  
  111.    
  112.    
  113. int  LocateElem(SqList  L,ElemType e,Status(*compare)(ElemType , ElemType))  
  114. {  
  115. //初始条件:顺序线性表L已存在compare()是数据元素判定函数,满足为1,否则为0  
  116. //操作结果:返回L中第1个与e满足关系compare 的数据元素的位序  
  117. ElemType  *p;  
  118. int  i = 1; //i的初始值为第1个元素的位序  
  119. p = L.elem; //p的初值为第1个元素的存储位置  
  120.    
  121. while(i <= L.length && !compare(*p++,e))  
  122. {  
  123. ++i;  
  124. }  
  125. if(i <= L.length)  
  126. {  
  127. return i;  
  128. }  
  129. else 
  130. {  
  131. return 0;  
  132. }  
  133. }  
  134.    
  135. Status  PriorElem(SqList  L,ElemType  cur_e,ElemType  &pre_e)  
  136. {  
  137. //初始条件:顺序线性表L已存在  
  138. //操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无意义  
  139. int i = 2;  
  140. ElemType  *p = L.elem + 1;  
  141. while(i <= L.length && *p != cur_e)  
  142. {  
  143. p++;  
  144. i++;  
  145. }  
  146. if(i > L.length)  
  147. {  
  148. return INFEASIBLE;  //操作失败  
  149. }  
  150. else 
  151. {  
  152. pre_e = *--p;  
  153. return OK;  
  154. }  
  155. }  
  156.    
  157. Status NextElem(SqList L,ElemType  cur_e,ElemType  &next_e)  
  158. {  
  159. //初始条件:顺序线性表L已存在  
  160. //操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,否则操作失败  
  161. int i = 1;  
  162. ElemType  *p = L.elem;  
  163. while(i < L.length && *p != cur_e)  
  164. {  
  165. i++;  
  166. p++;  
  167. }  
  168. if(i == L.length)  
  169. {  
  170. return INFEASIBLE;//操作失败  
  171. }  
  172. else 
  173. {  
  174. //next_e = *p++;  
  175. next_e = *++p;  
  176. return OK;  
  177. }  
  178.    
  179. }  
  180.    
  181. Status  ListInsert(SqList &L,int i,ElemType  e) //算法2.4  
  182. {  
  183. //初始条件:顺序线性表已存在,且1<=i<=ListLength(L)+1  
  184. //操作结果:在L中的第i个元素位置之前插入新的数据元素e,L的长度加1  
  185. ElemType  *newbase ,*q, *p;  
  186. if(i < 1 || i > L.length + 1)  
  187. {  
  188. return ERROR;  
  189. }  
  190. if(L.length >= L.listsize)//当前存储空间已满,增加分配  
  191. {  
  192. if(!(newbase = (ElemType *)realloc(L.elem,(L.listsize + LIST_INCREMENT) * sizeof(ElemType))))  
  193. {  
  194. exit(OVERFLOW);//存储分配失败  
  195. }  
  196. L.elem = newbase;//新基址  
  197. L.listsize += LIST_INCREMENT;  //增加存储容量  
  198. }  
  199. q = L.elem + i - 1;//q为插入位置  
  200. for(p = L.elem + L.length - 1;p >= q; --p)//插入位置及之后的元素右移  
  201. {  
  202. *(p + 1) = *p;  
  203. }  
  204. *q = e;//插入e  
  205. ++L.length;//表长增1  
  206. return OK;   
  207. }  
  208.    
  209. Status ListDelete(SqList  &L,int i, ElemType  &e)  
  210. {  
  211. //初始条件:顺序线性表已存在,1<=i<=L.length(L)  
  212. //操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1  
  213. ElemType  *p,*q;  
  214. if(i < 1 || i > L.length)  
  215. {  
  216. return ERROR;  
  217. }  
  218. p = L.elem + i - 1; //p为被删除的元素位置  
  219. e = *p;   //被删除的元素赋给e  
  220. q = L.elem + L.length - 1; //表尾元素位置  
  221. for(++p; p <= q; ++p) //被删除的元素之后的元素左移  
  222. {  
  223. *(p - 1) = *p;  
  224. }  
  225. L.length--; //表长减1  
  226. return OK;  
  227. }  
  228.    
  229. void ListTraverse(SqList  L,void (*vi)(ElemType&))  
  230. {  
  231. //初始条件:顺序线性表L已存在  
  232. //操作结果:依次对L的每个数据元素调用vi(),vi()的形参加&,表明可以通过vi()改变元素的值  
  233. ElemType  *p;  
  234. int i;  
  235. p = L.elem;  
  236. for(i = 1; i <= L.length; i++)  
  237. {  
  238. vi(*p++);  
  239. }  
  240. printf("\n");  
  241. }  
  242.    
  243. // function_1.cpp    
  244. Status  equal(ElemType  c1,ElemType c2)  
  245. {  
  246. //判断是否相等的函数  
  247. if(c1 == c2)  
  248. {  
  249. return  OK;  
  250. }  
  251. else 
  252. {  
  253. return FLASE;  
  254. }  
  255. }  
  256.    
  257. int  comp(ElemType a,ElemType  b)  
  258. {  
  259. //根据a< = > b 分别返回-1,0,1  
  260. if(a == b)  
  261. {  
  262. return 0;  
  263. }  
  264. else 
  265. {  
  266. return (a - b)/abs(a - b);  
  267. }  
  268. }  
  269.    
  270. void  print(ElemType  c)  
  271. {  
  272. printf("%d",c);  
  273. }  
  274.    
  275. void print2(ElemType  c)  
  276. {  
  277. printf("%c",c);  
  278. }  
  279.    
  280. void print1(ElemType  &c)  
  281. {  
  282. printf("%d ",c);  
  283. }  
  284.    
  285.    
  286.    
  287.    
  288. Status  sq(ElemType  c1, ElemType  c2)  
  289. {  
  290. //数据元素判定函数平方关系,LocateElem()调用的函数  
  291. if(c1 == c2*c2)  
  292. {  
  293. return  TRUE;  
  294. }  
  295. else 
  296. {  
  297. return  FLASE;  
  298. }  
  299. }  
  300.    
  301. void db1(ElemType  &c)  
  302. {  
  303. //ListTraverse()调用的另一函数  
  304. c *= 2;   
  305. }  
  306.    
  307.    
  308.    
  309.    
  310.    
  311.    
  312.    
  313.    
  314.    
  315. //# include "c_1.h"  
  316. //typedef  int  ElemType;  
  317. //# include "c_2.h"  
  318. //# include " base_operation.cpp "  
  319. //# include "function_1.cpp"  
  320.    
  321. void  Union(SqList  &La, SqList  Lb)  
  322. {  
  323. //讲表中在Lb中但不在La中的元素插入到La中  
  324. ElemType   e;  
  325. int  La_len,Lb_len;  
  326. int  i;  
  327.    
  328. La_len = ListLength(La);//求线性表的长度  
  329. Lb_len = ListLength(Lb);  
  330.    
  331. for(i = 1; i <= Lb_len; i++)  
  332. {  
  333. GetElem(Lb,i,e);//取Lb中的第i个元素赋值给e  
  334. if(!LocateElem(La,e,equal))  
  335. {  
  336. ListInsert(La,++La_len,e);  
  337. }  
  338. }  
  339.    
  340. }  
  341.    
  342. void main()  
  343. {  
  344. SqList  La,Lb;  
  345.    
  346. int j;  
  347. InitList(La); //创建空表La。如不成功,则会退出程序的运行  
  348.    
  349. for(j = 1; j <= 5; j++)  
  350. {  
  351. ListInsert(La,j,j);  
  352. }  
  353. printf("La = "); //输出La的内容  
  354.    
  355. ListTraverse(La,print1);  
  356.    
  357. InitList(Lb);  
  358.    
  359. for(j = 1; j <= 5; j++)  
  360. {  
  361. ListInsert(Lb,j,2*j);  
  362. }  
  363.    
  364. printf("Lb = ");//输出Lb的内容  
  365. ListTraverse(Lb,print1);  
  366.    
  367. Union(La,Lb);  
  368.    
  369. printf("new  La = ");//输出新的La的内容  
  370.    
  371. ListTraverse(La,print1);  
  372. }  
  373.   

//Microsoft Visual C++ 6.0  运行成功