线性表的合并

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");


}

 

posted on 2015-11-18 20:38  super90  阅读(712)  评论(0编辑  收藏  举报

导航