动态顺序表的基本操作

#include<stdio.h>
#include<stdlib.h>
#define InitSize 10//默认的最大长度
typedef int Elemtype;
typedef int Status; 
typedef struct{
	int *data;   //动态分配的指针
	int MaxSize; //顺序表的最大程度。
	int length; //顺序表的元素个数 
}SqList;
//初始化动态链表
Status InitSqList(SqList &L)
{
	//用malloc申请一片连续的存储空间
	L.data = (int*)malloc(InitSize*sizeof(int));
	if(!L.data) 
	{
		return false;//存储分配失败 
	}
	L.length = 0;
	L.MaxSize= InitSize; 
	return 1; 
 } 
//增加动态数组的长度
Status IncreaseSize(SqList &L,int len)
{
	int *p = L.data;
	L.data = (int *)malloc((L.MaxSize+len)*sizeof(int));//申请L.MaxSize+len个连续的空间;
	if(!L.data) 
	{
		return false; //存储分配失败 
	}
	for(int i=0;i<L.length;i++)
	{
		L.data[i]=p[i];//将原始数据复制到新的区域。 
	} 
	L.MaxSize = L.MaxSize + len;//顺序表的长度发生改变
	free(p);//释放原空间; 
 } 
 //按值查找;
Status  GetElemSqList(SqList L,Elemtype e)
{
	for(int i=0;i<L.length;i++)
	{
		if(L.data[i] == e)
		{
			return i+1;
		}
	}
	return false;
}
//按位查找;
Status LocateElemSqList(SqList L,int i)
{
	if(i<1 || i>L.length)
	{
		return false;
	}
	else
	{
		return L.data[i-1];
	}
 } 
 //在顺序表中插入数据
 Status InsertSqList(SqList &L,int i,Elemtype e)//L如果发生变化加&,否则不加。 
 {
 	if(i<1 || i>L.length+1)
 	{
 		return false;
	}
	if(L.length >= L.MaxSize) //当前存储空间已满,增加分配。 
	{
		IncreaseSize(L,10);//申请空间。 
	}
	for(int j=L.length;j>=i;j--)
	{
		L.data[j] = L.data[j-1];
	} 
	L.data[i-1]=e;//插入数据 
	L.length++;
	return true;
  } 
  Status DeleteSqList(SqList &L,int i,Elemtype &e)
  {
  	if(i<1 || i>L.length)
  	{
  		return false;
	}
	e = L.data[i-1];//将该值取出; 
	for(int j=i;j<L.length;j++)
	{
		L.data[j-1]=L.data[j]; //将i-1及以后的数据往前挪一个位置 
	}
	L.length--;
	return true; 
  }
  //显示顺序表中的所有数据;
  void printSqList(SqList L)
  {
  	for(int i=0;i<L.length;i++)
	{
		printf("%d ",L.data[i]);
	} 
	printf("\n");
  } 
  //主函数
  int main()
  {
  	SqList L;//声明一个顺序表;
	InitSqList(L);//初始化动态顺序表 
	Elemtype e; 
	int n,m,i;
	int x;
	printf("请输入你输入数据的个数:");
	scanf("%d",&n);
	for(int i=1;i<=n;i++)//从i=1开始,将其为位序,从而直接插入。 
	{
		scanf("%d",&m);
		InsertSqList(L,i,m);
	} 
	printf("插入后的顺序表为:");
	printSqList(L);
	printf("输入你要删除的位序:");
	scanf("%d",&i);
	if(DeleteSqList(L,i,e))
	{
		printf("删除成功。");
		printf("删除后的顺序表为:");
		printSqList(L);
	} 
	else{
		printf("输入的位序不合法。");
	}
	//按值查找位序;
	printf("请输入查找的数字:");
	scanf("%d",&x); 
	if(GetElemSqList(L,x))
	{
		printf("该数字%d的位序为%d\n",x,GetElemSqList(L,x));
	}
	else
	{
		printf("不存在该数字。\n"); 
	}
	//按位查找;
	printf("请输入查找的位序:");
	scanf("%d",&i);
	if(LocateElemSqList(L,i)) 
	{
		printf("该位序%d的值为%d\n",i,LocateElemSqList(L,i));
	}
	else
	{
	 	printf("输入的位序不合法。\n");
	}
   } 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值