线性表的顺序表示与实现(C语言版)

线性表的顺序表示与实现(C语言版)

本例为纯C语言实现, 无C++部分

​
//	本例为纯C语言实现,所用编译器为C编译器,非C++编译器 
//	线性表的顺序表示与实现 

#include<stdio.h>
#include<stdlib.h> 

#define LIST_INIT_SIZE 100	//线性表存储空间初始分配量 
#define LIST_INCREMENT 10	//线性表存储空间的分配增量 

typedef struct _SqList{
	int length;	//当前长度 
	int listSize;	//当前分配的存储容量
	int* elem;	//存储空间基址 
}SqList;

int initList(SqList* L);
int insertListElem(SqList* L, int i, int e);
int deleteListElem(SqList* L, int i, int* e); 
int mergeList(SqList La, SqList Lb, SqList* Lc); 

int main(){
	
	int i; 	//	循环条件所用
	int ee; //	返回元素的值 
	int* e = &ee;	//	指针e指向返回元素的的值 
	SqList list,La,Lb,Lc,*l;
	l = &list; 
	if( initList(l) && initList(&La) && initList(&Lb) ){ 
	//	如果初始化成功线性表成功,向线性表中插入元5个元素 
		for( i=1;i<=5;i++ ){ 
			insertListElem( l, i, i+5); 
			insertListElem(&La, i, i);
			insertListElem(&Lb, i, i+3); 
		} 
		printf("线性表l为: \n");
		for(i=0;i<l->length;i++){
			printf("%d ",l->elem[i]); 
		}
		printf("\n");
		printf("线性表La为: \n");
		for(i=0;i<La.length;i++){
			printf("%d ",La.elem[i]); 
		}
		printf("\n");
		printf("线性表Lb为: \n");
		for(i=0;i<Lb.length;i++){
			printf("%d ",Lb.elem[i]); 
		}				
		printf("\n");
	} 
	else{
		printf("初始化线性表失败!");
	} 
	printf("\n");
	//	删除线性表中的第3个元素 
	deleteListElem(l,3,e);
	printf("线性表l删除的元素为: %d\n", *e); 
	printf("线性表l删除元素e后的为: \n");
	for(i=0;i<l->length;i++){
		printf("%d ",l->elem[i]); 
	}
	printf("\n");		
	printf("\n");
	//	合并线性表 
	if( mergeList(La, Lb, &Lc) ){
		printf("线性表La和线性表Lb合并后的线性表Lc为: \n"); 
		for( i=0; i<Lc.length; i++ ){
			printf("%d ", Lc.elem[i]);
		} 
	}
	else{
		printf("合并线性表失败!"); 
	} 
	 
	return 0;
}

int initList(SqList* L){ 	//	int InitList(SqList& L){   (C++) 
	//	构造一个空的线性表 L
	L->elem = (int* )malloc(LIST_INIT_SIZE*sizeof(int));
	if(!L->elem){ 
		printf("存储空间分配失败!"); 
		return 0;
	} 
	L->length = 0;
	L->listSize = LIST_INIT_SIZE;
	return 1;
} 

int insertListElem(SqList* L, int i, int e){	//	int InsertList(SqList &L, int i, SqList e){		(C++)
	//	在线性表L的第i个元素之前插入元素e 
	if( i<1 || i>(L->length+1) ){
	//	当插入位置在第1个元素之前或在最后一个元素的后面的后面插入元素则返回错误 
		printf("线性表插入元素位置错误!");
		return 0; 
	} 
	if(L->length>=L->listSize){
		//	如果存储空间不择,则分配空间 
		int* newBase = (int* )realloc(L->elem, (L->listSize + LIST_INCREMENT)*sizeof(int)); 
		if( !newBase ){
		//	存储空间分配失败 
			printf("增加存储空间失败!"); 
			return 0;
		} 
		
		L->elem = newBase;	//	将新的存储空间基址给L.elem 
		L->listSize += LIST_INCREMENT;	//	更新存储空间容量 
	}
	int* q = &L->elem[i-1];	//	指针q指向元素e要插入的位置 
	int* p;
	for( p=&L->elem[L->length-1]; p>=q; p--){
		*(p+1) = *p;	//	将q指向的元素以及后面的元素后移 
	}
	*q = e;	//	将元素e插入线性表
	++L->length;
	return 1;	
}

int deleteListElem(SqList* L, int i, int* e){
	//	删除第i个元素,并用e指向其值 	 
	if(i<1 || i>L->length){
	//	如果第i个元素不存在,返回错误
		printf("第%d个元素不存在!",i);
		return 0; 
	} 
	
	int* q = &L->elem[i-1]; 	//	指针q指向要删除的元素 
	int* p = L->elem + L->length-1;	//	指针p指向最后一个元素  
	*e = *q; 	//	将要删除的元素赋值给指针e所指向的地址 
	for(; q<p; q++) {
	//	q后面的所有元素皆前移一位 
		*q = *(q+1); 
	} 
	--L->length;
	return 1; 
} 

int mergeList(SqList La, SqList Lb, SqList* Lc){
	//	合并线性表,按照非递减顺序排列 
	//	线性表a和b的首地址
	int* qa = La.elem;
	int* qb = Lb.elem;
	int* qc; 
	//	更新线性表c的长度和存储空间为a的长度和b的长度之和
	Lc->listSize = Lc->length = La.length + Lb.length; 
	//	为线性表c分配空间 
	Lc->elem = (int* )malloc(Lc->listSize*sizeof(int));
	if(!Lc->elem){
	//	存储空间分配失败返回0 
		printf("Lc存储空间分配失败!"); 
		return 0;
	}
	qc = Lc->elem; 
	//	线性表a和b的尾地址
	int* pa = La.elem + La.length - 1;
	int* pb = Lb.elem + Lb.length - 1; 
	//	将线性表a中的元素和b中的元素插入c 
	while(qa<=pa && qb<=pb){
		if(*qa <= *qb){
			*qc++ = *qa++;
		}
		else{
			*qc++ = *qb++;
		}
	}
	while(qa<=pa){
		*qc++ = *qa++; 
	} 
	while(qb<=pb){
		*qc++ = *qb++; 
	} 
	
	return 1;
} 

​

 

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值