C++顺序表14种操作的实现

简介: C++顺序表14种操作的实现

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;
}
相关文章
|
9月前
|
Linux 编译器 C++
C/C++性能优化:从根本上消除拷贝操作的浪费
C/C++性能优化:从根本上消除拷贝操作的浪费
1085 1
|
9月前
|
人工智能 机器人 C++
【C++/Python】Windows用Swig实现C++调用Python(史上最简单详细,80岁看了都会操作)
【C++/Python】Windows用Swig实现C++调用Python(史上最简单详细,80岁看了都会操作)
200 0
|
1月前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】
本文档介绍了线性表的基本运算任务,涵盖顺序表和链表的初始化、销毁、判定是否为空、求长度、输出、查找元素、插入和删除元素等内容。通过C++代码示例详细展示了每一步骤的具体实现方法,并提供了测试说明和通关代码。 主要内容包括: - **任务描述**:实现顺序表的基本运算。 - **相关知识**:介绍线性表的基本概念及操作,如初始化、销毁、判定是否为空表等。 - **具体操作**:详述顺序表和链表的初始化、求长度、输出、查找、插入和删除元素的方法,并附有代码示例。 - **测试说明**:提供测试输入和预期输出,确保代码正确性。 - **通关代码**:给出完整的C++代码实现,帮助完成任务。 文档
46 5
|
7月前
|
C++ 容器
C++中向量的操作vector
C++中向量的操作vector
|
8月前
|
算法 前端开发 Linux
【常用技巧】C++ STL容器操作:6种常用场景算法
STL在Linux C++中使用的非常普遍,掌握并合适的使用各种容器至关重要!
127 10
|
8月前
|
C++ iOS开发 开发者
C++一分钟之-文件输入输出(I/O)操作
【6月更文挑战第24天】C++的文件I/O涉及`ifstream`, `ofstream`和`fstream`类,用于读写操作。常见问题包括未检查文件打开状态、忘记关闭文件、写入模式覆盖文件及字符编码不匹配。避免这些问题的方法有:检查`is_open()`、显式关闭文件或使用RAII、选择适当打开模式(如追加`ios::app`)以及处理字符编码。示例代码展示了读文件和追加写入文件的实践。理解这些要点能帮助编写更健壮的代码。
99 2
|
8月前
|
C++
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
|
8月前
|
存储 算法 C++
【数据结构与算法】:带你手搓顺序表(C/C++篇)
【数据结构与算法】:带你手搓顺序表(C/C++篇)
|
9月前
|
C++
在C和C++中,指针的算术操作
在C和C++中,指针的算术操作
|
8月前
|
算法 C++ 容器
C++之vector容器操作(构造、赋值、扩容、插入、删除、交换、预留空间、遍历)
C++之vector容器操作(构造、赋值、扩容、插入、删除、交换、预留空间、遍历)
395 0