数据结构学习笔记————C++实现简单的顺序表(超详解)

头文件SeqList.h

#include <iostream>
# define DEFAULT_SIZE 30
using namespace std;

template<typename DataType>
class SeqList 
{
protected:
	int current_length;
	int max_length;
	DataType *p;
public:
	SeqList(int size);//创建一个空间为size大小的空表
	SeqList(const DataType data_[],int n ,int size=DEFAULT_SIZE);//创建一个空间为size大小的含有数据的表
	void Insert(const DataType data_, int pos);//增————向某个位置pos之前插入一个数据data_
	void Delete(int pos);//删————删除某个位置pos处的结点
	void Change(const DataType data_, int pos);//改————改动某个位置pos处的结点
	DataType Search1(int pos);//查————根据下标查数据
	int Search2(const DataType &e);//查————根据数据查下标
	void Clear();//清空
	int GetLength();//得到长度
	void PrintAll();//遍历链表输出各节点数值
	~SeqList();//析构————删除所有结点

};

template<typename DataType>
 SeqList<DataType>::SeqList(int size)//注意虽然为空 但是还是要申请一块最大长度的空间 
{
	 p = new DataType[size];
	 current_length = 0;
	 max_length = size;
}

 template<typename DataType>
 SeqList<DataType>::SeqList(const DataType data_[],int n ,int size)
 {
	 current_length = n;
	 max_length = size;
	 p = new DataType[size];
	 for (int i = 0; i < current_length;i++)
	 {
		 p[i] = data_[i]; 
	 }
 }

 template<typename DataType>
  void SeqList<DataType>::Insert(const DataType data_, int pos)
 {
	  //step1 :判断是否可以插入
	  if (current_length > max_length)
	  {
		  cout << "顺序表已满" << endl;
	  }
	  else if(pos<1||pos>max_length)
	  {
		  cout << "插入位置不对" << endl;
	  }
	  else
	  {
		  //step2:将pos位置后部分的元素后移一位
		  for (int j = current_length; j != pos; j--)
		  {
			  p[j] = p[j - 1];
		  }
		  //step3:将pos位置处的元素指定为data_
		  p[pos] = data_;
		  //step4:将顺序表长度加1
		  current_length++;
	  }
	  
 }

  template<typename DataType>
  void SeqList<DataType>::Delete(int pos)
  {
	  //step1 :判断是否可以插入
	  if (pos<1 || pos>current_length)
	  {
		  cout << "删除位置不对" << endl;
	  }
	  else
	  //step2:将pos位置后部分的元素前移一位
	  {
		  for (int j = pos; j != current_length; j++)
		  {
			  p[j-1] = p[j];
		  }
		  //step3:将顺序表长度减1
		  current_length--;
	  }

  }

  template<typename DataType>
  void SeqList<DataType>::Change(const DataType data_, int pos)
  {
	  //step1 :判断是否可以更改
	  if (pos<1 || pos>current_length)
	  {
		  cout << "更改位置不对" << endl;
	  }
	  else
	  {
		  p[pos - 1] = data_;
	  }
  }

  template<typename DataType>
  DataType SeqList<DataType>::Search1(int pos)
  {
	  //step1 :判断是否可以查询
	  if (pos<1 || pos>current_length)
	  {
		  cout << "查询位置不对" << endl;
		  return 0;
	  }
	  else
	  {
		  return p[pos - 1];
		  
	  }
	  
  }

  template<typename DataType>
   int SeqList<DataType>::Search2(const DataType & e)
  {
	   int i = 0;
	   while ((i < current_length - 1)&&(p[i]!=e))
	   {
		   i++;
	   }
	   retuen i + 1;
  }

   template<typename DataType>
   void SeqList<DataType>::Clear()
   {
	   current_length = 0;
	   
   }

   template<typename DataType>
   int SeqList<DataType>::GetLength()
   {
	   return current_length;
   }

   template<typename DataType>
    void SeqList<DataType>::PrintAll()
   {
		cout << "当前顺序表的数据有" << endl;
		for (int i = 0;i < current_length - 1; i++)
		{
			cout << p[i] << " ";
		}
   }

	template<typename DataType>
	 SeqList<DataType>::~SeqList()
	{
		 //注意current_length 和max_length不用清空
		 delete[] p;
		 cout << "析构函数已调用" << endl;

	}

测试源文件main.cpp

#include "SeqList.h"
#include<iostream>
#include"stdlib.h"
int main()
{
	int data[6] = { 2, 3, 4, 12,14,73 };
	SeqList<int> list(data, 6);//初始化
	list.PrintAll();
	cout << "线性表的长度为" << list.GetLength() << endl;//获取链表的长度
	list.Insert(62, 4);//增
	list.PrintAll();
	list.Delete(3);//删
	list.Change(35, 1);//改
	list.PrintAll();
	int data1 = list.Search1(3);
	cout << "链表中位置3处的数据为  " << data1;//查
	system("pause");
	return 0;
}

 

使用c++实现顺序表:多文件编程,层次清晰,函数有注释 SeqList();//构造函数,存储的元素个数设为0 bool setLength(size_t length);//设置已经存储的元素个数 bool addElement(ElemType element);//把某个元素添加到顺序表末尾 bool addElement(ElemType element , size_t n);//插入一个元素,使其成为第n个元素,其余元素后移 bool delElement();//删除所有的元素 bool delElement(size_t n);//删除第n个元素 bool delElement(string elementDetailType,string elementDetail);//通过某个元素细节找到元素,把这个元素删除 bool replaceElement(ElemType element , size_t n);//使用一个元素,替换掉第n个元素 bool swapElement(size_t n1 , size_t n2);//把第n1个元素和第n2个元素交换 ElemType* getElement();//得到数组头的指针 ElemType* getElement(size_t n);//得到第n个元素的指针 size_t getLength();//得到存储的元素个数 size_t getMaxSize();//得到顺序表容量 bool showElementDetail();//输出所有的元素细节 bool showElementDetail(size_t n);//输出第n个元素的细节 bool showElementDetail(string elementDetailType,string elementDetail);//通过某个元素细节找到元素,输出元素所有细节 size_t findElement(string elementDetailType,string elementDetail);//通过某个元素细节找到元素位置 static int inputAInt(int min = 0,int max = 9,int defaultValue = -1);//从键盘读取,限制为一个min到max间的整数,非法情况返回defaultValue void startControlLoop();//打开控制界面 ~SeqList();//析构函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值