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
    评论
顺序表是一种常见的数据结构,它的基本操作有初始化、获取元素、插入元素、删除元素和查找元素。在C++中,可以使用数组来实现顺序表。 首先,我们需要定义一个顺序表的结构体,其中包含数组和长度变量。 ```cpp const int MAX_SIZE = 100; // 假设顺序表的最大容量为100 struct ArrayList { int data[MAX_SIZE]; // 用于存储元素的数组 int length; // 当前元素个数 }; ``` 接下来是初始化操作,该操作可以将顺序表的长度设置为0。 ```cpp void init(ArrayList& list) { list.length = 0; } ``` 然后是获取元素的操作,我们需要传入顺序表和待获取元素的索引,返回对应索引位置的元素。 ```cpp int get(ArrayList list, int index) { if (index < 0 || index >= list.length) { // 索引越界,返回一个非法值 return -1; } return list.data[index]; } ``` 插入元素的操作需要传入顺序表、待插入的元素和插入位置的索引。该操作会在指定位置插入元素,并将原来位置及之后的元素向后移动一位。 ```cpp void insert(ArrayList& list, int element, int index) { if (index < 0 || index > list.length || list.length >= MAX_SIZE) { // 索引越界或顺序表已满,插入失败 return; } // 后移元素 for (int i = list.length - 1; i >= index; i--) { list.data[i + 1] = list.data[i]; } // 在指定位置插入元素 list.data[index] = element; list.length++; } ``` 删除元素的操作需要传入顺序表和待删除元素的索引。该操作会将指定位置的元素删除,并将之后的元素向前移动一位。 ```cpp void remove(ArrayList& list, int index) { if (index < 0 || index >= list.length) { // 索引越界,删除失败 return; } // 前移元素 for (int i = index + 1; i < list.length; i++) { list.data[i - 1] = list.data[i]; } list.length--; } ``` 最后是查找元素的操作,该操作需要传入顺序表和待查找的元素值,返回元素在顺序表中的索引。 ```cpp int find(ArrayList list, int element) { for (int i = 0; i < list.length; i++) { if (list.data[i] == element) { return i; } } return -1; // 未找到元素 } ``` 这些基本操作的实现可以帮助我们对顺序表进行各种操作,包括初始化、获取元素、插入元素、删除元素和查找元素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Kerwin.m

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

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

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

打赏作者

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

抵扣说明:

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

余额充值