C++数据结构之线性顺序表基本操作

线性表的顺序存储结构的优缺点:

优点:无须为表示表中元素之间的逻辑关系而增加额外的存储空间;可以快速地存取表中任一位置的元素O(1)

缺 点:插入和删除操作需要移动大量元素O(n);当线性表长度变化较大时,难以确定存储空间的容量;造成存储空间的“碎片 ”


#include <iostream>

using namespace std;

#define MAX_SIZE 20

typedef int ElemType;

typedef struct
{
 ElemType data[MAX_SIZE];
 int length;
}SqList;

/*初始化顺序表*/
bool SqListInit(SqList  &Sq)
{
 for (int i = 0; i < MAX_SIZE; i++)
 {
  Sq.data[i] = 0;
 }
 Sq.length = 0;
 return true;
}

/*判断表是否为空*/
bool isSqListEmpty(SqList Sq)
{
 if (Sq.length == 0)
  return true;
 return false;
}

/*清空表*/
void clearSqList(SqList  &Sq)
{
 for (int i = 0; i < Sq.length; i++)
 {
  Sq.data[i] = 0;
 }
 Sq.length = 0;
}

/*用ptr返回Sq中第pos个数据元素的值,注意pos是指位置,第一个位置的数组是从0开始的*/
bool getElement(SqList Sq, int pos, ElemType *ptr)
{
 if (Sq.length == 0 || pos < 1 || pos > Sq.length)
  return false;
 *ptr = Sq.data[pos - 1];
 return true;
}

/*返回Sq中第一个与Elem相等的数据元素的位序,若不存在则返回0*/
int Locate(SqList Sq, ElemType elem)
{
 for (int i = 0; i < Sq.length; i++)
 {
  if (Sq.data[i] == elem)
  {
   return i + 1;
  }
 }
 return 0;
}

/*在Sq中第pos个位置之前插入新的数据元素Elem,Sq的长度加1*/
bool SqListInsert(SqList &Sq, int pos, ElemType elem)
{
 if (Sq.length == MAX_SIZE)
  return false;
 if (pos < 1 || pos > Sq.length + 1)
  return false;
 for (int i = Sq.length - 1; i >= pos - 1; i--)
 {
  Sq.data[i + 1] = Sq.data[i];
 }
 Sq.data[pos - 1] = elem;
 Sq.length++;
 return true;
}

/*删除Sq的第pos个数据元素,并用delete返回其值,Sq的长度减1*/
bool SqListDelete(SqList  &Sq, int pos, ElemType* pe)
{
 if (Sq.length == 0)
  return false;
 if (pos < 1 || pos >  Sq.length + 1)
  return false;

 *pe = Sq.data[pos - 1];
 for (int i = pos - 1; i <= Sq.length - 1; i++)
 {
  Sq.data[i] = Sq.data[i + 1];
 }
 Sq.length--;
 return true;
}

/*返回顺序表的长度*/
int SqListLength(SqList Sq)
{
 return Sq.length;
}

/*将所有在线性表Pb但不在Pa中的元素都插入到Pa中*/
void MergeSqList(SqList &Pa, SqList &Pb)
{
 int pa_length = Pa.length;
 int pb_length = Pb.length;

 ElemType temp;
 for (int i = 0; i < pb_length; i++)
 {
  if (getElement(Pb, i + 1, &temp))
  {
   if (Locate(Pa, temp) == 0)
    SqListInsert(Pa, ++pa_length, temp); //将Pa中不存在的元素从Pb插入到Pa的表尾
  }
 }
}


int main(void)
{
 SqList Sq;
 SqListInit(Sq);
 for (int i = 0; i < 5; i++)
  SqListInsert(Sq, i, i);
 if (!isSqListEmpty(Sq))
 {
  cout << "Sq:" << endl;
  for (int i = 0; i < Sq.length; i++)
   cout << Sq.data[i] << " " ;
 }
 cout << endl;
 int pos = Locate(Sq, 2);
 int pe;
 SqListDelete(Sq, pos, &pe);
 cout << "Sq:" << endl;
 for (int i = 0; i < Sq.length; i++)
  cout << Sq.data[i] << " ";
 cout << endl;
 SqList Sqq;
 SqListInit(Sqq);
 for (int i = 0; i < 5; i++)
  SqListInsert(Sqq, i, i);
 if (Sqq.length != 0)
 {
  cout << "Sqq:" << endl;
  for (int i = 0; i < Sqq.length; i++)
   cout << Sqq.data[i] << " " ;
 }
 cout << endl;
 MergeSqList(Sq, Sqq);
 cout << "After Merge Sq:" << endl;
 for (int i = 0; i < Sq.length; i++)
  cout << Sq.data[i] << " ";
 cout << endl;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值