线性表的顺序表示和实现
文章目录
- 线性表的顺序表示和实现
- 前言
- 一、具体操作
- 1、定义结构体
- 2、顺序表初始化
- 3、取值
- 4、查找
- 5、插入
- 6、删除
- 7、求长度
- 8、创建线性表
- 9、输出线性表
- 10、主函数
- 二、代码实现
- 三、运行结果
前言
线性表是一种相对灵活的数据结构,长度可以根据需要增加或缩短,即对线性表的数据元素不仅可以访问,而且可以进行插入和删除等。下面是对顺序表操作和实现的说明。
一、具体操作
1、定义结构体
代码如下:
typedef int Status;
typedef char ElemType;
//定义顺序表结构体类型
typedef struct
{
ElemType *elem;
int length;
}SqList;
2、顺序表初始化
代码如下:
//顺序表的初始化
Status InitList(SqList &L)
{
L.elem = new ElemType[MAXSIZE];
if(!L.elem) return OVERFLOW;
L.length = 0;
return OK;
}
3、取值
代码如下(示例):
//获取某一位置元素的值 GetElem(L,i)
Status GetElem(SqList L,int i)
{
if(i<1 ||i> L.length) return ERROR;
char e = L.elem[i-1];
cout<<"这个值为:"<<e<<endl;
return OK;
}
4、查找
//用元素值查找
int LocateElem(SqList L,ElemType e)
{
for(int i=0;i<L.length;i++)
if(L.elem[i]==e)
{
cout<<"这个顺序表中含有此元素\n"<<endl;
}
return 0;
}
5、插入
//插入数据元素
Status ListInsert(SqList &L,int i,ElemType e)
{
if((i<1)||(i>L.length+1)) return ERROR;
if(L.length==MAXSIZE) return ERROR;
for(int j=L.length-1;j>=i-1;j--)
L.elem[j+1]=L.elem[j];
L.elem[i-1]=e;
L.length++;
return OK;
}
6、删除
//删除数据元素
Status ListDelete(SqList &L,int i)
{
if((i<1)||(i>L.length+1)) return ERROR;
if(L.length==MAXSIZE) return ERROR;
for(int j=i;j<=L.length-1;j++)
L.elem[j-1]=L.elem[j];
L.length--;
return OK;
}
7、求长度
//求线性表的长度
int ListLength(SqList &L)
{
return(L.length);
}
8、创建线性表
//创建线性表
void CreateList(SqList &L)
{
cout<<"输入长度"<<endl;
int n;
cin>>n;
cout<<"依次输入元素值"<<endl;
for(int i=0;i<n;i++)
{
char e;
cin>>e;
L.elem[i]=e;
L.length=i+1;
}
}
9、输出线性表
void PrintList(SqList L)
{
for(int j=0;j<L.length;j++)
cout<<L.elem[j]<<" ";
cout<<endl;
}
10、主函数
int main()
{
//创建线性表
SqList L;
InitList(L);
cout<<"创建线性表L"<<endl;
CreateList(L);
cout<<"线性表L的元素为:";PrintList(L);
cout<<endl;
//查找
cout<<"输入查找的元素:"<<endl;
char e;
cin>>e;
LocateElem(L,e);
//取值
cout<<"输入想要取出元素的位置: "<<endl;
int i;
cin>>i;
GetElem(L,i);
//插入
ListInsert(L,4,'l');
ListInsert(L,5,'i');
ListInsert(L,6,'b');
cout<<"插入后的线性表为: ";PrintList(L);
cout<<endl;
//删除
ListDelete(L,L.length);
ListDelete(L,L.length);
cout<<"删除后的线性表为: ";PrintList(L);
cout<<endl;
}
二、代码实现
#include<iostream.h>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef char ElemType;
//定义线性表结构体类型
typedef struct
{
ElemType *elem;
int length;
}SqList;
//线性表的初始化
Status InitList(SqList &L)
{
L.elem = new ElemType[MAXSIZE];
if(!L.elem) return OVERFLOW;
L.length = 0;
return OK;
}
//获取某一位置元素的值 GetElem(L,i,e)
Status GetElem(SqList L,int i)
{
if(i<1 ||i> L.length) return ERROR;
char e = L.elem[i-1];
cout<<"这个值为:"<<e<<endl;
return OK;
}
//用元素值查找
int LocateElem(SqList L,ElemType e)
{
for(int i=0;i<L.length;i++)
if(L.elem[i]==e)
{
cout<<"这个顺序表中含有此元素\n"<<endl;
}
return 0;
}
//插入数据元素
Status ListInsert(SqList &L,int i,ElemType e)
{
if((i<1)||(i>L.length+1)) return ERROR;
if(L.length==MAXSIZE) return ERROR;
for(int j=L.length-1;j>=i-1;j--)
L.elem[j+1]=L.elem[j];
L.elem[i-1]=e;
L.length++;
return OK;
}
//删除数据元素
Status ListDelete(SqList &L,int i)
{
if((i<1)||(i>L.length+1)) return ERROR;
if(L.length==MAXSIZE) return ERROR;
for(int j=i;j<=L.length-1;j++)
L.elem[j-1]=L.elem[j];
L.length--;
return OK;
}
//求线性表的长度
int ListLength(SqList &L)
{
return(L.length);
}
//创建线性表
void CreateList(SqList &L)
{
cout<<"输入长度"<<endl;
int n;
cin>>n;
cout<<"依次输入元素值"<<endl;
for(int i=0;i<n;i++)
{
char e;
cin>>e;
L.elem[i]=e;
L.length=i+1;
}
}
//输出线性表
void PrintList(SqList L)
{
for(int j=0;j<L.length;j++)
cout<<L.elem[j]<<" ";
cout<<endl;
}
int main()
{
//创建线性表
SqList L;
InitList(L);
cout<<"创建线性表L"<<endl;
CreateList(L);
cout<<"线性表L的元素为:";PrintList(L);
cout<<endl;
//查找
cout<<"输入查找的元素:"<<endl;
char e;
cin>>e;
LocateElem(L,e);
//取值
cout<<"输入想要取出元素的位置: "<<endl;
int i;
cin>>i;
GetElem(L,i);
//插入
ListInsert(L,4,'l');
ListInsert(L,5,'i');
ListInsert(L,6,'b');
cout<<"插入后的线性表为: ";PrintList(L);
cout<<endl;
//删除
ListDelete(L,L.length);
ListDelete(L,L.length);
cout<<"删除后的线性表为: ";PrintList(L);
cout<<endl;
}