#include <stdlib.h>
#define maxsize 20000
typedef int element;
typedef struct
{
element *elem;
int length;
int listsize;
}SqList;
int initList(SqList * L)//结构初始化
{
L->elem = new element[maxsize];//(L->elem等价于L.elem)为顺序表分配大小为maxsize的数组空间
if(!L->elem) return -1;//此处也可以用exit(-1)结束程序
L->length = 0;
L->listsize = maxsize;
return 0;
}
void creat(SqList * L, int n)//填充数组
{
int i;
for(i=0; i<n; i++)
scanf("%d", &L->elem[i]);
L->length = n;
}
int Delete(SqList * L, int k)//删除
{
element *p, *q;
if(k<0||k>L->length-1)
return 0;
q=L->elem + L->length;//数组开始元素的位置加上数组的长度即为末位置
for(p=&(L->elem[k]); p<q; p++)//元素左移
*p=*(p+1);
L->length--;//表的长度减 1
return 1;
}
void locList(SqList * L)//查找
{
element *p, *q;
for(p=L->elem; p<L->elem + L->length; p++)
for(q=p+1; q<L->elem + L->length; q++)
{
if(*p==*q)
{
Delete(L, (q-L->elem));//q-L->elem为查找的重复元素的位序 k
//q->elem为数组开头元素的位置
q--;//向前移动保证始终指向末位置
}
}
}
void Buildlist(SqList * L, int n)//建表算法
{
L->length = 1;
element *p, *q;
for(q=L->elem+1; q<L->elem + n; q++)
{
int flag=1;
for(p=L->elem; p<L->elem + L->length; p++)
{
if(*p==*q)
{
flag=0;
break;
}
}
if(flag==1)
{
L->elem[L->length]=*q;
L->length++;
}
}
}
int purge(SqList &La, SqList &Lb, SqList &Lc) //归并
{
if(La.length+Lb.length>Lc.listsize)
return 0;
element *p, *q;
int i=0, j=0, k=0;
while(i<La.length&&j<Lb.length)
{
if(La.elem[i]<Lb.elem[j])
{
Lc.elem[Lc.length++]=La.elem[i];
i++;
}
else
{
Lc.elem[Lc.length++]=Lb.elem[j];
j++;
}
}
while(i<La.length)
{
Lc.elem[Lc.length++]=La.elem[i];
i++;
}
while(j<Lb.length)
{
Lc.elem[Lc.length++]=Lb.elem[j];
j++;
}
}
void Swap(SqList * L, int n, int m)
{
int t, i, j=0;
element *p, *q;
for(i=0; i<L->length/2; i++)//第一次交换
{
t=L->elem[i];
L->elem[i] = L->elem[n-i-1];
L->elem[n-i-1]=t;
}
for(i=0; i<(n-m)/2; i++)//第二次交换
{
t=L->elem[i];
L->elem[i] = L->elem[n-m-i-1];
L->elem[n-m-i-1]=t;
}
for(i=n-m; j<m/2; i++)//第三次交换
{
t=L->elem[i];
L->elem[i]=L->elem[2*n-m-i-1];
L->elem[2*n-m-i-1]=t;
j++;
}
}
int binsearch(SqList * L, int s, int t, int m)//二分查找
{
int low=s, high=t, mid;
if(s<=t)
{
mid=low+(high-low)/2;
if(L->elem[mid]==m)
{
printf("%d\n", mid+1);
return 0;
}
if(L->elem[mid]>m)
return binsearch(L, low, mid-1, m);
else
return binsearch(L, mid+1, high, m);
}
printf("No Found!\n");
}