顺序表逆置真题:
1.将一长度为n的数组的前端k(k<n)}个元素逆置后移动到数组后端,要求原数组中数据不丢失;
2.将一长度为n的数组的前端k(k<n)个元素保持原序移动到数组后端,要求原数组中数据不丢失;
3.将数组中的元素(Xo, X1, ... Xn-1),经过移动后变为:(Xp, Xp+1, ...Xn-1, Xo, X1, ..Xp-1) ,即循环左移p(0<p<n)个位置。
解题代码:
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10
//顺序表定义
typedef struct {
int data[MaxSize];//存放顺序表元素的数组
int length;//顺序表的长度
}Sqlist;
//初始化顺序表
void initSqlist(Sqlist &sqlist){
sqlist.length=0;
printf("初始化完成,初始单链表长度为%d\n",sqlist.length);
}
//插入操作
//实现将元素e插入到顺序表L的第i个位置
bool ListInsert(Sqlist &sq,int l,int e){
if(l<1||l>sq.length+1){
printf("插入位置不合法");
return false;
}
if(sq.length>=MaxSize){
printf("存储空间不足");
return false;
}
for (int i=sq.length;i>=l;i--){
sq.data[i]=sq.data[i-1];
}
sq.data[l-1]=e;
sq.length++;
printf("插入成功,插入数据为%d\n",e);
return true;
}
//逆置操作
//第一题
void Reverse(Sqlist &sq,int left,int right,int k) {
for(int i=left,j=right;i<left+k&&i<j;i++,j--){
int temp=sq.data[i];
sq.data[i]=sq.data[j];
sq.data[j]=temp;
}
}
//第二题
void moveToEnd(Sqlist &sq,int n,int k){
Reverse(sq,0,k-1,k);
Reverse(sq,0,n-1,k);
}
//第三题
void moveP(Sqlist &sq,int n,int p){
Reverse(sq,0,p-1,p);
Reverse(sq,p,n-1,n-p);
Reverse(sq,0,n-1,n);
}
//输出操作
void PrintList(Sqlist sq){
for(int i=0;i<sq.length;i++){
printf("%d ",sq.data[i]);
}
printf("\n");
}
int main(){
Sqlist list1;
initSqlist(list1);//初始化
ListInsert(list1,1,1); //插入操作
ListInsert(list1,2,2); //插入操作
ListInsert(list1,3,3); //插入操作
ListInsert(list1,4,4); //插入操作
ListInsert(list1,5,5); //插入操作
PrintList(list1); //输出表
// Reverse(list1,0,list1.length-1);//将全部元素逆置
// PrintList(list1); //输出表
// Reverse(list1,0,4,2);
moveToEnd(list1,5,2);
// moveP(list1,5,2);
PrintList(list1);
}
代码运行结果图:
链表逆置代码:
(逆置p位置的下一位置到q位置之间的元素 )
void Reverse(LinkList &l,int p,int q){
LNode *a=GetElem(l,p);
LNode *b=GetElem(l,q);
LNode *t=a->next;//先用t指针指向a的下一结点
while(a->next!=b){
a->next=t->next;//将a指向t的下一节点,相当于删除t
t->next=b->next;//将t的后继结点指向b的后继结点
b->next=t;//将t放到b后面
}
}
代码运行截图:
Reverse(l1,1,5);
即逆置2到5位置的元素
//逆置p位置的下一位置到q位置之间的元素
void Reverse(LinkList &l,int p,int q){
LNode *a=GetElem(l,p);
LNode *b=GetElem(l,q);
LNode *t;
while(a->next!=b){
t=a->next;
a->next=t->next;
t->next=b->next;
b->next=t;
}
}
代码运行截图: