数据结构之顺序表的实现

线性表的实现分顺序存储结构和链式存储结构。

顺序表属于线性表的一种,是用一组地址连续的存储单元依次来实现对元素的存储。

但是,顺序结构最大的缺点就是在进行插入和删除操作的时候,如果插入位置不理想,那么需要移动大量的元素。可以发现在顺序存储结构中,他们相邻的元素的存储位置也是相邻的,在申请内存的的时候,是一次性申请一块连续的内存,中间是没有空隙的,这样也就没办法进行快速的插入,如果进行删除操作,就需要进行位置的填充。

顺序结构最大的好处就是可以快速的存取表中的任一位置的元素。

#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define LISTINCREMENT 10
typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。
typedef int ElemType; //ElemType 为可定义的数据类型,此设为int类型
#define LIST_INIT_SIZE 100 //顺序表可能达到的最大长度

typedef struct 
{
	ElemType *elem;
	int length;
	int listsize;
}SqList;

//初始化
Status InitList(SqList &L)
{
	L.elem = (ElemType *) malloc(LIST_INIT_SIZE * sizeof(ElemType));
	if(! L.elem)
		exit(OVERFLOW);
	L.length = 0;
	L.listsize = LIST_INIT_SIZE;
	return OK;
}
//插入
Status insertElement(SqList &L , int i , ElemType e){

	if(1>i || i>L.length+1)
		return ERROR;

	if(L.length>= L.listsize){
		ElemType *newbase = (ElemType *)realloc(L.elem , (L.listsize + LISTINCREMENT)*sizeof(ElemType));
		if(!newbase)
			exit(OVERFLOW);
		L.elem = newbase;
		L.listsize += LISTINCREMENT;
	}

	ElemType *p = &(L.elem[i-1]);
	ElemType *q = &(L.elem[L.length-1]);
	for( ; q>=p ; q--){
		*(q+1) = *q ;
	}
	*p = e;
	L.length += 1;
	return OK;
}

//在顺序表L中删除第i个元素,并用e返回其值
Status deleteElement(SqList &L , int i , ElemType &e){
	if(1>i || L.length<i){
		return ERROR;
	}
	ElemType *p = &L.elem[i-1];
	e = *p;
	 
	ElemType *q = &L.elem[L.length-1];
	for( ; p<=q ; p++){
		*p = *(p+1);
	}
	L.length -= 1;
	return OK;
}
//在顺序表中查找元素
int locateElement(SqList &L , ElemType e){
	//ElemType *p = &(L.elem[0]);
	int i ;
	for(i = 0 ; i<L.length ; i++){
		if(L.elem[i]==e){
			return i;
		}
	}
	return ERROR;
}
//在顺序表中修改第i个元素的值
Status update(SqList &L , int i , ElemType e){
	if(1>i || L.length<i){
		return ERROR;
	}
	L.elem[i-1] = e;
	return OK;
}

int main()
{
	SqList L;

	int temp,a,b,c,e,choose;
	printf("1. 建立顺序表\n");
	printf("2. 输入数据\n");
	printf("3. 查找\n");
	printf("4. 插入\n");
	printf("5. 删除\n");
	printf("6. 输出数据\n");
	printf("0. 退出\n\n");
	choose=-1;
	while(choose!=0)
	{
	printf("请选择:");
	scanf("%d",&choose);
	switch(choose)
	{
	case 1:
		if(InitList(L)) //创建顺序表,并打印出成功或失败的信息
			printf("成功建立顺序表");
		else
			printf("建立顺序表失败");
		break;
	case 2: //输入10个数放入到顺序表中
	printf("请输入10个数字进去:");
	int i;
	for(i=0;i<10;i++)
	scanf("%d",&L.elem[i]);
	L.length=i;
	break;
	case 3: //顺序表的查找
	printf("请输入所要查找的数:");
	scanf("%d",&e);//输入e,代表所要查找的数值,如果成功显示要查找的数是第几个,如果是吧显示没有这样的数
	temp = locateElement(L,e);
	if(temp!=0)
	printf("查找成功\n");
	printf("对应的序号为:%d\n",temp-1);
	break;
	case 4: //顺序表的插入
	printf("请输入两个数,分别代表插入的位置和插入数值:");
	scanf("%d%d",&a,&b); //输入a和b,a代表插入的位置,b代表插入的数值
	if(insertElement(L,a,b))
		printf("插入成功");
	break;
	case 5: //顺序表的删除
	printf("请输入所要删除的数:");
	scanf("%d",&c); //输入c,代表要删除数的位置
	if(deleteElement(L,c,e))
	printf("删除成功");
	break;
	case 6: //顺序表的输出
		for(i=0;i<L.length;i++)
		printf("%d\n",L.elem[i]);
	break;
	}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/java_hzp/article/details/82595550