数据结构之顺序表基本操作

/**
  ------------------------------------------------
| 0无值  |1  |…………|length-1  |…………|MaxSize-1  |
  ------------------------------------------------
*/

#include <stdio.h>
#define MaxSize 100
#define NULL 0

typedef char Element;
typedef struct{
	int length;
	Element data[MaxSize];//_从data[0]到data[MaxSize-1]
}Sqlist;

int init(Sqlist& L)
{//初始化
	L.length=0;
	return 0;
}

int getLength(Sqlist L)
{//获取长度
	return L.length;
}

int createSqlist(Sqlist &L,Element e[],int n)
{//创建初始元素
	if(n<MaxSize)
	{
		for(int i=0;i<n;++i)
			L.data[i+1]=e[i];
		L.length=n;
	}
	return 0;
}

int insert(Sqlist& L,int p,char e)
{// 在位置p插入元素e
	if(p<1||p>L.length+1||L.length==MaxSize-1)
	{//这里,空出data[0],以方便位置操作,即让data[1]到data[length]为存储空间
		//当到达上界或者不在存储范围内
		return 0;
	}
	for(int i=L.length;i>=p;--i)
		L.data[i+1]=L.data[i];
	//从末尾元素开始,到原始p位置,向右移动,
	//1并非从p开始因为会对原始元素覆盖
	//2 并不会产生越界问题,因为条件限制了length+1始终要<MaxSize
	//3	没有createList时,当第一次插入,而主函数没有给L.data 赋值,L.length=0 <p
	L.data[i+1]=e;
	//4 原来的代码是L.data[i]执行最后一个的时候,,如p=1,length=1时(i=1;i>=1;--i;)i=0
	++(L.length);//插入元素之后,顺序表长度随之增加,但要始终保证length<MaxSize
	return 1;
}

int del(Sqlist &L,int p)
{//按位置删除
	Element e;
	if(p<1||p>L.length)
	{	
		return 0;
	}
	else
	{	
		e=L.data[p];
		//保护现场,别事后再赋值
		// 1  其实不要这句也可以,可万一以后这东西有用呢,
		//    要是再用本函数体内第一句声明的e要放在函数头的形参列表内

	/*	for(int i=L.length;i>=p;--i)
			L.data[i]=L.data[i+1];
		//这样,从p到length的都被L.data[length+1]覆盖掉,
		//而L.length+1并未对应元素,因而出现I烫烫烫烫烫
	*/
		for(int i=p;i<L.length;++i)
			L.data[i]=L.data[i+1];
		--(L.length);
	}
	return 1;
}

int displaySqlist(Sqlist L)
{//输出顺序表
	for(int i=1;i<L.length;++i)
		printf("%c",L.data[i]);
	printf("\n");
	return 0;
}

int locateElement(Sqlist L,Element e)
{//定位首次出现元素e的位置,若顺序表中未出现该元素,返回表尾的下一位置
	for(int i=1;i<L.length;++i)
	{
		if(e==L.data[i])
		{
			return i;
		}
	}
	return i;//循环完成时,i=L.length,是当前顺序表表尾元素右边的第一个位置
}

int main()
{
/*
解决3 的方法一
	Sqlist L;
	init(L);//形参为引用型时,实参前不用再加引用符号
	L.data[0]='d';
	L.length=sizeof(L.data[1])/sizeof(char);
	printf("%d",L.length);//1
	insert(L,1,'b');
	insert(L,2,'c');
	printf("%d",L.length);//3
	for(int i=1;i<L.length;i++)
		printf("%c",L.data[i]);//bc
*/
/*解决3的方法二*/
	Sqlist L;
	init(L);
	Element e[]={"Chinese"};

	createSqlist(L,e,sizeof(e));	
	displaySqlist(L);

	insert(L,1,'I');
	insert(L,2,'\'');
	insert(L,3,'m');
	insert(L,4,' ');
	insert(L,5,' ');
	insert(L,5,'a');
	displaySqlist(L);
	
	del(L,2);
	displaySqlist(L);

	int index;
	index=locateElement(L,'a');
	printf("%d\n",index);

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值