基本思想:利用队列求解将使问题简单化,将数组的0-(k-1)存入队列,然后将数组k-(n-1)依次左移k位,然后顺序出列,具体算法如下:
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct
{
int data[MAXSIZE];
int front,rear;
}SeqQueue,*PSeqQueue;
PSeqQueue Init_SeqQueue()
{//创建一个队列
PSeqQueue Q;
Q=(PSeqQueue)malloc(sizeof(SeqQueue));
if(Q)
{
Q->front=0;
Q->rear=0;
}
return Q;
}
int Empty_SeqQueue(PSeqQueue Q)
{//
if(Q&&Q->front==Q->rear)
return 1;
else
return 0;
}
int In_SeqQueue(PSeqQueue Q,int x)
{//进队操作
if((Q->rear+1)%MAXSIZE==Q->front)
{
printf("队满!");
return 0;
}
else
{
Q->rear=(Q->rear+1)%MAXSIZE;
Q->data[Q->rear]=x;
return 1;
}
}
int Out_SeqQueue(PSeqQueue Q,int *x)
{//出队操作
if(Empty_SeqQueue(Q))
{
printf("队空!");
return 0;
}
else
{
Q->front=(Q->front+1)%MAXSIZE;
*x=Q->data[Q->front];
return 0;
}
}
int Front_SeqQueue(PSeqQueue Q,int *x)
{//取队头元素
if(Q->front==Q->rear)
{
printf("队空!");
return -1;
}
else
{
*x=Q->data[Q->front+1]%MAXSIZE;
return 1;
}
}
void Destroy_SeqQueue(PSeqQueue *Q)
{//销毁队列
if(*Q)
free(*Q);
*Q=NULL;
}
void Array_left_move(int a[],int n,int k)
{//左移k位
int i;
PSeqQueue Q;
Q=Init_SeqQueue();
for(i=0;i<k;i++)
In_SeqQueue(Q,a[i]);//0到k-1的元素入队列
for(i=k;i<n;i++)
a[i-k]=a[i];//k到n-1的元素左移k位
i=n-k;//i移动到n-k位
while(!Empty_SeqQueue(Q))
{
Out_SeqQueue(Q,&a[i]);//元素出队列,插入n-k到n-1的位置
++i;
}
}
int main()
{
int a[100],i,j;
int n,k;
printf("请输入要对多少个元素进行移动:");
scanf("%d",&n);
printf("请一次输入这%d个元素:",n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
printf("请问要左移多少位:");
scanf("%d",&j);
Array_left_move(a,n,j);
printf("移动后的数组为:");
for(i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}