前言
新人属自动化专业的,最近一学期学了数据库基础和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;
}
运行结果
后记
今天的内容就是顺序表的基本操作及其内容,喜欢我的多多支持哦~