线性表的操作 (2)实现 C = A U B
来源:互联网 发布:snh48 成员家境 知乎 编辑:程序博客网 时间:2024/04/28 23:15
/*已知线性表LA和LB中的数据元素值按非递减有序排列 现将LA和LB归并一个新表LC 且LC中的数据元素按值非递减有序排列LA = {3,5,8,11}LB = {2,6,8,9,11,15,20}则LC = {2,3,5,6,8,8,9,11,11,15,20}*/#include <stdio.h>#include <malloc.h>#include <stdlib.h>#define LIST_INIT_SIZE 10#define LISTINCREMENT 2typedef struct SqList{int *elem;int length;int listsize;}SqList;bool InitList(SqList *L); //线性表的初始化bool ListInsert(SqList *L,int pos,int e); //在线性表第pos位置插入 ebool ListTraverse(SqList *L); //遍历线性表的元素bool GetElem(SqList L,int pos,int *e); //用e返回L中第pos个数据的值int ListLength(SqList L); //求线性表的长度void MergeList(SqList La,SqList Lb,SqList *Lc); int main(){SqList La, Lb, Lc;int j, a[4] = {3,5,8,11}, b[7] = {2,6,8,9,11,15,20};InitList(&La); //创建空表Lafor(j = 1; j <= 4; j++) //在La中插入4个元素ListInsert(&La,j,a[j-1]);printf("La = "); //输出La的内容ListTraverse(&La); InitList(&Lb); //创建空表 Lbfor(j = 1; j <= 7; j++)ListInsert(&Lb,j,b[j-1]);printf("Lb = ");ListTraverse(&Lb);MergeList(La,Lb,&Lc);//将La Lb中的元素插入Lc中printf("Lc = "); //输出表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 true;}bool ListInsert(SqList *L,int pos,int e) //在线性表第pos位置插入 e{int *newbase, *p, *q;if(pos < 1 || pos > L->listsize + 1) //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; // q为插入位值for(p = L->elem + L->length - 1; p >= q; --p) //插入位置及之后的元素右移*(p+1) = *p;*q = e; //插入eL->length++; //表长增1return true;}bool ListTraverse(SqList *L) //遍历线性表的元素{int *p;int i;p = L->elem;for(i = 1; i <= L->length; i++)printf("%d ",*p++); // *p++ 先执行*p 再执行p++ printf("\n");return true;}void MergeList(SqList La,SqList Lb,SqList *Lc){//已知线性表La和Lb中的数据元素按值非递减排列//归并La和Lb得到的新的线性表Lc,Lc的数据元素也按值的 非递减排列int i = 1, j = 1, k = 0;int La_len, Lb_len;int ai, bj;InitList(Lc); //创建空表LcLa_len = ListLength(La);Lb_len = ListLength(Lb);while(i <= La_len && j <= Lb_len) //表La和La均为非空{GetElem(La,i,&ai);GetElem(Lb,j,&bj);if(ai <= bj){ListInsert(Lc,++k,ai);i++;}else{ListInsert(Lc,++k,bj);j++;}}while(i <= La_len) //表La非空且表Lb空{GetElem(La,i++,&ai);ListInsert(Lc,++k,ai);}while(j <= Lb_len) //表Lb非空且表La空{GetElem(Lb,j++,&bj);ListInsert(Lc,++k,bj);}}int ListLength(SqList L) //求线性表的长度{return L.length;}bool GetElem(SqList L,int pos,int *e) //用e返回L中第pos个数据的值{if(pos < 1 || pos > L.length)return false;*e = *(L.elem + pos - 1);return true;}/*上一个函数的第二中写法 通过址传递bool GetElem(SqList *L, int pos,int *e) //前面声明函数也与此句保持一致{if(pos < 1 || pos > L->length)return false;*e = *(L->elem + pos - 1);return true;}*/
程序执行结果:
0 0
- 线性表的操作 (2)实现 C = A U B
- 线性表的操作 (2.1) C = A U B
- 线性表的操作 (2.2) C = A U B
- 线性表的操作 (1)实现 A= A U B
- 数据结构笔记(一)线性表的顺序表示和基本操作及其顺序表实现的集合运算(A-B)U(B-A)实例
- 1.2链式结构 实现 C = A U B
- 数据结构-C语言 单链线性表实现归并 C=A∪B
- 静态链表实现(A-B)U(B-A)
- 合并A,B为线性表C(表C用顺序表实现)
- C 类LinkList实现线性链表的一般操作
- C语言实现线性表的插入和删除操作
- 数组实现的线性表基本操作[C]
- 顺序线性表的基本操作(C语言实现)
- 利用线性表实现集合A并上B
- python实现两个线性表集合A和B的并集
- 数组实现的线性表的基本操作2[C语言]
- 在无头结点的动态单链表上实现线性表操作Insert(L,i,b)
- 如何用链表实现A U B,和 A n B呢?
- Android并发编程之Handler,MessageQueue,Looper详解
- Xilinx petalinux 2015.4 试用
- 顺序表应用1:多余元素删除之移位算法
- 理解js中的闭包
- python正则表达式 详解与实例
- 线性表的操作 (2)实现 C = A U B
- Java实现-高效排序算法之归并排序
- 1103. Integer Factorization (30)【搜索+剪枝】——PAT (Advanced Level) Practise
- QT实现五子棋(附源码)
- Vjudge 2016-5-10 math test
- utilities(matlab)—— ZCA 白化
- 图片压缩
- 1104. Sum of Number Segments (20)【数学题】——PAT (Advanced Level) Practise
- android开发笔记之多媒体—Canvas的相关方法