线性表的操作 (2.1) C = A U B
2016-05-16 13:13
330 查看
//操作结果 C = AUB #include <stdio.h> #include <malloc.h> #include <stdlib.h> #define LIST_INIT_SIZE 10 //动态内存的初始分配量 #define LISTINCREMENT 2 typedef struct SqList { int *elem; int length; int listsize; }SqList; bool InitList(SqList *L); //线性表的初始化 bool ListInsert(SqList *L,int pos,int e); //在第pos个位置插入e bool ListTraverse(SqList *L); //输出线性表中的元素 int comp(int c1,int c2); void MergeList(SqList La,SqList Lb, SqList * Lc); int main() { SqList La, Lb, Lc; int j; InitList(&La); //在表La中插入5个元素 for(j = 1; j <= 5; j++) ListInsert(&La,j,j); printf("La = "); ListTraverse(&La); //输出La的元素 InitList(&Lb); for(j = 1; j <= 5; j++) //在表Lb中插入5个元素 ListInsert(&Lb,j,2*j); printf("Lb = "); ListTraverse(&Lb); MergeList(La,Lb,&Lc); printf("Lc = "); ListTraverse(&Lc); return 0; } bool InitList(SqList *L) //线性表的初始化 { L->elem = (int *)malloc(LIST_INIT_SIZE*sizeof(int)); if(L->elem == NULL) { printf("内存分配失败 程序终止!\n"); exit(-1); } L->length = 0; L->listsize = LIST_INIT_SIZE; return 0; } bool ListInsert(SqList *L,int pos,int e) //在第pos个位置插入e { int * newbase, *p, *q; if(pos < 1 || pos > L->listsize) //pos值不合法 return false; if(L->length >= L->listsize) //当前存储空间已满 增加分配 { newbase = (int *)realloc(L->elem,(L->listsize + LISTINCREMENT)*sizeof(int)); if(newbase == NULL) { printf("内存分配失败 程序终止!\n"); exit(-1); } L->elem = newbase; L->listsize += LISTINCREMENT; } q = L->elem + pos - 1; for(p = L->elem + L->listsize - 1; p >= q; p--) //插入位置及插入位置之后的元素右移 *(p+1) = *p; *q = e; //插入e L->length++; return true; } bool ListTraverse(SqList *L) //输出线性表中的元素 { int *p; int i; p = L->elem; for(i = 1; i <= L->length; i++) printf("%d ",*p++); printf("\n"); return true; } void MergeList(SqList La,SqList Lb, SqList * Lc) { int *pa, *pa_last, *pb, *pb_last, *pc; pa = La.elem; pb = Lb.elem; Lc->listsize = La.length + Lb.length; pc = Lc->elem = (int *)malloc(Lc->listsize*sizeof(int)); if(Lc->elem == NULL) { printf("内存分配失败 程序终止!\n"); exit(-1); } pa_last = La.elem + La.length - 1; pb_last = Lb.elem + Lb.length - 1; while(pa <= pa_last && pb <= pb_last) //表La和表Lb均为非空 { switch(comp(*pa,*pb)) { case 0: pb++; case 1: *pc++ = *pa++; break; case -1: *pc++ = *pb++; } } while(pa <= pa_last) //表La非空 表Lb为空 *pc++ = *pa++; while(pb <= pb_last) *pc++ = *pb++; Lc->length = pc - Lc->elem; } int comp(int c1,int c2) { int i; if(c1 < c2) i = 1; else if(c1 = c2) i = 0; else i = -1; return i; }
程序执行结果:
相关文章推荐
- 学习ActionBar的用法
- Hdu oj 1285 确定比赛名次(拓扑排序)
- 神经网络浅讲:从神经元到深度学习
- p7-p8面试经验总结--拿到offer
- foreach语句使用总结
- UVa 11827 Maximum GCD
- Codeforces 672 C. Recycling Bottles(Codeforces Round #352 (Div. 2))
- k3调拨单中新增一级菜单及二级菜单
- angularjs和vuejs的路由用#识别路径
- 数据结构学习笔记07散列查找(哈希表)
- 算法系列之直接插入排序
- 老旧电脑笔记本安装XP过程中突然报错黑屏关机无法安装的解决办法
- js更改input标签的读写属性
- git命令大全
- 简单操作系统(1)十分钟完成的操作系统
- Java字符判断
- javaweb学习总结(五)——Servlet开发(一)
- 异或运算
- 对spring中AOP的理解(事务管理)
- 扫清Android面试障碍--面试前的准备