数据结构第一次上机 顺序表表 前插 后插多个元素 查找 删除(考虑多个元素)

在这里插入图片描述单链表实现见笔者另一篇博客
欢迎读者批评指正

类定义和函数声明
切记 在模板类中 函数定义放在类的头文件之后 ,否则会出现链接器错误 LINK2019


```csharp
#ifndef SEQLIST_H
#define SEQLIST_H
#include<iostream>
#include"LinearList.h"
#include <stdlib.h>
#include<string>
using namespace std;

template<class T>
class SeqList:public LinearList<T> 
{
protected:
	T * data;		     	//存放数组
	int maxSize;	        //最大可容纳表项的项数
	int last;	    		//当前已存表项的最后位置(从0开始),last=n-1

public:
	SeqList<T>(int sz);          	//构造函数
	SeqList<T>(SeqList<T>& L);//复制构造函数
	~SeqList()
	{
		/*delete[] data; */
	}          
	//析构函数

	int Size() const 
	{
		return maxSize;
	}	 	//求表最大容量

	int Length() const
	{
		return last + 1;
	}        	//计算表长度

	void reSize(int maxSize);//改变数组空间大小

	void insert(string insertdata);		//插入x在最后一个表项之后

	void Insert(T x);//在值为x的表项后插入(多个元素仅考虑第一个)

	void Binsert(T x);//在特定元素前插入元素,考虑相同元素有多个

	void remove(int i);	//删除下标为i的表项

	void Remove(T x);//删除值为x的元素,考虑多个元素

	int getData(int i) const;//显示下标为i的元素的值,用x存储

	void printData();//打印所有元素的值

	void print_reverse();//逆序输出所有元素

	void Clear();//清空单链表
};

template <class T>//构造函数
SeqList<T>::SeqList(int sz)
{
	if (sz > 0)
	{
		maxSize = sz;  last = -1;
		data = new T[maxSize];	   //创建顺序表存储数组
		if (data == NULL)	   //动态分配失败
		{
			cout << "存储分配错误!" << endl;
			exit(1);
		}
	}
}

//复制构造函数
template <class T>
SeqList<T>::SeqList(SeqList<T>& L)
{
	maxSize = L.Size();
	last = L.Length() - 1;
	T value;
	data = new T[maxSize];	//创建存储数组
	if (data == NULL)		//动态分配失败
	{
		cout << "存储分配错误!" << endl;
		exit(1);
	}
	for (int i = 0; i <= last; i++)//传送各个表项
	{
		data[i] = L.locate(i);
	}
}


template <class T>
void SeqList<T>::reSize(int maxSize)
{
	T *test = new T[maxSize];
	//创建一个过渡的数组test 
	for (int i = 0; i < maxSize; i++)
	{
		test[i] = data[i];
	}
	//用test存储data所有元素的值
	delete[] data;
	//释放原来的data,防止内存泄漏

	T *data = new T[2 * maxSize];//扩充data数组的大小
	maxSize *= 2;

	for (int i = 0; i < maxSize; i++)
	{
		data[i] = test[i];
	}//还原data内的数据元素
	delete[] test;//释放过渡的test,防止内存泄漏
}


template <class T>
int SeqList<T>::getData(int i) const
{
	return data[i];
}


template <class T>
//打印所有元素的值
void SeqList<T>::printData()
{
	for (int i = 0; i < last+1; i++)
	{
		cout << data[i] << "   ";
	}
}



//逆序输出
template <class T>
void SeqList<T>::print_reverse()
{
	for(int i = last; i >= 0; i--)
		cout << data[i] << " ";
}


template <class T>
//清空链表
void SeqList<T>::Clear()
{
	for (int i = 0; i <= last; i++)
	{ 
	remove(0);//调用函数,永远执行删除第一个元素
			  //上面函数只能删除剩下两个数
	remove(1);//上面 永远执行删除第一个元素
	
	}
}


//最后一个元素后插入  将新元素x插入到最后一个表项之后
template <class T>
void SeqList<T>::insert(string insertdata) 
{
	//将新元素x插入到最后一个表项之后
	if (last == maxSize - 1) //表满
	{
		SeqList<T>::reSize(maxSize);
		maxSize *= 2;
		int position = maxSize / 2;//表示新插入元素的下标
		data[position] = stoi(insertdata);//插入在最后一个元素后
		last++;
	}

	else//表未满
	{
		data[++last] = stoi(insertdata);
	           //插入成功
	}
}


//后插  将新元素插入到值为x的表项之后
template <class T>
void SeqList<T>::Insert(T x)//在值为x的表项后插入(多个元素仅考虑第一个))
{
	int insertdata;// insertdata;//表示插入的元素
	if (last == maxSize - 1) //表满
	{
		SeqList<T>::reSize(maxSize);
		cout << "请输入您想在值为x的元素后插入的整数" << endl;
		int insertdata;
		cin >> insertdata;
		for (int i = 0; i <= last; i++)
		{
			if (data[i] == x)
			{			
				for (int j = last+1 ; j >1+i; j--)
				{
					data[j] = data[j-1];//依次后移动
				}
				data[i+1] = insertdata;
				last++;
			}							
		}
		cout << "插入成功" << endl;	
	}

	else
	{ 		
		cout << "请输入您想在值为x的元素后插入的整数" << endl;
		int insertdata;
		cin >> insertdata;
		for (int i = 0; i <= last; i++)
		{
			if (data[i] == x)
			{
				for (int j = last+1; j > i+1; j--)
				{
					data[j] = data[j -1 ];//依次后移动
				}
	 			data[i + 1] = insertdata;
				last++;
			}			
		}
		cout << "插入成功" << endl;
	}
}


//  前插   在特定元素前插入元素, 考虑相同元素有多个
template <class T>
void SeqList<T>::Binsert(T x)
{
	int insertdata;// insertdata表示插入的元素
	if (last == maxSize - 1) //表满
	{
		SeqList<T>::reSize(maxSize);
		cout << "请输入您想在值为x的元素前插入的整数" << endl;
		cin >> insertdata;
		for (int i = 0; i <= last; i++)
		{
			if (data[i] == x)
			{
					for (int j = last; j >= i; j--)//从后面开始依次往后移动
					{
						data[j + 1] = data[j];
					}
					data[i] =insertdata;
					last++;
					i++;//下标为i的元素是insertdata
			}
		}
        cout << "插入成功" << endl;
	}

	else
	{
	cout << "请输入您想在值为x的元素前插入的整数" << endl;
	cin >> insertdata;
	for (int i = 0; i <= last; i++)
	{
		if (data[i] == x)
		{
			for (int j = last; j >= i; j--)//从后面开始依次往后移动
			{
				data[j + 1] = data[j];
			}
			data[i] = insertdata;
			last++;
			i++;
		}
	}
		cout << "插入成功" << endl;
	}
}


//删除下标为i的元素  从前往后
template <class T>
void SeqList<T> ::remove(int i)
{
    if (i<0 || i>last + 1)	
	cout << "参数i不合法" << endl;

	else
	{
		for (int j = i; j < last; j++)
		data[j] = data[j+1];
	    last--;
	}
}


//删除值为x的元素,考虑存在多个
template <class T>
void SeqList<T> ::Remove(T x)
{
	int i = 0, j = 0;
	while (i < last + 1)
	{
		if (data[i] == x)
		{
			j++;//记录要删除的元素的个数
		}
		else
		{
			data[i - j] = data[i];//元素前移
		}
		i++;
	}
	last -= j;//顺序表长度发生变化
}


#endif // !SEQLIST_H

源程序

```cpp
#include"pch.h"
#include"LinearList.h"
#include"SeqList.h"
#include<iostream>
#include<string>
#include<stdlib.h>
using namespace std;

int main()
{  
		  string insertdata;//表示输入的数据
		  cout << "已经为您自动创建了一个最大容量为10的顺序表" << endl;
		  cout << endl;
		  SeqList<int> a(10);
		  
		  cout << "请选择您的操作" << endl << "1:在最后一个元素之后插入" << endl << "2:在特定元素值前进行插入" << endl;
		  cout << "3:在特定元素后插入数据" << endl << "4:删除下标为i的元素的值" << endl << "5:删除值为x的元素的值" << endl;
		  cout << "6:输出顺序表内元素的个数" << endl << "7.输出顺序表的最大容量" << endl;
		  cout << "8.打印下标为i的元素的值" << endl << "9.打印所有元素的值" << endl << "10.逆序输出" << endl;
		  cout<<"11.清空单链表"<<endl<<"12:退出" << endl;
		  cout << endl;
		  int choice;
		  while (cin >> choice)
		  {
			  //最后一个元素后插入
			  if (choice == 1)
			  {
				  cout << "请输入您想插入的元素的值" << endl;
				  cin >> insertdata;
				  a.insert(insertdata);
				  a.printData();
				  cout << "请继续您的操作" << endl;
				  cout << endl;
				 
			  }


			  //在特定元素前插入元素,考虑相同元素有多个
			  else if (choice == 2)
			  {
				  cout << "请输入您想在其前面进行插入操作的特定元素值 " << endl;
				  int x;//表示元素的值
				  cin >> x;
				  a.Binsert(x);
				  a.printData();
				  cout << "请继续您的操作" << endl;
				  cout << endl;
			  }


			  //在特定元素值后进行插入
			  else  if (choice == 3)
			  {
				  cout << "请输入您想在其后面进行插入操作的特定元素值 " << endl;
				  int x;//表示元素的值
				  cin >> x;
                  a.Insert(x);
				  a.printData();
				  cout << "请继续您的操作" << endl;
				  cout << endl;
				 
			  }


			  //删除对应下标的元素
			  else if (choice == 4)
			  {
				  cout << "请输入您删除的元素的下标" << endl;
				  int i;
				  while (cin >> i)
				  {
					  if (i >= 0 && i <a.Length())
					  {
						  a.remove(i);
						  break;
					  }
					  else
						  cout << "输入有误,请重新输入" << endl;
				  }
				  a.printData();
				  cout << "请继续您的操作" << endl;
				  cout << endl;
				 
			  }


			  //删除值为x的元素
			  else if (choice == 5)
			  {
				  cout << "请输入您想删除的元素值" << endl;
				  int x;//表示删除的元素的值
				  while (cin >> x)
				  {
					  
					  for (int i = 0; i < a.Length(); i++)
					  {
						  if (a.getData(i) == x)						  
							  a.Remove(a.getData(i));//保证删除多个值为x的元素
					  }
					  break;					 
				  }
				  a.printData();
				 cout << "请继续您的操作" << endl;  
				 cout << endl;
			  }


			
			  //输出顺序表内的元素的个数
			  else if (choice == 6)
			  {
			  cout << a.Length() << endl;
			  a.printData();
			  cout << "请继续您的操作" << endl;
			  cout << endl;
			  }


			  //输出顺序表的最大容量
			  else if (choice == 7)
			  {
			  cout << a.Size() << endl;
			  a.printData();
			  cout << "请继续您的操作" << endl;
			  cout << endl;
              }
        		

			    //打印下标为i的元素的值
			  else if (choice == 8)//打印下标为i的元素的值
			  {
				  cout << "请输入您打印的元素的下标" << endl;
				  int i;
				  while (cin >> i)
				  {
					  if (i >= 0 && i < a.Length())
					  {
						  cout<<a.getData(i)<<endl;
						  break;//跳出while循环
					  }
					  else
						  cout << "输入有误,请重新输入" << endl;
				  }
				  a.printData();
				  cout << "请继续您的操作" << endl;
				  cout << endl;
				 
			  }


			  //打印所有元素的值
			  else if (choice == 9)
			  {
				  a.printData();
				  cout << "请继续您的操作" << endl;
				  cout << endl;
			  }  

			
			  //逆序输出所有元素
			  else if (choice == 10)
			  {
			  a.print_reverse();
			  cout << "请继续您的操作" << endl;
			  cout << endl;

              }


              //清空单链表
			  else if (choice == 11)
			  {
			  a.Clear();
			  a.printData();
			  cout << "请继续您的操作" << endl;
			  cout << endl;
              }


			  //退出
			  else if (choice == 12)
			  { 
			  break;
			  }

              //用户输入异常的处理
			  else
				  cout << "输入有误,请重新输入" << endl;  
		  }
	return 0;
}




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值