【数据结构】顺序表的c语言实现

顺序表的c语言实现

线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素,使得线性表在逻辑结构上相邻的元素存储在连续的物理存储单元中,即:通过数据元素物理存储的连续性来反应元素之间逻辑上的相邻关系。采用顺序存储结构存储的线性表通常简称为顺序表。

顺序储存线性表的特点

  1. 线性表的逻辑顺序与物理顺序一致;
  2. 数据元素之间的关系是以元素在计算机内“物理位置相邻”来体现。

下面我们逐个实现顺序表的基本操作

定义顺序表结构体

typedef struct
{
	elemtype data[MAXSIZE];			//用数组储存顺序表中的元素
	int length;						//顺序表的长度  元素的个数
}SqList;

初始化顺序表操作

void InitList(SqList *L)			//初始化顺序表L
{
	L->length = 0;
}

只需将顺序表的长度置为0即可

计算顺序表的长度

int ListLength(SqList *L)			//返回顺序表的元素个数
{
	if (NULL == L)
		return 0;
	return L->length;
}

获取顺序表中元素

int GetElem(SqList L, int i,elemtype *e)			//获得i位置的元素,用e返回
{
	if (L.length == 0 || i < 1 || i > L.length)
	{
		printf("输入有误,查询不到该位置的元素!\n");
		return 0;
	}
	*e = L.data[i - 1];
	return 0;
}

新元素插入顺序表

int ListInsert(SqList *L, int i, elemtype e)					//在i位置插入一个元素e
{
	int k;
	if (L->length == MAXSIZE)
	{
		printf("顺序表已满,不能再继续插入元素!\n");
		return 0;
	}
	if (i < 1 || i > L->length + 1)
	{
		printf("插入位置不对,请重新输入!\n");
		return 0;
	}

	for (k = L->length - 1; k >= i - 1; k--)		//将要插入元素后的每个元素都向后移一位
		L->data[k + 1] = L->data[k];
	L->data[i - 1] = e;					//将新元素插入
	L->length++;
	return 1;
}

删除某位置的元素

int ListDelete(SqList *L, int i, elemtype *e)			//删除i位置的元素,并用e返回其值
{
	int k;
	if (L->length == 0)
		return 0;
	if (i < 1 || i > L->length)
	{
		printf("输入有误,请重新输入!\n");
		return 0;
	}
	*e = L->data[i - 1];
	for (k = i; k < L->length; k++)				//将删除元素后的每个元素前移一位
		L->data[k - 1] = L->data[k];
	L->length--;
	return 0;
}

查询某元素的位置

int LocateElem(SqList L, elemtype e)				//查询元素e,如查到返回该元素的位置,反之,返回0
{
	int k;
	for (k = 0; k < L.length; k++)
	{
		if (L.data[k] == e)
		{
			printf("已查到%d,%d的位置为:", e, e);
			return k + 1;
		}
	}
	return 0;
}

打印整个顺序表值

int ShowList(SqList L)						//打印顺序表
{
	int i;
	if (L.length == 0)
	{
		printf("顺序表为空!");
		return 0;
	}
	for (i = 0; i < L.length; i++)
	{
		printf("第%d个元素为%d \n", i + 1, L.data[i]);
	}
	return 1;
}

顺序表的整体源码

到此,顺序表的基本操作就已经完成了,下面附上源码

源码:

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define MAXSIZE 100					//顺序表的最大长度
typedef int elemtype;				//元素类型
typedef struct
{
	elemtype data[MAXSIZE];			//用数组储存顺序表中的元素
	int length;						//顺序表的长度  元素的个数
}SqList;

void InitList(SqList *L)			//初始化顺序表L
{
	L->length = 0;
}

int ListLength(SqList *L)			//返回顺序表的元素个数
{
	if (NULL == L)
		return 0;
	return L->length;
}

int GetElem(SqList L, int i,elemtype *e)			//获得i位置的元素,用e返回
{
	if (L.length == 0 || i < 1 || i > L.length)
	{
		printf("输入有误,查询不到该位置的元素!\n");
		return 0;
	}
	*e = L.data[i - 1];
	return 0;
}

int ListInsert(SqList *L, int i, elemtype e)					//在i位置插入一个元素e
{
	int k;
	if (L->length == MAXSIZE)
	{
		printf("顺序表已满,不能再继续插入元素!\n");
		return 0;
	}
	if (i < 1 || i > L->length + 1)
	{
		printf("插入位置不对,请重新输入!\n");
		return 0;
	}

	for (k = L->length - 1; k >= i - 1; k--)		//将要插入元素后的每个元素都向后移一位
		L->data[k + 1] = L->data[k];
	L->data[i - 1] = e;					//将新元素插入
	L->length++;
	return 1;
}

int ListDelete(SqList *L, int i, elemtype *e)			//删除i位置的元素,并用e返回其值
{
	int k;
	if (L->length == 0)
		return 0;
	if (i < 1 || i > L->length)
	{
		printf("输入有误,请重新输入!\n");
		return 0;
	}
	*e = L->data[i - 1];
	for (k = i; k < L->length; k++)				//将删除元素后的每个元素前移一位
		L->data[k - 1] = L->data[k];
	L->length--;
	return 0;
}

int LocateElem(SqList L, elemtype e)				//查询元素e,如查到返回该元素的位置,反之,返回0
{
	int k;
	for (k = 0; k < L.length; k++)
	{
		if (L.data[k] == e)
		{
			printf("已查到%d,%d的位置为:", e, e);
			return k + 1;
		}
	}
	return 0;
}

int ShowList(SqList L)						//打印顺序表
{
	int i;
	if (L.length == 0)
	{
		printf("顺序表为空!");
		return 0;
	}
	for (i = 0; i < L.length; i++)
	{
		printf("第%d个元素为%d \n", i + 1, L.data[i]);
	}
	return 1;
}

int main()
{
	elemtype e;
	SqList list1;
	InitList(&list1);
	list1.data[0] = 1;
	list1.data[1] = 2;
	list1.data[2] = 3;
	list1.data[3] = 13;
	list1.data[4] = 23;
	list1.data[5] = 54;
	list1.length = 6;
	printf("%d\n", LocateElem(list1, 23));
	ShowList(list1);
	printf("表长为%d\n", ListLength(&list1));
	ListInsert(&list1, 7, 43);
	printf("插入元素后的顺序表为:\n");
	ShowList(list1);
	printf("表长为%d\n", ListLength(&list1));
	ListDelete(&list1, 4, &e);
	printf("要删除的元素为%d\n", e);
	printf("删除元素后的顺序表为:\n");
	ShowList(list1);
	printf("表长为%d\n", ListLength(&list1));
	GetElem(list1, 4, &e);
	printf("查询位置的元素为%d\n", e);
	system("pause");
	return 0;
}
  • 30
    点赞
  • 151
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值