线性表的合并
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("\n"); } } /*将所有在线性表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"); }