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