一、实验目的
1、掌握线性表的逻辑结构特征。
2、熟练掌握线性表的顺序存储结构的描述方法。
3、熟练掌握顺序表上各种基本操作的实现。
二、实验内容
1、设线性表的数据元素都为整数,存放在顺序表 S 中且递增有序。设计算法,将 x 插入到顺序表 S 的适当位置上,以保持线性表的有序性。
2、线性表使用顺序表作存储结构,设计算法,仅用一个辅助结点,实现将顺序表中的结点循环右移 k 位的运算。
3、设计算法,仅用一个辅助结点,实现将顺序存储的线性表中的数据元素
逆置。
三、实验指导
1、本实验所有题目中的向量可以用顺序表来描述,数据元素为整数。
2、提示
(1)题目 1 中的顺序表在建立时即是有序表,x 的值由用户输入,应该考虑3种情况
①小于原表中第一个元素的值;
②介于最小元素值和最大元素值之间;
③大于最大元素的值。
(2)对于题目 2,k 的值由用户输入,如顺序表中元素为 1,2,3,4,5,6,当 k 的值为 4 时,结果为 3,4,5,6,1,2。
实验代码(C语言)
#include<stdio.h>
#include<stdlib.h>
#define MAX 50
#define OK 1
#define OVERFLOW -1
#define ERROR -1
typedef struct{
int *elem;
int len;
}List;
//初始化
int InitList(List *L){
L->elem=((int*)malloc(MAX*sizeof(int)));
if(!L->elem)
exit(OVERFLOW);
L->len=0;
return OK;
}
//插入
int Insert(List *L,int n){
int i,j,k;
if(L->len==MAX){
return ERROR;
}
else{
for(i=0;i<L->len;i++){
if(n<=L->elem[i]){
k=i;
break;
}
else
k=L->len;
}
//printf("k=%d\n\n",k);
for(j=L->len-1;j>=k-1;j--){
L->elem[j+1]=L->elem[j];
}
L->elem[k]=n;
L->len+=1;
return OK;
}
}
//右移
void MoveList(List *L,int n){
int temp,i;
n=n%L->len;
while(n--){
temp=L->elem[L->len-1];
for(i=L->len-2;i>=0;i--){
L->elem[i+1]=L->elem[i];
}
L->elem[0]=temp;
}
}
//元素逆置
int SwapList(List *L){
int i,j,temp;
for(i=0,j=L->len-1;j>=i;i++,j--){
temp=L->elem[i];
L->elem[i]=L->elem[j];
L->elem[j]=temp;
}
return OK;
}
//遍历显示
void TraverList(List *L){
int i;
for(i=0;i<L->len;i++)
printf("%-5d",L->elem[i]);
printf("\n");
}
int main(){
List S;
int i,j,k,z;
InitList(&S);
//初始化
printf("请输入要添加元素的个数:\n\n");
scanf("%d",&S.len);
printf("请按递增顺序输入顺序表元素:\n\n");
for(i=0;i<S.len;i++){
scanf_s("%d",&S.elem[i]);
}
//遍历显示
printf("您输入的元素为:\n\n");
TraverList(&S);
//插入元素
printf("请输入将要插入的元素:\n\n");
scanf("%d",&j);
k=Insert(&S,j);
if(k==1){
printf("插入后的顺序表为:\n\n");
TraverList(&S);
}
else
printf("顺序表已满,插入失败!!\n\n");
//右移 k位
printf("请输入右移的位数:\n\n");
scanf("%d",&z);
MoveList(&S,z);
printf("右移后的顺序表为:\n\n");
TraverList(&S);
//元素逆置
printf("顺序表元素逆置后为:\n\n");
SwapList(&S);
TraverList(&S);
return;
}