数据结构-线性表的顺序实现

学习了数据结构后对线性表有了更好的了解,所谓线性表有两种实现方法,一种是用顺序结构,一种是用链式结构。具体说来就是用动态数组与链表的方式来实现。
这便是数据结构的两种储存方式,顺序存储结构与链式存储结构,同时也是数据结构研究的存储结构的具体体现,因此线性表的实现对于初步学习数据结构的我们有着重要的意,这里我们用数组实现顺序线性表。

#include <iostream>
#include <stdlib.h>
#define LIST_INIT_SIZE 100
#define LIST_INCREMENT 10
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int status;
typedef int Elemtype;
using namespace std;
typedef struct
{
	Elemtype *elem;	//线性表基址 
	int length;	//线性表当前长度
	int  listsize;	//线性表分配的存储容量 
}Sqlist; 
int InitList(Sqlist &L);
int DestoryList(Sqlist &L);
int ClearList(Sqlist &L);
int ListEmpty(Sqlist L);
int ListLength(Sqlist L);
int Getelem(Sqlist L,int i,status &e);
int LocateElem(Sqlist L,status e);
int ListInsert(Sqlist &L,int i,status e);
int ListDelete(Sqlist &L,int i,status &e);
int ListTraverse(Sqlist &L);
void MergeList(Sqlist La,Sqlist Lb,Sqlist &Lc);
//排序
int Partition(Elemtype *a,int low,int high);
void QuickSort(Elemtype *a,int low,int high); 
int main()
{
	int a[10]={0,1,5,11,2,6,7,88,6,55};
	int e;
	Sqlist L;
	InitList(L);
	L.elem=a;
	L.length=10;
	L.listsize=LIST_INIT_SIZE;
	cout<<"输出第五位数字"<<endl;
	if(!Getelem(L,5,e)) 
	cout<<"找数字出错"<<endl;
	else
	cout<<"第五位数字是"<<e<<endl;
	cout<<"排序前:"; 
	for(int i=0;i<10;i++)
	{
		cout<<a[i]<<" ";
	} 
	QuickSort(a,0,9);
	cout<<"\n"<<"排序后:";
	for(int i=0;i<10;i++)
	{
		cout<<a[i]<<" ";
	} 
	cout<<endl;
	system("PAUSE");
	return 0;
}

//初始化线性表
 int InitList(Sqlist &L)
 {
 	//构造一个空的线性表 
 	L.elem=(Elemtype *)new Elemtype[LIST_INIT_SIZE*sizeof(Elemtype)];
 	if(!L.elem)
 	exit(OVERFLOW);
 	L.length=0;
 	L.listsize=LIST_INIT_SIZE;
 	return OK;
 }
 
 //销毁线性表
 int DestoryList(Sqlist &L)
 {
 	if(L.elem)
 	delete[] L.elem;
 	L.length=0;
 	L.listsize=0;
 	return OK;
 } 
 
 //清空线性表 
 int ClearList(Sqlist &L)
 {
 	if(L.elem)
 	{
 		for(int i=0;i<L.length;i++)
 		{
 			L.elem[i]=0;
		}
 	L.length=0;
	 return OK; 
	}
 } 
 
 //判断线性表是否为空
 int ListEmpty(Sqlist L)
 {
 	if(L.elem)
 		return 0;
 	else
 		return 1;
}

//返回线性表中元素个数
int ListLength(Sqlist L)
{
	if(!L.elem)
		return ERROR;
	else
		return L.length;
}

//搜索第i个元素 
int Getelem(Sqlist L,int i,status &e)
{
	if(i<1||i>L.length)
		return ERROR;
	e=L.elem[i-1];
	return OK;
} 

//返回L中第一个与e相等的元素
int LocateElem(Sqlist L,status e)
{
	int i;
	for(i=0;i<L.length;i++)
	{
		if(e=L.elem[i])
		{
			cout<<"e在线性表中的第"<<i+1<<"位"<<endl;
			return OK;
		}
	}
	if(i==L.length)
	{
		cout<<"没有这个数据\n";
		return 0;
	}
} 

//往线性表插入元素
int ListInsert(Sqlist &L,int i,status e)
{
	if(i<1||i>(L.length+1))
	{
		cout<<"输入i错误"<<endl;
		return ERROR;
	}
	if(L.length>=L.listsize)
	{
		Elemtype *newbase=(Elemtype *)realloc(L.elem,(L.listsize+LIST_INCREMENT)*sizeof(Elemtype));
		if(!newbase)
			exit(OVERFLOW);
		L.elem=newbase;
		L.listsize+=LIST_INCREMENT;
	}
	Elemtype *q,*p;
	q=&(L.elem[i-1]); //q为插入位置  
	for(p=&(L.elem[L.length-1]);p>=q;p++)
	{
		*(p+1)=*p;
	}
	*q=e;
	++L.length;
	return OK;
 } 

//在线性表删除一个元素
int ListDelete(Sqlist &L,int i,status &e)
{
	if(i<1||i>L.length)
	{
		cout<<"输入错误"<<endl;
		exit(OVERFLOW); 
	}
	Elemtype *p,*q;
	p=L.elem+i-1;
	e=*p;
	q=L.elem+L.length-1;
	for(;p<=q;p++)
	{
		*p=*(p+1);	
	}
	--L.length;
	return OK;
} 

//反转线性表
int ListTraverse(Sqlist &L)
{
	Elemtype temp;
	Elemtype *low,*high;
	low=L.elem;
	high=L.elem+L.length-1;
	while(low!=high)
	{
		temp=*low;
		*low=*high;
		*high=temp;
		low++;high++;
	}
	return OK;
} 

//合并两个线性表
void MergeList(Sqlist La,Sqlist Lb,Sqlist &Lc)
{
	InitList(Lc);
	int a,b;
	a=0,b=0;
	int i,j,k;
	i=j=1;
	k=0;
	while(i<=La.length&&j<=Lb.length)
	{
		Getelem(La,i,a);
		Getelem(Lb,j,b);
		if(a<=b)
		{
			ListInsert(Lc,++k,a);
			++j;	
		}
		else
		{
			ListInsert(Lc,++k,b);
			++j;	
		}	
	}
	while(i<=La.length)
	{
		Getelem(La,i++,a);
		ListInsert(Lc,++k,a);	
	}
	while(j<=Lb.length)
	{
		Getelem(Lb,j++,b);
		ListInsert(Lc,++k,b);	
	}	
} 

//找出枢轴位置
int Partition(Elemtype *a,int low,int high)
{
	while(low<high)
	{
		while(low<high&&a[high]>=a[low])
		{
			high--;
		}
		Elemtype temp=a[low];
		a[low]=a[high];
		a[high]=temp;
		while(low<high&&a[low]<=a[high])
		{
			low++;
		}
		temp=a[low];
		a[low]=a[high];
		a[high]=temp;
	}
	return low;
 } 
 
 //快速排序实现
void QuickSort(Elemtype *a,int low,int high)
{
	if(low<high)
	{
		int pivotloc=Partition(a,low,high);
		QuickSort(a,low,pivotloc-1);
		QuickSort(a,pivotloc+1,high);
	}
}
  

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值