线性表之顺序表示及实现

线性表的特点为:存在唯一的一个首元素;除第一个元素外,都只有一个前驱元素;除最后一个外,都只有一个后继元素。线性表作为一种最简单的数据结构,为N个数据元素的有限序列,其按照存储方式可以分为顺序表和链式表。

首先看顺序表,顾名思义,顺序表即利用一组地址连续的存储单元依次存储线性表中的元素,优点是可随机存取,缺点是不利于删除及插入等操作。

顺序表的数据结构如下:

struct Sqlist{
	ElemType *elem;
	int listSize;
	int length;
};

其中ElemType为线性表中数据元素的类型,定义方式为typedef int ElemType;

下面以线性表的插入、删除、合并及查找来了解及熟悉线性表的操作。

#include<iostream>
using namespace std;

typedef int ElemType;
const int listInitSize = 50;
const int listIncrementSize = 10;

struct Sqlist{
	ElemType *elem;
	int listSize;
	int length;
};

//初始化线性表
void initSqlist(Sqlist &L){
	L.elem = (ElemType*)malloc(listInitSize*sizeof(ElemType));
	if(!L.elem)
		exit(-1);
	L.length = 0;
	L.listSize = listInitSize;
}

//插入元素
void insertSqlist(Sqlist &L,ElemType elem,int pos){

	if(pos>L.listSize||pos>L.length){
		cout<<"超出范围"<<endl;
		exit(-1);
	}

	for(int i=0;i<L.length-pos;i++){
		L.elem[L.length-i] = L.elem[L.length-i-1];
	}
	
	L.elem[pos] = elem;
	L.length++;

	if(L.length == L.listSize)
	{
		ElemType *newbase = (ElemType*)realloc(L.elem,(L.listSize+listIncrementSize)*sizeof(ElemType));
		L.elem = newbase;
		L.listSize += listIncrementSize;
	}
	
}


//删除元素
void deleteSqlist(Sqlist &L,int pos){
	if(pos>L.length){
		cout<<"sorry,线性表中的数据元素没这么多"<<endl;
		exit(-1);
	}

	for(int i=0;i<pos;i++){
		L.elem[pos] = L.elem[pos+1];
	}

	L.length--;

}

//判断元素是否在线性表中
bool exist(Sqlist L,ElemType elem){
	for(int i=0;i<L.length;i++){
		if(L.elem[i] == elem){
			return true;
		}		
	}

	return false;
}

//合并线性表
void mergeSqlist(Sqlist &L1,Sqlist L2){
	for(int i=0;i<L2.length;i++){
		if(!exist(L1,L2.elem[i])){
			insertSqlist(L1,L2.elem[i],L1.length);
		}
	}

}

//销毁线性表
void destroySqlist(Sqlist &L){
	if(!L.elem){
		cout<<"线性表不存在"<<endl;
		exit(0);
	}
	free(L.elem);
	L.elem = NULL;
	L.length = 0;
	L.listSize = 0;

}


//打印线性表
void printSqlist(Sqlist L)
{
	cout<<"线性表的元素为:"<<endl;
	for(int i=0;i<L.length;i++){
		cout<<L.elem[i]<<" ";
	}

	cout<<endl;

}

void main(){
	Sqlist L1;
	initSqlist(L1);
	
	for(int i=0;i<15;i++){
		insertSqlist(L1,i*2,i);
	}	
	printSqlist(L1);
	
	Sqlist L2;
	initSqlist(L2);	
	for(int j=0;j<15;j++){
		insertSqlist(L2,j*3,j);
	}
	
	printSqlist(L2);
	
	mergeSqlist(L1,L2);
	printSqlist(L1);

	deleteSqlist(L1,4);
	printSqlist(L1);

	destroySqlist(L1);
	destroySqlist(L2);
	printSqlist(L1);
	printSqlist(L2);
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值