顺序表的基本运算——入门


实验目的:

完成顺序表的基本运算:初始化、显示、求长度、判空、判满、插入、删除、按位置取元素、按值查找等,并编写主函数测试算法。

1.数据结构:用到顺序表数据结构

typedef struct{
	int *data;  //存储空间的首地址,用于定位顺序表的位置 
	int length;  //顺序表的长度 
}SqList;

2.算法描述:

初始化:让顺序表的长度为0;

显示:用for循环依次打印出data[i]的值;

求长度:通过每次的键盘输入,顺序表的长度就+1;

判空:如果顺序表的长度为0,则表示顺序表是空的;

判满:当顺序表的长度等于给定的最大长度时,顺序表是满的;

插入:在某个位置插入时,就将此位置及其以后的值都依次向后移动,从右往左开始移动,注意判断插入位置是否正确,顺序表是否已经占满;

删除:将要删除的位置的下一个位置的元素覆盖此元素,从左到右移动;

按位置取元素:按照指定位置,对应相应的下标,进行取值;

按值查找等:依次比较要查找的值是否与顺序表里面的某个值相等,如果有,返回对应的下标。

3.代码

#include <stdio.h>
#include<stdlib.h>
#define MAXSIZE 20    //定义用于存储顺序表的的数组的最大长度 
#define OVERFLOW 0    //溢出 
#define ERROR 0  //错误 
#define OK  1

typedef struct{
	int *data;  //存储空间的首地址,用于定位顺序表的位置 
	int length;  //顺序表的长度 
}SqList;

//初始化 
int Init_L(SqList &L){
	L.data=(int *)malloc(sizeof(int)*MAXSIZE);   //为顺序表分配内存地址
	if(!L.data){
		exit(OVERFLOW);   //内存分配失败,退出 
	} 
	L.length=0;
	return OK;
}

//将顺序表中填入值,直至敲击回车时结束输入 
void filled_L(SqList &L){
	int i=0;
	int gc;
	scanf("%d",&gc);
	while(gc!=-1){
		L.data[i]=gc;
		scanf("%d",&gc);
		L.length++;
		i++;
	} 
} 

//顺序表的长度
int Len_L(SqList L){
	return L.length;
}

//显示顺序表 
int Show_L(SqList L){
	for(int i=0;i<L.length;i++){
		printf("%d ",L.data[i]);
	}
	printf("\n");
}

//判空
int Empty_L(SqList L){
	if(L.length==0) printf("It's empty\n");
	else printf("It isn't empty\n");
} 

//判满
int Full_L(SqList L){
	if(L.length==MAXSIZE) printf("It's full\n");
	else printf("It isn't full\n");
} 

//指定位置插入元素 : 先移动,后插入 
int Insert_L(SqList &L,int x,int pos){
	int i=0;
	if(pos==MAXSIZE+2){  //如果表已满的话,就不能再插入 
		printf("Sorry,SqList is full\n");
	} 
	if(pos<1 || pos==MAXSIZE+1){  //检查插入位置的合理性,顺序表的两端的前后不能再插入值 
		printf("Postion is false\n");
	}
	for(i=L.length-1;i>=pos-1;i--){//从顺序表最后一个元素开始,依次向后移动一个单位,直至空出需要插入的位置,将元素插入 
		L.data[i+1]=L.data[i];
	}
	L.data[pos-1]=x;           //将元素插入 
	L.length++;  //插入一个元素后,顺序表的长度+1 
	return OK;
} 

//删除某指定元素:从删除的位置后面的元素依次向前覆盖 
void Delete(SqList &L,int Del_postion){
	for(int i=Del_postion-1;i<=L.length-1;i++){
		L.data[i]=L.data[i+1];
	}
	L.length--; 
}

//按位置取元素
int Take_L(SqList &L,int Take_postion){
	return L.data[Take_postion-1];  //因为下标从0开始,位置从1开始数数,所以差1 
}

//按值查找,遍历顺序表的元素,一一对比 
int Search_L(SqList L,int elem){
	for(int i=0;i<=L.length-1;i++){
		if(elem==L.data[i]) return i+1;  //因为位置与下标差 1 ,所以要给下标加 1 
	}
	return ERROR;  //没有找到对应的值,返回错误 
} 

int main(){
	SqList L;  //将SqList引用为L 
	int x,number,Ins_postion,Del_postion,Take_postion,Search_positon;
	printf("Init SqList..\n");
	Init_L(L);
	
	printf("Now please input elements for SqList,press'-1'to return\n");
	filled_L(L);
	
	int length=Len_L(L);
	printf("The length of SqList is %d\n",length);
	
	printf("The SqList is...\n");
	Show_L(L);
	
	Empty_L(L);
	
	Full_L(L);
		
	printf("Insert a number in postion,please input(number,position):");
	scanf("%d %d",&number,&Ins_postion);
	Insert_L(L,number,Ins_postion);
	printf("The SqList is...\n");
	Show_L(L);
	
	printf("Delete the number in one postion(position):");
	scanf("%d",&Del_postion);
	Delete(L,Del_postion);
	printf("The SqList is...\n");
	Show_L(L);
	
	int take=0; 
	printf("Input a postion to take a data(postion)\n");
	scanf("%d",&Take_postion);
	take=Take_L(L,Take_postion);
	printf("the data taken is %d\n",take);
	
	int elem=0;
	printf("Input a elem to search postion\n");
	scanf("%d",&elem);
	Search_positon=Search_L(L,elem);
	printf("The position is %d\n",Search_positon); 
	
	return 0;
	
} 

4.运行结果:

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值