【数据结构】顺序线性表2

练手

上代码

C语言

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

#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int ElemType;
typedef struct{
	ElemType *elem;
	int length;
	int listsize;
}SqList;

int InitList_Sq(SqList &L){
	//构造线性表 
	L.elem = (ElemType *) malloc (LIST_INIT_SIZE*sizeof(ElemType));
	if(!L.elem) exit(0);
	L.length = 0;
	L.listsize = LIST_INIT_SIZE;
	
	return 1;
} 

int ListLength(SqList L){
	//返回表长 
	return L.length;
}

int ListSize(SqList L){
	//返回容量 
	return L.listsize;
}

int GetElem(SqList L, int i, ElemType &e){
	ElemType *p;
	if(i<1 || i>ListLength(L)) return 0;//i不合法 
	p = &(L.elem[i-1]);
	e = *p;//北山元素的值赋给e 
	return 0;
}

int LocateElem(SqList L, ElemType e){
	//在顺序表中定位元素e 
	for(int i=0; i<ListLength(L); ++i){
		if(L.elem[i] == e){
			return ++i;
		}
	}
	return 0;
}

int ListInsert_Sq(SqList &L, int i, ElemType e){
	//在顺序表第i个元素前插入新元素e
	//i的合法值为[1,length+1]
	ElemType * newbase,*q,*p;
	if(i<1 || i>ListLength(L)+1) return 0; //i不合法 
	if(L.length>=L.listsize){
		//需要增加存储容量 
		newbase = (ElemType *) realloc (L.elem,(LIST_INIT_SIZE+LISTINCREMENT)*sizeof(ElemType));
		if(!newbase) exit(0);
		L.elem=newbase;
		L.listsize+=LISTINCREMENT;
	} 
	q = &(L.elem[i-1]);//q是插入位置
	for(p=&L.elem[ListLength(L)-1]; p>=q; --p){
		*(p+1) = *p; //插入位置以及之后元素右移 
	}
	*q = e;//插入e 
	++L.length;//表长增1 
	
	return 1; 
}

int ListDelete_Sq(SqList &L, int i, ElemType &e){
	//在顺序表中删除第i个元素,并用e返回其值
	//i的合法值为[1,length]
	ElemType *p, *q;
	if(i<1 || i>ListLength(L)) return 0;//i不合法 
	p = &(L.elem[i-1]);//p为被删除的位置 
	e = *p;//北山元素的值赋给e 
	q = L.elem+ListLength(L)-1; //表尾元素位置
	for(++p; p<=q; ++p){
		//被删元素后一个起一直到最后一个元素左移
		*(p-1)=*p; 
	} 
	--L.length;
	
	return 1;
}

int union_Sq(SqList &La, SqList Lb){
	//将所有在Lb中但不在La中的数据元素插入到La中
	int La_len,Lb_len;
	ElemType e;
	La_len = ListLength(La);
	Lb_len = ListLength(Lb);
	for(int i=1; i<=Lb_len; i++){
		GetElem(Lb,i,e);
		if(!LocateElem(La,e)) ListInsert_Sq(La, ++La_len, e);//L中不存在相同元素,则插入之 
	} 
}

void Print_Sq(SqList L){
	for(int i=0; i<ListLength(L); ++i){
		printf("%d ",L.elem[i]);
	}
}

int main(){
	SqList La,Lb;
	InitList_Sq(La);
	InitList_Sq(Lb);
	for(int i=1;i<=10;i++){
		ListInsert_Sq(La,i,3*i+2);
	}
	for(int i=1;i<=10;i++){
		ListInsert_Sq(Lb,i,2*i+3);
	}
	
	//测试 LocateElem(),定位La的每一个元素,输出1~10和10个0 
	for(int i=1;i<=20;i++){
		printf("%d ",LocateElem(La,3*i+2));
	}
	
	//测试 union_Sq()
	printf("\na:\n");
	Print_Sq(La);
	printf("\n");
	printf("\nb:\n");
	Print_Sq(Lb);
	printf("\n");
	union_Sq(La,Lb);
	printf("\na:\n");
	Print_Sq(La);
	printf("\n");

	//测试存储容量增加
	printf("\nLb长度=%d ,  容量=%d\n",ListLength(Lb),ListSize(Lb)); 
	for(int i=ListLength(Lb)+1;i<=100;i++){
		ListInsert_Sq(Lb,i,i);
	}//此时正好满 
	printf("\nLb长度=%d ,  容量=%d\n",ListLength(Lb),ListSize(Lb)); 
	ListInsert_Sq(Lb,1,999);//此时容量加一个LISTINCREMENT 
	printf("\nLb长度=%d ,  容量=%d\n",ListLength(Lb),ListSize(Lb)); 
	
	
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值