题目要求:
设有长度为n(n>1)的顺序表R,将R中保存的序列循环左移P(0 < P < n)个位置,即将R中的数据由(x0,x1,…,xn-1)变换为(xp,xp+1,…,xn-1,x0,x1,…,xp-1)。如果p值不合法,输出“error!”。
输入:
第一行为数据元素个数n;
第二行为n个整数;
第三行为要左移的位数p
输出:
移动后的序列。
样例输入:
10
1 2 3 4 5 6 7 8 9 10
5
样例输出:
6 7 8 9 10 1 2 3 4 5
方法:
先将前P个数据存入一个顺序表L1中,再将后面的数据存入另一个顺序表L2中,最后先输出L2,再输出L1。
代码实现如下
#include<stdlib.h>
#define Max 50
typedef struct
{
int data[Max];
int len;
}SqList;
void InitList(SqList *&L) //初始化顺序表
{
L = (SqList *)malloc(sizeof(SqList));
L->len = 0;
}
void CreateList(SqList *&L)
{
int n,a;
scanf("%d",&n);
L = (SqList *)malloc(sizeof(SqList));
L->len = n;
for(int i = 0;i<L->len;i++)
{
scanf("%d",&a);
L->data[i] = a;
}
}
void DispList(SqList *L)
{
for(int i = 0;i<L->len;i++)
{
printf("%d ",L->data[i]);
}
}
int Len(SqList *L)
{
return(L->len);
}
int main()
{
int P,m,n,i = 0;
SqList *L,*L1,*L2;
InitList(L);
InitList(L1);
InitList(L2);
CreateList(L);
scanf("%d",&P); //输入要左移的位数
if(P>0&&P<L->len)
{
for(n = 0;n<P;n++) //将前P位存入L1中
{
L1->data[n] = L->data[n];
L1->len++;
}
for(m = P;m<L->len;m++) //将后面的数据存入L2中
{
L2->data[i] = L->data[m];
L2->len++;
i++;
}
DispList(L2); //输出顺序表
DispList(L1);
}
else
{
printf("error!");
}
}