欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

顺序表的c语言实现

程序员文章站 2024-03-20 14:17:10
...

顺序表的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;
}