顺序表(易懂实用版)

开始学习数据结构时,还是很有必要自己手动撸一遍来实现各个功能的。


目录

顺序表

初始化

销毁

判断表空否 

遍历(打印)表

小测一下

 

没了,上代码!

int型元素为例。


 顺序表

//顺序表
typedef struct{
	ElemType *Elem;			//基地址 
	int length;		//当前长度(元素个数) 
}SqList;

初始化

//初始化
Status InitList(SqList *L){
	L->Elem=(ElemType*)malloc(MAXSIZE*sizeof(ElemType));
	if(!L->Elem){
	printf("初始化分配内存失败");
	return ERROR;
	}
	L->length=0;
	return OK;
}

销毁

//销毁
Status DestroyList(SqList *L){
	if(L->Elem){
	free(L->Elem);
	L->Elem=NULL;
	return OK;
	}
	else		printf("表已为空,无需销毁");
}

判断表空否 

//判断表是否空
Status ListEmpty(SqList *L)	
{
	if (L->length == 0)
		return OK;         
	else
		return ERROR;
}

//增
Status ListInsert(SqList *L, int i, ElemType e){			//第i(非数组下标)个位置上添加新元素e,其中1<=i<=L->length+1 
	int j;
	if((i<1) || (i>L->length+1)){
		printf("插入位置不符合实际情况");
		return ERROR;
	}
	if(L->length==MAXSIZE){
		printf("表已满,无法插入");
		return ERROR;
	}
	for(j=L->length-1;j>=i-1;j--)
		L->Elem[j+1]=L->Elem[j];		//i位置之后的元素依次往后移 
	L->Elem[i-1]=e;
	L->length++;
	return OK;
}

//删
Status ListDelete(SqList *L, int i, ElemType *e){		//与增同理,但i的限制为1<=i<=L->length,删除元素存入e 
	int j;
	if((i<1) || (i>L->length)){
		printf("删除位置不符合实际情况");
		return ERROR;
	}
	if(L->length == 0){
		printf("表已空,无法删除");
		return ERROR;
	}
	*e=L->Elem[i-1];		//赋值给e 
	for(j=i-1;j<=L->length-1;j++)
		L->Elem[j]=L->Elem[j+1];		//i位置之后的元素依次往前移
	L->length--;
	return OK;
}

//改 
Status AlterElem(SqList *L, int i, ElemType e){		//修改i位置上的元素 
	if((i<1) || (i>L->length)){
		printf("修改位置不符合实际情况");
		return ERROR;
	}
	L->Elem[i-1]=e;		//赋值给e 
	return OK;
}

//查 
Status LocateElem(SqList *L,  ElemType e){		//若找到就返回位于序号(第几个) 
	int i;
	for(i=0;i<L->length;i++){
		if(L->Elem[i]==e){
			return i+1;
		}
	}
	return ERROR;
}

遍历(打印)表

//打印出表中的元素的值 
void DisplayList(SqList *L){
	int i;
	for(i=0;i<L->length;i++){
		printf("%3d", L->Elem[i]);
	}
	putchar('\n');
}

小测一下

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
#define MAXSIZE	100
typedef int ElemType;
typedef int Status;
//顺序表
typedef struct{
	ElemType *Elem;			//基地址 
	int length;		//当前长度(元素个数) 
}SqList;


//初始化
Status InitList(SqList *L){
	L->Elem=(ElemType*)malloc(MAXSIZE*sizeof(ElemType));
	if(!L->Elem){
	printf("初始化分配内存失败");
	return ERROR;
	}
	L->length=0;
	return OK;
}

//销毁
Status DestroyList(SqList *L){
	if(L->Elem){
	free(L->Elem);
	L->Elem=NULL;
	return OK;
	}
	else		printf("表已为空,无需销毁");
}

//判断表是否空
Status ListEmpty(SqList *L)	
{
	if (L->length == 0)
		return OK;         
	else
		return ERROR;
}

//增
Status ListInsert(SqList *L, int i, ElemType e){			//第i(非数组下标)个位置上添加新元素e,其中1<=i<=L->length+1 
	int j;
	if((i<1) || (i>L->length+1)){
		printf("插入位置不符合实际情况");
		return ERROR;
	}
	if(L->length==MAXSIZE){
		printf("表已满,无法插入");
		return ERROR;
	}
	for(j=L->length-1;j>=i-1;j--)
		L->Elem[j+1]=L->Elem[j];		//i位置之后的元素依次往后移 
	L->Elem[i-1]=e;
	L->length++;
	return OK;
}

//删
Status ListDelete(SqList *L, int i, ElemType *e){		//与增同理,但i的限制为1<=i<=L->length,删除元素存入e 
	int j;
	if((i<1) || (i>L->length)){
		printf("删除位置不符合实际情况");
		return ERROR;
	}
	if(L->length == 0){
		printf("表已空,无法删除");
		return ERROR;
	}
	*e=L->Elem[i-1];		//赋值给e 
	for(j=i-1;j<=L->length-1;j++)
		L->Elem[j]=L->Elem[j+1];		//i位置之后的元素依次往前移
	L->length--;
	return OK;
}
//改 
Status AlterElem(SqList *L, int i, ElemType e){		//修改i位置上的元素 
	if((i<1) || (i>L->length)){
		printf("修改位置不符合实际情况");
		return ERROR;
	}
	L->Elem[i-1]=e;		//赋值给e 
	return OK;
}

//查 
Status LocateElem(SqList *L,  ElemType e){		//若找到就返回位于序号(第几个) 
	int i;
	for(i=0;i<L->length;i++){
		if(L->Elem[i]==e){
			return i+1;
		}
	}
	return ERROR;
}

//打印出表中的元素的值 
void DisplayList(SqList *L){
	int i;
	for(i=0;i<L->length;i++){
		printf("%3d", L->Elem[i]);
	}
	putchar('\n');
}


void main(){
	SqList L;
	InitList(&L);
	int i, n, loc;
	ElemType e;
	printf("输入要创建表的元素数量(1~100):\n");
	scanf("%d", &n);
	printf("依次输入元素的值:(回车键隔开)\n");
	for(i=1;i<=n;i++){
		scanf("%d", &e);
		ListInsert(&L, i, e);
	}
	printf("表中包含的元素:\n");
	DisplayList(&L);
	
	printf("输入要增加的元素位置和值:(空格隔开)\n");
	scanf("%d %d", &loc, &e);
	ListInsert(&L, loc, e);
	printf("表中包含的元素:\n");
	DisplayList(&L);
	
	printf("输入要删除的元素位置\n");
	scanf("%d", &loc);
	ListDelete(&L, loc, &e);
	printf("表中包含的元素:\n");
	DisplayList(&L);
	printf("此时被删除的元素为%d\n", e);
	
	printf("输入要修改的元素位置和值:(空格隔开)\n");
	scanf("%d %d", &loc, &e);
	AlterElem(&L, loc, e);
	printf("表中包含的元素:\n");
	DisplayList(&L);
	
	printf("输入要查找的元素的值\n");
	scanf("%d", &e);
	if(LocateElem(&L, e))	
		printf("是第%d个元素", LocateElem(&L, e));
}

结果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值