C/C++数据结构——顺序表的实现

顺序表是线性表的顺序表示与实现,根据线性表抽象数据类型(ADT),完成顺序表的实现。

ADT List{

    数据对象:D={ai|ai∈ElemSet,i=1,2,…n,n≥0}

    数据关系:R={<ai-1,ai>| ai-1,ai ∈D,i=2,…,n}

    基本操作:

        InitList(&L):构造一个空的线性表L

        ……

        ListInsert(&L,I,e):在L中第i个位置之前插入新的数据元素e,L的长度+1

  1. 分文件实现,
    1. SqList.h 顺序表的定义
    2. SqList.cpp顺序表的实现
    3. main.cpp 主程序,完成演示

代码部分:

1、 SqList.h 顺序表的定义

/* SqList.h  定义顺序表 */ 

#define MAXSIZE 100  // 定义最大长度

typedef int ElemType; // 定义元素类型为整型

// 顺序表结构体定义
typedef struct {
    ElemType *elem; 
    int length; // 表当前长度
} SqList;


/* 说明顺序表基本操作函数 */
 
//初始化顺序表, 分配空间,顺序表长度置0
int InitSqList(SqList &L);

//判断顺序表是否满?
int IsFullSqList(SqList L);
//判断是否为空
int IsEmptySqList(SqList L);

//取值
int GetElemSqList(SqList L, int i, ElemType &e);
//插入元素
int InsertSqList(SqList &L, int i, ElemType e);

//删除元素, 删除第i个位置元素,e返回,成功返回0
int DeleteSqList(SqList &L, int i, ElemType *e);
//遍历
void TraverseSqList(SqList L);

2、 SqList.cpp顺序表的实现

/* SqList.cpp  顺序表实现 */ 

#include "SqList.h" 
#include <iostream>
using namespace std;


/* 对各个操作函数进行定义 */


// 1、初始化顺序表, 分配空间,顺序表长度置0
int InitSqList(SqList &L)
{
	// 动态分配内存空间给顺序表的元素数组
	L.elem = new ElemType[MAXSIZE]; 

	if(!L.elem)
	{
		cout<<"Error[10000], 内存分配失败!\n";
		return 10000; // 返回10000表示内存分配失败
	}
	
	L.length = 0; // 将顺序表的长度初始化为0
	
	return 0;  // 返回0表示初始化成功
}


// 2、 判断顺序表是否满?
int IsFullSqList(SqList L)
{
	// 顺序表长度大于等于数组长度,返回值1代表顺序表已满 
	if(L.length == MAXSIZE)
	{
		return 1; 
	}
	return 0; // 返回值0未满 
}


// 3、判断是否为空
int IsEmptySqList(SqList L)
{
	// 如果顺序表的长度等于0,则返回1表示为空;否则返回0表示非空
	return L.length == 0 ? 1 : 0;
}


// 4、取值
int GetElemSqList(SqList L, int i, ElemType &e)
{
	// 如果i小于1或大于L.length,则输出错误信息并返回错误码10004
	if(i<1 || i>L.length)
	{
		cout<<"Error[10004],i超出顺序表范围!"<<endl;
		return 10004;
	}
	e = L.elem[i-1]; // 将顺序表中第i个元素的值赋给变量e
	
	return 0;  // 成功返回值0
}


// 5、插入元素(insert)
int InsertSqList(SqList &L, int i, ElemType e)
{
	int index;

	// 首先判断顺序表是否满?满了返回值10001
	if(IsFullSqList(L))
	{
		cout<<"Error[10001], 顺序表已满!"<<endl;
		return 10001;
	}
	/* 继续操作
	判断位置i的合法性,i大于等于1,小于等于L.length+1
	如果位置i不合法,则输出错误信息并返回值10002 */ 
	if(i<1 || i>L.length+1)
	{
		cout<<"Error[10002], 位置i不合法,应i大于等于1,小于等于L.length+1"
			<<endl;
		return 10002;
	}
	// 继续
	// 将位置i后所有元素后移一位
	for(index = L.length;index >= i;index--)
	{
		L.elem[index] = L.elem[index-1]; // 后移
	}
	L.elem[index] = e; // 将新元素e插入到位置i处
	L.length++; // 顺序表长度加1

	return 0; // 成功insert
}


// 6、删除元素, 删除第i个位置元素,e返回,成功返回0
int DeleteSqList(SqList &L, int i, ElemType *e)
{
	int index;
	// 判断顺序表是否为空,空返回值10003 
	if(IsEmptySqList(L))
	{
		cout<<"Error[10003], 顺序表为空!"<<endl;
		return 10003;
	}

	// 判断位置i合法性,不合法返回值10004 
	if(i<1 || i>L.length)
	{
		cout<<"Error[10004],位置i超出范围!"<<endl;
		return 10004;
	}

	// 将位置i的元素赋值给指针变量e
	*e = L.elem[i-1];
	// 移动元素
	for(index = i-1;index<L.length;index++)
	{
		L.elem[index] = L.elem[index+1];
	}
	L.length--; // 顺序表长度减1
	return 0; // 成功 delete
}


// 7、遍历
void TraverseSqList(SqList L)
{
	int i;
	for(i=0;i<L.length;i++)
	{
		cout<<"L.elem["<<i+1<<"] = "<<L.elem[i]<<endl;
	}
}

3、main.cpp主程序,完成演示

#include "SqList.h" 
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
	int cmd,i;
	SqList L;
	ElemType e;

	do
	{
		cout<<"-----------顺序表演示程序---------\n";
		cout<<"  1. 初始化\n"
			<<"  2. 插入元素\n"
			<<"  3. 删除元素\n"
			<<"  4. 遍历顺序表\n"
			<<"  .....\n"
			<<"  0.退出\n"
			<<"请选择(0~13):";
		cin>>cmd;
		switch(cmd)
		{
		case 1:
			if(!InitSqList(L))
			{
				cout<<"顺序表已初始化..."<<endl;
			}
			else
			{
				cout<<"顺序表初始化失败,程序将退出!"<<endl;
				return 1;
			}
			break;
		
		case 2:
			cout<<"请分别输入插入元素的位置i,值e:";
			cin>>i>>e;
			if(!InsertSqList(L,i,e))
			{
				cout<<"元素e="<<e<<",已插入位置i="<<i<<endl;
			}
			break;
		case 3:
			cout<<"请输入删除元素的位置i:";
			cin>>i;
			if(!DeleteSqList(L,i,&e))
			{
				cout<<"位置i="<<i<<",元素e="<<e<<"已删除!"<<endl;
			}
			break;
		case 4:
            cout << "遍历顺序表:" << endl;
            TraverseSqList(L);
            break;
		}
	}while(cmd!=0);
	return 0;
}

运行结果:

1、初始化

 2、插入元素

3、删除元素

 

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kerwin.m

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值