c++实现顺序表的基本操作_c语言实现顺序表

c++实现顺序表的基本操作_c语言实现顺序表C++顺序表的实现// 顺序表.cpp: 定义控制台应用程序的入口点。//Author:kgvito YinZongYao//Date: 2017.12.27 #include<iostream>using namespace std; #define MAXSIZE 3#define Node ElemType#define ERROR 0typedef int…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

C++顺序表的实现

// 顺序表.cpp: 定义控制台应用程序的入口点。
//Author:kgvito YinZongYao
//Date: 2017.12.27
 
#include<iostream>
using namespace std;
 
#define MAXSIZE 3
#define Node ElemType
#define ERROR 0
typedef int DataType;
 
//创建一个节点类
class Node                 
{ 
   
public:
	DataType data;
};
 
//创建一个顺序表类
class SqList               
{ 
   
public:
	SqList();     //初始化顺序表
	~SqList();    //销毁顺序表
	void CreateSqList(int n);       //定义创建一个顺序表
	void TraverseSqList();          //遍历顺序表
	ElemType GetElemByIndex(int i); //根据下标查找顺序表中的元素
	bool isEmpty();                 //判断顺序表是否为空
	bool isFull();                  //判断顺序表是否满
	int GetLength();                //获取顺序表的长度
	int GetElemByElem(DataType data);    //查看顺序表中是否含有查找的值
	void InsertSqList(int n, DataType data);     //向顺序表中插入新数据
	void InsertSqListAtHead(DataType data);      //在头部插入新数据
	void InsertSqListAtEnd(DataType data);       //向顺序表的最后插入数据
	void DeleteElem(int i);              //删除指定位置的值
	void DeleteElemAtElem(DataType data);//按值删除元素
	void DeleteAll();                    //删除所有元素
	void DeleteAtHead();                 //在头部删除元素
private:
	Node * elem;                  //顺序表的基地址
	int length;                   //顺序表的长度
};
 
//初始化顺序表
SqList::SqList()                  
{ 
   
	elem = new ElemType[MAXSIZE];   //开辟空间
	if (!elem) { 
                       //当溢出时报异常
		exit(OVERFLOW);
	}
	length = 0;                     //定义顺序表的长度
}
 
//销毁顺序表
SqList::~SqList()                  
{ 
   
	delete[] elem;   //删除基地址的指针
}
 
//创建顺序表
void SqList::CreateSqList(int n)
{ 
   
	if (n < 0) { 
                                   //当输入的数值有误时报异常
		cout << "输入的节点个数有误!" << endl;
		exit(EXIT_FAILURE);
	}
	else { 
   
		int i;
		for (i = 0; i < n;i++) { 
                   //循环向数组中插入数据
			cout << "请输入第" << i + 1 << "个节点元素: ";
			cin>>elem[i].data;
		}
		length = n;                             //更改顺序表的长度
	}
}
 
//遍历顺序表
void SqList::TraverseSqList()
{ 
   
	for (int i = 0; i < length;i++) { 
              //循环打印顺序表的每个节点数据
		cout << "第" << i + 1 << "个元素的值是" << elem[i].data << endl;
	}
}
 
//通过下标获取元素
ElemType SqList::GetElemByIndex(int i)
{ 
   
	if (i < 1 || i > length) { 
          //下标输入有误时报异常
		cout << "查询的下标不存在" << endl;
	}
	else { 
   
		return elem[i - 1];          //返回下标指定的节点
	}
}
 
//判断顺序表是否为空
bool SqList::isEmpty()
{ 
   
	if (length == 0)    //如果顺序表的长度为0,则表为空
		return true;
	return false;       //长度不为0,表不为空
}
 
//判断顺序表是否满
bool SqList::isFull()
{ 
   
	if (length == MAXSIZE)   //当长度为定义的最大长度,则顺序表满
		return true;
	return false;            //否则不满
}
 
//获取顺序表的长度
int SqList::GetLength()
{ 
   
	return length;     //返回顺序表的长度
}
 
//判断是否存在寻找的值,如果存在将返回下标
int SqList::GetElemByElem(DataType data)
{ 
   
	int i;
	for (i = 0; i < length;i++) { 
       //从头遍历顺序表
		if (elem && elem[i].data == data) { 
     //若找到与之匹配的数据,则返回当前节点的下标
			return i + 1;
		}
		if (i == length - 1) { 
          //否则返回-1
			return -1;
		}
			
	}
}
 
//插入一个数据
void SqList::InsertSqList(int i, DataType data)
{ 
   
	if (i<1 || i > length+1) { 
         //下标输入有误时报异常
		cout << "输入的下标不合法" << endl;
	}
	else if (length > MAXSIZE) { 
      //当顺序表满时无法插入新的数据
		cout << "已经达到最大长度" << endl;
	}
	else
	{ 
   
		for (int j = length - 1; j >= i - 1; j--) { 
      //遍历到要插入的位置
			elem[j + 1] = elem[j];     //从j位置后的全体数据向后移一位
		}
		elem[i - 1].data = data;       //插入数据
		length++;                      //更改顺序表长度
	}
}
 
//在头部插入一个新数据
void SqList::InsertSqListAtHead(DataType data)
{ 
   
	
	for (int i = length - 1; i >= 0; i--)  //将全体元素向后移一位
	{ 
   
		elem[i + 1] = elem[i];
	}
	elem[0].data = data;         //在第一个位置插入元素
	length++;                    //更改长度
}
 
//在顺序表的最后插入数据
void SqList::InsertSqListAtEnd(DataType data)
{ 
   
	if (length > MAXSIZE) { 
      //当顺序表满时无法插入新的数据
		cout << "已经达到最大长度" << endl;
	}
	else
	{ 
   
		elem[length].data = data;      //插入数据
		length++;                      //更改顺序表长度
	}
}
 
//根据下标删除一个节点
void SqList::DeleteElem(int i)
{ 
   
	int j;
	if (i<1 || i>length)           //输入的位置不合法报异常
		cout << "输入的下标不合法" << endl;
	else                           
	{ 
   
		for (j = i; j <= length - 1;j++) { 
    //循环到要删除节点的位置
			elem[j - 1] = elem[j];         //该位置后的元素全体向前移一个位置
		}
		length--;                          //更改顺序表长度
	}
}
 
//按值删除元素
void SqList::DeleteElemAtElem(DataType data)
{ 
   
	int i = 0;
	while (elem[i].data != data && i < length)   //按值查到要删除数据的位置
	{ 
   
		i++;
	}
	for (int index = i; index <= length - 1; index++) //将该位置后的节点全体向前移一位
	{ 
   
		elem[index] = elem[index + 1];
	}
	length--;                              //更改顺序表长度
}
 
//删除所有元素
void SqList::DeleteAll()
{ 
   
	for (int i = length;i > 0;i--)    //从最后一个元素开始删除,长度减一
	{ 
   
		elem[i] = elem[i - 1];        //元素向前移位
		length--;                     //长度减一
	}
}
 
//在头部删除元素
void SqList::DeleteAtHead()
{ 
   
	for (int i = 1; i <= length - 1; i++) { 
   
		elem[i - 1] = elem[i];
	}
	length--;
}
 
//测试函数
int main()
{ 
   
	SqList l;
	int i;
	cout << "1.创建一个顺序表 2.遍历顺序表 3.通过下标获取元素\n4.查找要查询的元素的下标 5.通过下标插入元素 6.通过下标删除一个元素\n7.获取顺序表的长度 8.删除所有元素 9.判断顺序表是否为空\n10.判断顺序表是否满 11.根据数据删除节点 12.在头部插入数据\n13.在头部删除数据 14.在顺序表最后插入数据 0.退出" << endl;
	do
	{ 
   
		cout << "请选择一个操作: " ;
		cin >> i;
		switch (i)
		{ 
   
		case 1:
			int n;
			cout << "请输入顺序表的元素个数: ";
			cin >> n;
			l.CreateSqList(n);
			break;
		case 2:
			l.TraverseSqList();
			break;
		case 3:
			int i;
			cout << "请输入将要获取元素的下标: ";
			cin >> i;
			ElemType getElemByIndex = l.GetElemByIndex(i);
			cout << getElemByIndex.data << endl;
			break;
		case 4:
			DataType data;
			cout << "请输入将要查找元素的值: ";
			cin >> data;
			cout<<"该元素的下标为:"<<l.GetElemByElem(data)<<endl;
			break;
		case 5:
			int index;
			DataType insertData;
			cout << "请输入要插入的数据的位置: ";
			cin >> index;
			cout << "请输入要插入的数据: ";
			cin >> insertData;
			l.InsertSqList(index, insertData);
			break;
		case 6:
			int deleteIndex;
			cout << "请输入要删除的数据的下标: ";
			cin >> deleteIndex;
			l.DeleteElem(deleteIndex);
			break;
		case 7:
			cout<<l.GetLength()<<endl;
			break;
		case 8:
			l.DeleteAll();
			break;
		case 9:
			if (l.isEmpty() == 1) { 
   
				cout << "顺序表为空" << endl;
			}
			else
			{ 
   
				cout << "顺序表不为空" << endl;
			}
			break;
		case 10:
			if (l.isFull() == 1) { 
   
				cout << "顺序表满" << endl;
			}
			else
			{ 
   
				cout << "顺序表不满" << endl;
			}
			break;
		case 11:
			DataType data1;
			cout << "请输入要删除的数据: ";
			cin >> data1;
			l.DeleteElemAtElem(data1);
			break;
		case 12:
			DataType data2;
			cout << "请输入要在头部插入的数据: ";
			cin >> data2;
			l.InsertSqListAtHead(data2);
			break;
		case 13:
			l.DeleteAtHead();
			break;
		case 14:
			DataType data3;
			cout << "请输入要在末尾插入的数据: ";
			cin >> data3;
			l.InsertSqListAtEnd(data3);
			break;
		default:
			break;
		}
	} while(i != 0);
	system("pause");
    return 0;
}
 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/170891.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 要想成功先脱去幼稚

    要想成功先脱去幼稚记者问:“人要活得明白通透需要时间吗?”郭德纲答:“不需要时间,需要经历。一个人六十了,从小没挨过打,没人说过什么难听话。走大街上,别人瞪了一眼,咔,死了;一个人从小每天挨十个嘴巴,天天挨骂,长大了铁罗汉,抗压能力高。”经历过大风大浪真的可以帮助我们变得成熟稳重,那么问题来了,我们每天经历不了那么多的风浪,怎么办?这个时候,我认为应该先提高自己的思想。人不成熟的五大特征:人不成熟的第一…

  • MongoDb的ConnectionString链接字符串解析

    MongoDb的ConnectionString链接字符串解析MongoDb的ConnectionString链接字符串解析,如下图所示。

  • 产品经理面试内容_产品专员简历

    产品经理面试内容_产品专员简历前言经过深思熟路后,本渣决定参加放弃研发转投产品了。本科,硕士所学的东西也不能说可惜,这些都会帮助我在产品岗位更进一步。那么在研究与学习之下,我来研究一下产品经理的简历如何投能不当炮灰。(现在写好加深一下印象,也方便一下一年后写简历参加秋招的小周。)思路:PM的面试简历,就是一份产品产品用户:HR,业务主管简历被HR的阅读时间很短,15S左右,且较为粗略。所以就需要满足d…

    2022年10月28日
  • JavaScript语法学习(一文带你学会JavaScript)

    JavaScript语法学习(一文带你学会JavaScript)概述所有的代码必须写在<scripttype=“text/javascript”>当中。如果需要引用外部的js文件,格式为 <scripttype=“text/javascript”src=“XXXXX”></script>src为链接的外部地址 而此时所有的代码必须为外部文件,写在其中的代码无效。每一句js语句后面都要跟上分号为了语法规范,script标签应该写在head标签当中,且可以引入多个script标签表示不同功能块&lt;可以表示

  • 1024程序员节由来(1024程序员节宣言)

    曾经,在许多人的心中,程序员应该是这样的:画像格子衬衫不善言辞无女友电脑包常年加班但是呢,他们还有哪些不为人知的一面:1代码的好基友bug的大克星程序员的日常活动是什么呢?他们在食堂敲代码;他们在书店敲代码;他们在咖啡厅敲代码;他们甚至在斑马线上敲代码……他们的喜怒哀乐也很简单:一大串SQL语句,居然一下就成功时:(不敢相信)当代码没有正常执行,却不知道原因时…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号