线性表--顺序存储

 代码来自《大话设计模式》

#include<stdio.h>

#define OK 		1
#define ERROR 	0
#define TRUE 	1
#define FALSE 	0

#define MAXSIZE 20

typedef int Status;
typedef int ElemType;

typedef struct {
	ElemType data[MAXSIZE];
	int length;
}SqList;

Status visit(ElemType c){
	printf("%d ",c);
	return OK;
}

Status InitList(SqList *L){
	L->length = 0;
	return OK;
}

Status Clearlist(SqList *L){
	L->length = 0;
	return 0;
}

Status ListEmpty(SqList L){
	if(L.length == 0){
		return TRUE;
	}
	return FALSE;
}

int ListLength(SqList L){
	return L.length;
}

Status GetElem(SqList L,int i,ElemType *e){
	if(L.length == 0 || i<1 || i>L.length){
		return ERROR;
	}
	*e = L.data[i-1];
	return OK;
}

int LocateElem(SqList L,ElemType e){
	int i;
	if(L.length == 0){
		return 0;
	}
	for(i = 0; i < L.length; i++){
		if(L.data[i]==e){
			break;
		}
	}
	if(i>=L.length){
		return 0;
	}
	return i+1;
}

Status ListInsert(SqList *L,int i,ElemType e){
	int k;
	if(L->length == MAXSIZE){
		return ERROR;
	}
	if(i<1 || i > L->length+1){
		return ERROR;
	}
	if(i <= L->length){
		for(k = L->length; k >= i; k--){
			L->data[k] = L->data[k-1];
		}
	}
	L->data[i-1] = e;
	L->length++;
	return OK;
}

Status ListDelete(SqList *L,int i,ElemType *e){
	int k;
	if(L->length == 0){
		return ERROR;
	}
	if(i < 1 || i > L->length){
		return ERROR;
	}
	*e = L->data[i-1];
	if(i < L->length){
		for(k = i-1; k < L->length-1; k++){
			L->data[k] = L->data[k+1];
		}
	}
	L->length--;
	return OK;
}

Status listTraverse(SqList L){
	int i;
	for(i = 0; i < L.length; i++){
		visit(L.data[i]);
	}
	printf("\n");
	return OK;
}

Status unionList(SqList *La,SqList Lb){
	int len_a,len_b,i;
	ElemType e;
	len_a = ListLength(*La);
	len_b = ListLength(Lb);
	for(i = 1; i <= len_b; i++){
		GetElem(Lb,i,&e);
		if(!LocateElem(*La,e)){
			ListInsert(La,++len_a,e);
		}
	}
	return OK;
}

int main(){
	SqList La;
	SqList Lb;
	ElemType e;
	Status i;
	int j,k;
	i=InitList(&La);
	printf("初始化La后:La.length: %d\n",La.length);
	for(j = 1; j <= 5; j++){
		ListInsert(&La,j,j*2);
	}
	printf("遍历La:");
	listTraverse(La);

	printf("La.length:%d\n",La.length);
	i=ListEmpty(La);
	printf("La是否为空:%d\n",i);

	i = Clearlist(&La);
	printf("清空后:La.length:%d\n",La.length);
	i = ListEmpty(La);
	printf("L是否为空:%d\n",i);

	for(j=0;j<10;j++){
		ListInsert(&La,j+1,j*3);	
	}
	printf("重新插入La后:");
	listTraverse(La);

	ListInsert(&La,5,99);
	printf("在第5个位置插入元素后:");
	listTraverse(La);
	printf("插入之后的La.length:%d\n",La.length);

	GetElem(La,5,&e);
	printf("第5个元素值为:%d\n",e);

	printf("元素为12的位置:%d\n",LocateElem(La,12));

	ListDelete(&La,5,&e);
	printf("删除第5个元素 %d\n",e);
	printf("之后的La为:");
	listTraverse(La);

	i = InitList(&Lb);
	for(j=0;j<=5;j++){
		ListInsert(&Lb,j+1,j*6);
	}
	printf("Lb:");
	listTraverse(Lb);

	unionList(&La,Lb);
	listTraverse(La);
	return 0;
}

  

posted @ 2018-04-11 22:37  寻觅beyond  阅读(202)  评论(0)    收藏  举报
返回顶部