顺序表逆置,链表逆置

顺序表逆置真题:

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;
	
	} 
	
} 

代码运行截图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值