问题:现给出一组数据(如:0 1 2 3 4 5 6 7 8 9),令这组数据左移n位,并将左移的数填补在数据右侧。(如:左移三位,结果为3 4 5 6 7 8 9 0 1 2)。请写出对应的顺序喝链式解决方法。
顺序存储
顺序存储是指在内存中开辟连续的存储空间来存放数据,比较有代表性的就是数组以及ArrayList集合这种结构的存储方式都是使用的顺序存储来存储元素对象的;而ArrayList的底层也是通过数组来存储数据元素的,所以我们可以通过数组来观察顺序存储的优缺点。
优点:查询、遍历效率高
缺点:增删改效率低
链式存储
链式存储的存储空间不是连续的,它是通过指针来指向下一个元素或者上一个元素的地址来定位到该元素的,链式存储的由数据域(data域)与指针域(也叫做地址域,单向链表只有尾指针,双向链表有头指针和尾指针)两部分构成,通过指针指向下一元素,将所有的元素穿插起来,从而形成了一个链表。
优点:增删改效率高
缺点:查询、遍历效率低
顺序排序解法:
#include<stdio.h>
#define n 10
int main()
{
int a[n];
for(int i=0;i<n;i++)
{
a[i]=i;
printf("%d ",a[i]);
}
int m;
printf("\n左移位数:");
scanf("%d",&m);
int b[n];
for(int i=m,I=0;(i<n);i++,I++)
{
b[I]=a[i];
}
for(int i=0,I=n-m;i<m;i++,I++)
{
b[I]=a[i];
}
for(int i=0;i<n;i++)
{
a[i]=b[i];
printf("%d ",a[i]);
}
return 0;
}
链式排序解法:
#include "stdio.h"
#include "stdlib.h" //提供malloc()和free()
#include "string.h" //提供strcpy()等
struct Node
{
int a; //数据域
struct Node* next; //指针域(指向节点的指针)
};
struct Node* head= NULL;
struct Node* end = NULL;
void AddListTill(int a )
{
//创建一个节点
struct Node* temp=(struct Node*)malloc(sizeof(struct Node)); //此处注意强制类型转换
//节点数据进行赋值
temp->a=a;
temp->next=NULL;
//连接分两种情况1.一个节点都没有2.已经有节点了,添加到尾巴上
if(NULL==head)
{
head=temp;
// end=temp;
}
else
{
end->next=temp;
// end=temp; //尾结点应该始终指向最后一个
}
end=temp; //尾结点应该始终指向最后一个
}
int main()
{
int k;
printf("数据:");
while(scanf("%d",&k)!=0)
{
AddListTill(k);
}
getchar();
int m;
printf("左移位数:");
scanf("%d",&m);
struct Node *H=head;
int i=1;
while((NULL!=H))
{
if(i<=m)
{}
else
{
printf("%d ",H->a);
}
H = H->next;
i++;
}
struct Node *M=head;
i=1;
while((NULL!=M))
{
if(i<=m)
{
printf("%d ",M->a);
}
else
{
break;
}
M = M->next;
i++;
}
return 0;
}