顺序表编程考点
1、顺序表删除算法
//顺序表删除算法
typedef struct{
Elemtype *elem;
int length;
int listsize;
}Sqlist;
int ListDelete_sq(Sqlist *L,int i) //删除顺序表L中的第i个元素
{
int k;
if(i<1 || i>L->length) //删除位置出错
return 0;
for(k = i;k< L->length; k++) //从第i+1个位置开始,每个元素前移一个位置
L->slist[k] = L->slist[k+1];
--L->length; //表的长度减1
return 1; //返回成功
}
2、将两个非递减有序顺序表A和B合并成一个新的非递减有序顺序表
//将两个非递减有序顺序表A和B合并成一个新的非递减有序顺序表
typedef struct{
Elemtype *elem;
int length;
int listsize;
}Sqlist;
void merge(Sqlist A,Sqlist B,Sqlist &C)
{
int i=0,j=0,k=0; //A、B、C三个数组指针i、j、k
while(i<A.length && j<B.length) //退出循环的条件
{
if(A.elem[i]<=B.elem[j]) //如果A.elem[i]<=B.elem[j]
{
C.elem[k]=A.elem[i]; //将A.elem[i]接在数组C的k位置
i++; //数组A和数组C的数组指针加1
k++;
}
else //如果A.elem[i]>B.elem[j]
{
C.elem[k] = B.elem[j]; //将A.elem[j]接在数组C的k位置
j++; //数组B和数组C的数组指针加1
k++;
}
}
while(i<A.length) //数组A还有元素但是B中所有元素均在C中
{
C.elem[k] = A.elem[i]; //依次将数组A中剩余元素接在C表表尾
i++;
k++;
}
while(j<B.length) //数组B还有元素但是A中所有元素均在C中
{
C.elem[k] = B.elem[j]; //依次将数组A中剩余元素接在C表表尾
j++;
k++;
}
C.length = k; //将A、B数组全部接完,表C长为原A、C表长之和
}
3、顺序表元素递增有序,将x插入到顺序表以后,保持该表的有序性
//顺序表元素递增有序,将x插入到顺序表以后,保持该表的有序性
typedef struct{
Elemtype *elem;
int length;
int listsize;
}Sqlist;
void InserSqlist(Sqlist &va, int x)
{
int i;
if(va.length >Maxsize)
return;
for(i = va.length-1; va.elem[i]>x && i>=0;i--)
va.elem[i+1]=va.elem[i];
va.elem[i+1]=x;
va.length++;
}
4、试写一个算法,实现顺序表的就地逆置
//试写一个算法,实现顺序表的就地逆置
void reverse(int a[],int size)
{
int i, j, tmp;
for(i=0,j=size-1;i<j;i++,j--)
{
tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
}
5、将顺序表中正、负整数分开
//将顺序表中正、负整数分开
void part(int array[],int n)
{
int i,j;
i=1;
j=n;
while(i<j)
{
while(i<j && array[i]<0) //i指针从前往后扫描数组,遇到比0大的值停下
i++;
while(i<j && array[j]>=0) //j指针从前往后扫描数组,遇到比0小的值停下
j--;
if(i<j) //如果i<j,交换两个指针分别指向的元素
{
array[0]=array[i];
array[i]=array[j];
array[j]=array[0];
}
}
}
6、将数组中的数按照从大到小的顺序排序
//将数组中的数按照从大到小的顺序排序
void ReArrange( int A[], int B[], int n)
{
for(i=0; i<n; i++)
B[n-A[i]] = A[i];
}
7、折半查找查找数值为x的值
//折半查找查找数值为x的值
void SearchExchangeInsert(Elemtype a[],elemtype x)
{
low = 0; //low和high指向线性表下界和上界的下标
high = n-1;
while(low <= high)
{
mid = (low +high)/2; //找中间位置
if(a[mid] == x) //找到x,退出while循环
break;
else if(a[mid] < x)
low = mid +1; //到中点mid的右半去查
else high = mid - 1;//到中点mid的左半去查
}
if(a[mid]==x && mid != 0) //若最后一个元素与x相等,则不存在与其后继交换的操作
{
t=a[mid];
a[mid] = a[mid+1];
a[mid+1] = t;
} //数组x与其后继元素位置交换
if(low > high) //查找失败,插入数据元素x
{
for(i = n-1; i>high;i--)
a[i+1] = a[i]; //后移元素
a[i+1] = x; //插入x
}//结束插入
}//结束算法