順序表的結構及其操作
/**
* 作者: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);
}