顺序表的结构及其操作
/**
* 作者:LinX 2017/6/2
* 内容:顺序表及其操作
*/
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100 //顺序表最大长度
typedef int ElemType;
typedef struct
{
ElemType data[MAX_SIZE-1];
int length;
}SqList;
/*以下是顺序表的基本操作*/
SqList* InitList(); //初始化一个线性表
int isEmpty(SqList *L); //判断是否为空表
int isFull(SqList *L); //判断表是否满了
void printList(SqList *L); //打印线性表
int getLength(SqList *L); //返回线性表当前的长度
ElemType getElem(SqList *L,int pos); //传入一个位置,返回位置上的元素
void InsList(SqList *L,int pos,ElemType e);//传入位置和元素,在指定位置后面插入元素
ElemType DelList(SqList *L,int pos); //删除指定位置的元素,并返回删除的元素
/*下面是顺序表的非基本操作*/
ElemType getMax(SqList *L); //得到表中最大值
ElemType getMin(SqList *L); //得到表中最小值
void reverse(SqList *L); //逆置表中所有元素
void merge(SqList *L1,SqList *L2,SqList *L3); //将表L1(升序)与L2(升序)按照升序合并至L3
void partition(SqList *L); //将表划分成左边小于第一个元素,右边大于第一个元素
int main()
{
SqList *L1=InitList();
SqList *L2=InitList();
SqList *L3=InitList();
int i,e;
for(i=0;i<5;i++)
{
scanf("%d",&e);
InsList(L1,i,e);
}
/*for(i=0;i<5;i++)
{
scanf("%d",&e);
InsList(L2,i,e);
}*/
partition(L1);
printList(L1);
return 0;
}
/*以表中第一个元素作为枢轴,左边都小于他 ,右边都大于他
*对划分的形象理解:划分就像排队,要求以一个标准,左边都
*矮于这个标准,右边都高于这个标准,此时有两个负责排队的
*人(i,j)处于队头,队尾,现在以第一个为标准,那么第一
*个人出队到temp中,从队尾开始检查,直到找到比标准矮的然
*调到第一个位置(这时这个矮的位置空了),接着从队头的下
*一个开始检查,比标准高的往刚才的空位置调,依次类推。
*/
void partition(SqList *L)
{
int temp,i=0,j=L->length-1;
temp=L->data[0];
while(i<j&&L->data[j]>=temp)
{
j--;
}
if(i<j)
{
L->data[i]=L->data[j];
i++;
}
while(i<j&&L->data[i]<=temp)
{
i++;
}
if(i<j)
{
L->data[j]=L->data[i];
j--;
}
L->data[j]=temp;
}
/*初始化顺序表*/
SqList* InitList()
{
SqList *L;
L=(SqList *)malloc(sizeof(SqList));
L->length=0;
return L;
//printf("%d",L->length);
}
/*判空*/
int isEmpty(SqList *L)
{
if(L->length==0)
{
return 1;
}
return 0;
}
/*判断表是否满了*/
int isFull(SqList *L)
{
if(L->length>=MAX_SIZE)
{
return 1;
}
return 0;
}
/*打印顺序表*/
void printList(SqList *L)
{
int i;
printf("\n");
//printf("%d\n",L->length);
for(i=0;i<=L->length-1;i++)
{
printf("%d ",L->data[i]);
}
}
/*得到顺序表的长度*/
int getLength(SqList *L)
{
return L->length;
}
ElemType getElem(SqList *L,int pos)
{
return L->data[pos];
}
/*插入顺序表*/
void InsList(SqList *L,int pos,ElemType e)
{
int i;
//printf("哈哈%d哈",L->length);
if(isFull(L)==1)
{
printf("表满\n");
return;
}
if(pos>L->length||pos<0)
{
printf("插入位置错误\n");
return;
}
for(i=L->length;i>=pos;i--)
{
L->data[i]=L->data[i-1];
}
L->data[pos]=e;
//printf("哈哈%d哈",L->length);
L->length++;
//printf("哈哈%d哈",L->length);
}
/*删除顺序表中的元素*/
ElemType DelList(SqList *L,int pos)
{
int i;
if(isEmpty(L)==1)
{
printf("表空\n");
return;
}
if(pos>L->length||pos<0)
{
printf("删除位置错误\n");
return;
}
for(i=pos;i<L->length-1;i++)
{
L->data[i]=L->data[i+1];
}
L->length--;
return L->data[pos];
}
/*得到表中最大元素*/
ElemType getMax(SqList *L)
{
int i=1;
ElemType max=L->data[0];
while(i<L->length)
{
if(max<L->data[i])
{
max=L->data[i];
}
i++;
}
return max;
}
/*得到表中最小元素*/
ElemType getMin(SqList *L)
{
int i=1;
ElemType min=L->data[0];
while(i<L->length)
{
if(min>L->data[i])
{
min=L->data[i];
}
i++;
}
return min;
}
/*逆置表的所有元素*/
void reverse(SqList *L)
{
ElemType temp;
int left=0,right=L->length-1,i,j;
for(i=left,j=right;i<j;i++,j--)
{
temp=L->data[i];
L->data[i]=L->data[j];
L->data[j]=temp;
}
}
/*按升序序列合并两个表*/
void merge(SqList *L1,SqList *L2,SqList *L3)
{
int len1=L1->length,len2=L2->length;
int i=0,j=0,k=0;
while(i<L1->length&&j<L2->length)
{
if(L1->data[i]>L2->data[j])
{
L3->data[k++]=L2->data[j++];
L3->length++;
}
else
{
L3->data[k++]=L1->data[i++];
L3->length++;
}
}
while(i<L1->length)
{
L3->data[k++]=L1->data[i++];
L3->length++;
}
while(j<L2->length)
{
L3->data[k++]=L2->data[j++];
L3->length++;
}
}
void print(int i)
{
printf("\n%d\n",i);
}