数据结构之线性表的顺序存储结构 C语言版

前言

新人属自动化专业的,最近一学期学了数据库基础和UML,深感软件的重要性,也知道了数据结构的重要性,真后悔当初没有学好数据结构,这几天又打算重拾数据结构,去图书馆借来了程杰老师的《大话数据结构》这本书,再此要感谢程杰老师,发誓要将数据结构进行到底。本片文章将程杰老师书上的代码做了一些修改和总结,不再是那些零散的代码,而是把顺序表作为一个整体来操作

摘要

顺序表在C语言中可以用一维数组来表示,它的数据元素的类型必然相同。
数组的长度和顺序表的长度是有区分的,前者一般是事先设定好,不再变化的,而后者一般是变化的,在任意时刻,线性表的长度应该小于等于数组长度
顺序表表的优点是可以快速的读取表中任意元素,缺点是插入和删除需要移动大量元素,耗费时间,不是很方便

内容布局

这篇文章中用C语言实现了顺序表的操作,其中有:
1.初始化操作
2.添加元素操作(添加-1时,结束)
3.查找操作
4.插入操作
5.删除操作
6.置空表操作

代码

以下为顺序表操作的代码

//线性表的顺序表实现
#include <stdio.h>
#include <stdlib.h>

#define OK 1
#define ERROR 0

#define MAXSIZE 20/*存储空间分配初始量*/
typedef int Status;/*Status是函数的类型,其值是函数结果代码,如OK等*/
typedef int ElemType;/*ElemType类型视情况而定,这里假设为int*/

typedef struct
{
	ElemType data[MAXSIZE];/*数组,存储数据元素*/
	int length;/*线性表当前长度*/
}SqList;

Status InitList(SqList *L);//初始化顺序线性表
Status ListEmpty(SqList L);//初始条件:顺序表L已经存在,操作结果:L为空,返回OK,否则返回ERROR
Status ClearList(SqList *L);//初始条件:L已经存在,操作结果:将L置为空表
Status ListLength(SqList L);//初始条件:L已经存在,操作结果:返回数据个数
Status GetElem(SqList L,int i,ElemType *e);//获得元素操作
Status ListInsert(SqList *L,int i,ElemType e);//插入
Status ListDelete(SqList *L,int i,ElemType *e);//删除
Status ListDisplay(SqList L);//输出

int main()
{
	SqList L;
	ElemType e;
	Status i;
	int j=0,n=1,x=0;
	printf("*****顺序表的操作*****\n");
	InitList(&L);
	printf("初始化后顺序表的长度为:%d\n",L.length);
	while(n!=6)
	{
		printf("*1.添加*2.插入*3.查找*4.删除*5.置空*6.退出\n");
		scanf("%d",&n);
		switch(n)
		{
		case 1:
			printf("请输入数据\n");
			for(int i=1;x!=-1;i++)
			{
				scanf("%d",&x);
				ListInsert(&L,i,x);
			}
			printf("在L的表尾插入的数据为:\n");
			ListDisplay(L);
			break;
		case 2:
			printf("请选择在第几个元素前插入:\n");
			scanf("%d",&j);
			printf("请选择插入的数据:\n");
			scanf("%d",&x);
			i=ListInsert(&L,j,x);
			if(i==ERROR)
				printf("插入失败\n");
			else
				printf("插入成功\n");
			printf("操作之后的顺序表:\n");
			ListDisplay(L);
			break;
		case 3:
			printf("您想查找第几个元素:\n");
			scanf("%d",&x);
			i=GetElem(L,x,&e);
			if(i==ERROR)
				printf("查找失败\n");
			else
				printf("第%d个元素的值为:%d\n",x,e);
			break;
		case 4:
			printf("您想删除第几个元素:\n");
			scanf("%d",&x);
			i=ListDelete(&L,x,&e);
			if(i==ERROR)
				printf("插入失败\n");
			else
				printf("删除第%d个元素值为:%d\n",x,e);
			printf("操作之后的顺序表为:\n");
			ListDisplay(L);
			break;
		case 5:
			ClearList(&L);
			break;
		case 6:
			break;
		}
	}
	return 0;
}

Status InitList(SqList *L)//初始化顺序线性表
{
	L->length=0;
	return OK;
}

Status ListEmpty(SqList L)//初始条件:顺序表L已经存在,操作结果:L为空,返回TRUE,否则返回FALSE
{
	if(L.length==0)
		return OK;
	else
		return ERROR;
}

Status ClearList(SqList *L)//初始条件:L已经存在,操作结果:将L置为空表
{
	L->length=0;
	return OK;
}

Status ListLength(SqList L)//初始条件:L已经存在,操作结果:返回数据个数
{
	return L.length;
}

Status GetElem(SqList L,int i,ElemType *e)//获得元素操作,i为元素下标,e为i下标下的值
{
	if(L.length==0||i<1||i>L.length)
		return ERROR;
	*e=L.data[i-1];
	return OK;
}
/*	如果插入位置不合理,抛出异常
	从最后一个元素开始向前遍历到第i个位置,分别向后移动一位
	将要插入元素填入i处
	表长加一	
	在L中第i个位置前插入新的元素e,L的长度加1	*/
Status ListInsert(SqList *L,int i,ElemType e)//插入
{
	int k;
	if(L->length==MAXSIZE)
		return ERROR;
	if(i<1||i>L->length+1)
		return ERROR;
	if (i<=L->length)
	{
		for(k=L->length-1;k>=i-1;k--)
			L->data[k+1]=L->data[k];
	}
	if(e!=-1)//-1时停止插入
	{
		L->data[i-1]=e;
		L->length++;
	}
	return OK;
}

/*	如果删除位置不合理,抛出异常
	取出删除元素
	从删除元素位置开始遍历到最后一个元素位置,将他们前移一个位置
	表长减1
	操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1	*/
Status ListDelete(SqList *L,int i,ElemType *e) 
{
	int k;
	if(L->length==0||i<1||i>L->length)
		return ERROR;
	*e=L->data[i-1];
	if(i<L->length)
	{
		for(k=i;k<L->length;k++)
			L->data[k-1]=L->data[k];
	}
	L->length--;
	return OK;
}

/* 操作结果:依次对L的每个数据元素输出 */
Status ListDisplay(SqList L)
{
	int i;
	for(i=0;i<L.length;i++)
		printf("%d ",L.data[i]);
	printf("\n");
	return OK;
}

运行结果

顺序表的操作结果

后记

今天的内容就是顺序表的基本操作及其内容,喜欢我的多多支持哦~

发布了12 篇原创文章 · 获赞 10 · 访问量 1146

猜你喜欢

转载自blog.csdn.net/bsqetuo/article/details/94553721