.cpp
#include"SqList.h"
#include<Stdio.h>
void main()
{
int i,k;ElemType e;
SqList L;
InitList(L);
InsElem(L,2,1);InsElem(L,3,2); //插入数据
InsElem(L,6,3);InsElem(L,4,4);
InsElem(L,5,5);InsElem(L,9,6);
InsElem(L,1,7);InsElem(L,7,8);
InsElem(L,8,9);InsElem(L,7,10);
InsElem(L,-6,11);InsElem(L,-8,12);
printf("初始线性表为:");DispList(L);
Swapmaxmin(L); //最大值和最小值交换位置
printf("最大值和最小值交换后的线性表为:");DispList(L);
i=1;k=2; //删除自第二个元素开始的k个元素
Deletek(L,i,k);
printf("删除自第%d个元素开始的%d个元素后的线性表为:",i,k);DispList(L);
Move(L); //奇数在前偶数在后进行交换
printf("奇数在前偶数在后交换后线性表为:");DispList(L);
e=7; //删除所有为e的元素
Deletex(L,e);
printf("删除所有元素为%d后的线性表为:",e);DispList(L);
Deleteminus(L); //删除所有为负整数的元素
printf("删除所有为负整数后的线性表为:");DispList(L);
DestroyList(L);
printf("-----------------------------------------------------------------------------------------------------\n");
SqList A;SqList B;SqList C;
InitList(A);
InsElem(A,1,1);InsElem(A,2,2); //向A表插入数据
InsElem(A,3,3);InsElem(A,4,4);
printf("A表元素:");DispList(A);
InitList(B);
InsElem(B,3,1);InsElem(B,5,2); //向B表插入数据
InsElem(B,7,3);
printf("B表元素:");DispList(B);
InitList(C); //归并后C表数据
Merge(A,B,C);
printf("C表元素:");DispList(C);
DestroyList(A);DestroyList(B);DestroyList(C); //销毁表A,B,C
printf("-----------------------------------------------------------------------------------------------------\n");
InitList(A);
InsElem(A,1,1);InsElem(A,2,2); //向A表插入数据
InsElem(A,3,3);InsElem(A,4,4);
printf("A表元素:");DispList(A);
InitList(B);
InsElem(B,3,1);InsElem(B,5,2); //向B表插入数据
InsElem(B,7,3);
printf("B表元素:");DispList(B);
InitList(C); //C表数据为A,B表中的公共数据
Commelem(A,B,C);
printf("C表元素:");DispList(C);
DestroyList(A);DestroyList(B);DestroyList(C); //销毁表A,B,C
printf("-----------------------------------------------------------------------------------------------------\n");
InitList(A);
InsElem(A,1,1);InsElem(A,2,2); //向A表插入数据
InsElem(A,3,3);InsElem(A,4,4);
printf("A表元素:");DispList(A);
InitList(B);
InsElem(B,4,1);InsElem(B,5,2); //向B表插入数据
InsElem(B,7,3);InsElem(B,9,4);
printf("B表元素:");DispList(B);
k=4;
Topk(A,B,k,e);
printf("第%d小的元素为:%d\n",k,e);
}
SqList.h
#include<stdio.h>
#include<math.h>
#define MaxSize 100 //存放最大空间
#define INF 32767 //最大元素值
typedef int ElemType; //int类型
typedef struct
{
ElemType data[MaxSize]; //存放数据表的元素
int length; //顺序表的实际长度
}SqList; //顺序表类型 重命名
void InitList(SqList &L) //初始化
{
L.length=0;
}
int InsElem(SqList &L,ElemType x,int i) //在元素i(即物理下标i-1)处插入元素
{
int j;
if(i<1||i>L.length+1)
return 0;
for(j=L.length;j>i;j--)
L.data[j]=L.data[j-1];
L.data[i-1]=x;
L.length++;
return 1;
}
void DispList(SqList L)//输出
{
int i;
for(i=0;i<L.length;i++)
printf("%d ",L.data[i]);
printf("\n");
}
void swap(ElemType &x,ElemType &y)//交换函数
{
ElemType tmp=x;
x=y;
y=tmp;
}
void Swapmaxmin(SqList &L)//最大值和最小值交换位置
{
int i,maxi,mini;
maxi=mini=0;
for(i=1;i<L.length;i++)
if(L.data[i]>L.data[maxi])
maxi=i;
else if(L.data[i]<L.data[mini])
mini=i;
swap(L.data[maxi],L.data[mini]);
}
int Deletek(SqList &L,int i,int k)//删除自第二个元素开始的k个元素
{
int j;
if(i<1||k<1||i+k-1>L.length)
return 0;
for(j=i+k-1;j<L.length;j++)
L.data[j-k]=L.data[j];
L.length-=k;
return 1;
}
void Move(SqList &L) //奇数在前偶数在后进行交换
{
int i=0,j=L.length-1;
while(i<j)
{
while(L.data[i]%2==1) i++;
while(L.data[j]%2==0) j--;
if(i<j)
swap(L.data[i],L.data[j]);
}
}
void Deletex(SqList &L,ElemType x)//删除所有为e的元素
{
int i,k=0;
for(i=0;i<L.length;i++)
{
if(L.data[i]!=x)
{
L.data[k]=L.data[i];
k++;
}
}
L.length=k;
}
void Deleteminus(SqList &L)//删除所有为负整数的元素
{
int i,k=0;
for(i=0;i<L.length;i++)
{
if(L.data[i]>=0)
{
L.data[k]=L.data[i];
k++;
}
}
L.length=k;
}
void DestroyList(SqList L)//销毁表
{}
void Merge(SqList A,SqList B,SqList &C)//二路归并算法,将两个递增有序的顺序表A,B归并到递增有序的顺序表C中
{
int i=0,j=0,k=0;
while(i<A.length&&j<B.length)
{
if(A.data[i]<B.data[j])
{
C.data[k]=A.data[i];
i++;k++;
}
else
{
C.data[k]=B.data[j];
j++;k++;
}
}
while(i<A.length)
{
C.data[k]=A.data[i];
i++;k++;
}
while(j<B.length)
{
C.data[k]=B.data[j];
j++;k++;
}
C.length=k;
}
void Commelem(SqList A,SqList B,SqList &C)//将A,B表中的公共数据复制到C表
{
int i=0,j=0,k=0;
while(i<A.length&&j<B.length)
{
if(A.data[i]<B.data[j])
i++;
else if(A.data[i]>B.data[j])
j++;
else
{
C.data[k]=A.data[i];
i++;j++;k++;
}
}
C.length=k;
}
int Topk(SqList A,SqList B,int k,ElemType &e)//求第k小的元素
{
int i=0,j=0;
if(k<1||k>A.length+B.length)
return 0;
while(true)
{
k--;
int x=(i<A.length?A.data[i]:INF);
int y=(j<B.length?B.data[j]:INF);
if(x<y)
{
if(k==0)
{
e=x;
return 1;
}
i++;
}
else
{
if(k==0)
{
e=y;
return 1;
}
j++;
}
}
}
|