1.扩大线性表LA,将存在于线性表中LB而不存在在于LA中的数据元素插入到线性表LA中去。
思路:
A:从线性表LB中依次取得每个数据元素
B:将值在线性表中进行查询,若不存在,则插入之。
#include <stdlib.h>
#include <stdio.h>
#define LIST_INIT_SIZE 10
#define LIST_INCREMENT 2
/*函数结果状态代码*/
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int ElemType;
typedef int Status;
//线性表动态分配顺序存储结构
//C语言可动态分配的一维数组
typedef struct {
ElemType *elem; //存储空间基址
int length; //当前长度
int listsize; //当前分配的存储量
} SqList ;
/* 操作结果:构造一个空的顺序线性表L */
void InitList(SqList *L){
(*L).elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if (!(*L).elem) exit(OVERFLOW);
(*L).length = 0; //空表长度为0
(*L).listsize = LIST_INIT_SIZE; //初始容量
}
/* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */
int ListLength(SqList L){
return L.length;
}
/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)。操作结果:用e返回L中第i个数据元素的值 */
Status GetElem(SqList L, int i, ElemType *e){
if (i<1 || i>L.length) return ERROR;
*e = *(L.elem + i - 1);
return OK;
}
/* 初始条件:顺序线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0) */
/* 操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。 */
/* 若这样的数据元素不存在,则返回值为0。*/
int LocateElem(SqList L, ElemType e, Status(*compare)(ElemType, ElemType)){
ElemType *p;
int i = 1; //第一个元素的位置
p = L.elem;
while (i <= L.length && !compare(*p++, e)) i++;
if (i <= L.length) return i;
else return 0;
}
/* 判断是否相等的函数 */
Status equal(ElemType c1, ElemType c2){
if (c1 == c2) return TRUE;
else return FALSE;
}
/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)+1 */
/* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */
Status ListInsert(SqList *L, int i, ElemType e){
ElemType *newbase, *q, *p;
if (i<1 || i>(*L).length+1) return ERROR; // i值不合法
if ((*L).length >= (*L).listsize){ // 当前存储空间已满,增加分配
newbase = (ElemType *)realloc((*L).elem, ((*L).listsize + LIST_INCREMENT)*sizeof(ElemType));
if (!newbase) exit(OVERFLOW); // 存储分配失败
(*L).elem = newbase; //新基址
(*L).listsize += LIST_INCREMENT; //增加存储容量
}
q = (*L).elem + i - 1; //插入的位置
for (p = (*L).elem + (*L).length - 1; p >= q; --p) //将插入位置及之后的元素右移
*(p + 1) = *p;
*q = e;
++(*L).length;
return OK;
}
void print1(ElemType * c){
printf("%d", *c);
}
/* 初始条件:顺序线性表L已存在 */
/* 操作结果:依次对L的每个数据元素调用函数vi() */
/* vi()的形参加'&',表明可通过调用vi()改变元素的值 */
void ListTraverse(SqList L, void(* vi)(ElemType *)){
ElemType *p;
int i;
p = L.elem;
for (i = 1; i <= L.length; i++){
vi(p++);
printf("
");
}
}
/*将所有在线性表Lb中但不在La中的数据元素插入到La中*/
void Union(SqList *La, SqList Lb){
ElemType e;
int La_len, Lb_len;
int i;
La_len = ListLength(*La);
Lb_len = ListLength(Lb);
for (i = 1; i <= Lb_len; i++){
GetElem(Lb, i, &e);
if (!LocateElem(*La, e, equal)){//La中不存在和e相同的元素,则插入之
ListInsert(La, ++La_len, e);
}
}
}
//测试代码
void main(){
SqList La, Lb;
int j;
InitList(&La); //创建空表La。如不成功,则会退出程序的运行
for (j = 1; j <= 5; j++)
ListInsert(&La, j,j);
printf("La=");
ListTraverse(La, print1);
InitList(&Lb);
for (j = 1; j <= 5; j++)
ListInsert(&Lb, j, 2*j);
printf("Lb=");
ListTraverse(Lb, print1);
Union(&La, Lb);
printf("new La=");
ListTraverse(La, print1);
system("PAUSE");
}