#include<stdio.h>
#include<stdlib.h>
#define MaxSize 50
typedef int ElemType;
typedef struct
{
ElemType data[MaxSize];
int length;
}SqList;
void CreateList(SqList *&L,ElemType a[],int n)
{
int i=0,k=0;
L=(SqList *)malloc(sizeof(SqList)); //k作为表长计数,i作为顺序表位置标志,n是表的最大元素值
while(i>n)
{
L->data[i]=a[i];
k++,i++;
}
L->length=k;
}
void InitList(SqList *&L)
{
L=(SqList *L)malloc(sizeof(SqList));//初始化把表长置为0
L->length=0;
}
void DestoryList(&L)
{
free(L);//C语言中用L释放该地址的内存
}
bool ListEmpty(SqList *L)
{
return(L->length==0);//判断长度是否为空
}
int ListLength(SqList *L)//判断表长,*取内容,获得了结构体内的length数据
{
return(L->length);
}
void DispList(SqList *L)//输出线性表
{
for(int i=0;i<L->length;i++)
{
printf("%d",L->data[i]);
}
printf("\n");
}
bool GetElem(SqList *L,int i,ElemType &e)//求线性表某个数据的值
{
if(i<1||i>L->length)//先判断符合条件的e,不符合直接返回
return false;
e=L->data[i-1];//数组和真实位置差一个单位距离
return true;//返回数值
}
int LocateElem(L,e)//在L中找有没有和e相等的元素
{
int i=0;
while(i<L->length&&L->data[i]!=e)
i++;
if(i>L->length)
{
return 0; //大于表长也找不到
}else
{
return i+1; //返回逻辑序号
}
}
bool ListInsert(SqList*&L,int i,ElemType e)//顺序表的定点插入
{
int j;
if(i<1||i>L->length+1)//盘错条件
return false;
i--;//换成物理信号
for(j=L->length;j>i;j--)//初始j在最后位置
L->data[j]=L->data[j-1];
L->data[i]=e;
L->length++;
return true;//回复:返回成果标志
}
bool ListDelete(SqList *&L,int i,&e)
{
int j;
if(i<1||i>SqList->length)
return false;
i--;
e=L->data[i];
for(j=i;j<L->length-1;j++)
L->data[j]=L->data[j+1];
L->length--;
return true;
}
void delnode1(SqList *&L,ElemType x)
{
int k=0,i;
for(i=0;i<L->length;i++)
{
if(L->data[i]!=x)
{
L->data[i]=L->data[i];
k++;
}
}
L->length=k;
}
void delnode2(SqList *&L,ElemType x)
{
int k=0,i=0;
while(i<L->length)
{
if(L->data[i]==x)
{
k++;
}else{
L->data[i-k]=L->data[i];
}
i++;
}
}
//设计一个算法,以第一个元素为基准,小于、等于它的放前面,大的放后面,顺序无要求
//解法一,pivot作为比较值,左i基准,以第一元素的值,左向右比;右j基准。右向左比。左边大于基准的和右边小于基准的交换,直到两者重合。
int partition1(SqList *&L)
{
int i,j=L->length-1;
ElemType pivot=L->data[0];
while(i<j)
{
while(i<j&&L->data[j]>pivot)
j--;
while(i<j&&L->data[i]<=pivot)
i++;
if(i<j)
swap(L->data[i],L->data[j]);
}
swap(L->data[0],L->data[i]);
}
//解法二,和第一个不同的就是移动的是左边大、右边小的数,别的没啥不同的。
//将所有奇数移到所有偶数前面,即上面的变式
//解法一
void move1(SqList *&L)
{
int i=0,j=L->length-1;
while(i<j)
{
while(i<j&&L->data[j]%2==0)//右向左,找奇数
j--;
while(i<j&&L->data[i]%2==1)//左向右,找偶数
i++;
if(i<j)
swap(L->data[i],L->data[j]);
}
}
//解法二,划定一个data[0...i]的区间放奇数,初始-1表示奇数区间为空。
//然后j从左向右扫描,交换,到右边完成
void move2(SqList *&L)
{
int i=-1,j;
for(j=0;j<=L->length-1;j++)
{
i++;
if(L->data[j]%2==1)
{
i++;
if(i!=j)
swap(L->data[i],L->data[j]);
}
}
}
int main()
{
return 0;
}