数据结构之顺序表

本文介绍了一种通用的线性表(List)类模板及其派生类——顺序表(arrList)的具体实现方法。通过C++代码展示了如何进行基本操作如插入、删除等,并提供了完整的示例程序。
// arrlist.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <iostream.h>


//定义线性表List
template <class T> 
class List  {
	void clear(); 		 						//置空线性表
	bool isEmpty();								//线性表为空时,返回true
	bool append(const T value);					//在表尾添加一个元素value,表的长度增1
	bool insert(const int p, const T value);	//在位置p上插入一个元素value,表的长度增1
	bool delete1(const int p); 					//删除位置p上的元素,表的长度减 1
	bool getPos(int & p, const T value);		//查找值为value的元素并返回其位置
	bool getValue(const int p, T& value);	 	//把位置p的元素值返回到变量value中
	bool setValue(const int p, const T value);	//用value修改位置p的元素值
};
 

//定义顺序表arrList
template <class T> 
class arrList : public List<T>  {				//顺序表,向量
private:    									//线性表的取值类型和取值空间
	T    *aList ;     		   					//私有变量,存储顺序表的实例
	int  maxSize;            					//私有变量,顺序表实例的最大长度
	int  curLen; 								//私有变量,顺序表实例的当前长度
	int  position;								//私有变量,当前处理位置
public: 										//顺序表的运算集
	arrList(const int size) {  					//创建一个新的顺序表,参数为表实例的最大长度
		maxSize = size;  aList = new T[maxSize]; curLen = position = 0;
	}
	~arrList() {								//析构函数,用于消除该表实例
		delete [] aList;
	}
	void clear() { 								//将顺序表存储的内容清除,成为空表
		delete [] aList; curLen = position = 0;
		aList = new T[maxSize];
	} 
	int  length();           		 			//返回此顺序表的当前实际长度
	bool list(); 								//显示表
	bool append(const T value);					//在表尾添加一个元素value,表的长度增1
	bool insert(const int p, const T value);	//在位置p上插入一个元素value,表的长度增1
	bool delete1(const int p); 					//删除位置p上的元素,表的长度减 1
	bool setValue(const int p, const T value);	//用value修改位置p的元素值
	bool getValue(int &p, const T& value);	//把位置p的元素值返回到变量value中  
	bool getPos(int &p, const T value);			//查找值为value的元素,并返回第1次出现的位置
  }; 


template <class T>
int arrList<T> :: length() 						//求表长
{
	 return curLen;
}

template <class T>
bool arrList<T> :: list() 						//显示表
{
	 int i;
	 if(curLen==0) return false;
	 printf("表元素为:");
	 for(i=0;i<curLen;i++)
		 printf("%c ",aList[i]);
	 printf("\n");
	 return true;
}

template <class T>
bool arrList<T>::append(T value)   //在表尾添加一个元素value,表的长度增1
{
	if(curLen>=maxSize){
		cout<<"The list is illegal"<<endl;
		return false;
	}
	aList[curLen++]=value;
	return true;
}

template <class T>
bool arrList<T> :: insert(const int p, const T value) //添加元素
{
 int i;
 if(curLen>=maxSize) {
	 cout << "The list is overflow"<<endl;
	 return false;
 }
 if(p<0 || p>curLen+1) {
	 cout<< "Insertion point is illegal"<<endl;
	 return false;
 }
 for(i=curLen; i>=p; i--)
	 aList[i]=aList[i-1];
 aList[p-1]=value;
 curLen++;
 return true;
}

template<class T>
bool arrList<T>::delete1(const int p)//删除元素
{
	int i;
	if(curLen<=0)
	{
		cout<<"表为空"<<endl;
		return false;
	}
	if(p<0||p>curLen-1)
	{
		cout<<"删除位置不合法\n"<<endl;
	}
	for(i=p-1;i<curLen;i++)
	{
		 aList[i]=aList[i+1];
	}
	curLen--;
	return true;
}

template<class T>
bool arrList<T>::setValue(const int p, const T value)// // 用value修改位置p的元素值
{
	if(curLen>=maxSize){
		cout<<"The list is overflow!"<<endl;
		return false;
	}
	if(p<0||p>maxSize){
		cout<<"The position is illegal!"<<endl;
		return false;
	}
	aList[p]=value;
	return true
}

template<class T>
bool arrList<T>::getValue(int &p, const T& value)//把位置p的元素值返回到变量value中  
{
	if(curLen>=maxSize){
		cout<<"The list is overflow!"<<endl;
		return false;
	}
	if(p<0||p>maxSize)
	{
		cout<<"The position is illegal!"<<endl;
		return false;
	}
	int i;
	for(i=0;i<curLen;i++)
	{
		aList[p]==value;
		return true;
	}
	
	return false;
}

template<class T>
bool arrList<T>::getPos(int &p,const T value)
{
	int i;
	for(i=0;i<curLen;i++)
	{
		if(value==aList[i])
		{
			p=i+1;
			return true;
		}
	}
	return false;
}





void main()
{
	arrList<char> AL(1000);						//定义及构造顺序表对象
	int choice;
	int pos;
	char value;
    bool ok;
	
	do	{
		printf("顺序表上机程序,请选择(0退出,1清除表,2显示表,3求表长,4插入元素,5追加元素,6删除元素,7查找元素值,8查找元素位置):");
		scanf("%d",&choice);
		switch(choice)
		{case 0: 
		     printf("再见!\n"); 
			 break;
		 case 1:
			 AL.clear();
			 printf("清除表操作成功!\n");
			 break;
		 case 2: 
			 ok=AL.list();
			 if(ok==false) printf("空表!\n"); 
			 break;
		 case 3: 
			 pos=AL.length();
			 if(pos==0) printf("空表!\n");
			 else printf("表长为:%d\n",pos);
			 break;
		 case 4: 
			 printf("请输入插入位置:"); scanf("%d",&pos); getchar();
			 printf("请输入元素值:"); value=getchar();
			 ok=AL.insert(pos,value);
			 if(ok==false) printf("插入操作失败!\n");
			 else printf("插入操作成功!\n");
			 break;
		 case 5:
			 printf("请输入追加元素值:");scanf("%s",&value); getchar();
			 ok=AL.append(value);
			 if(ok==false) printf("插入操作失败!\n");
			 else printf("插入操作成功!\n");
			 break;
		 case 6:
			 printf("请输入删除位置:");scanf("%d",&pos);getchar();
			 ok=AL.delete1(pos);
			 if(ok==false) printf("删除操作失败!\n");
			 else printf("删除操作成功!\n");
			 break;
		 case 7: 
			 printf("请输入查找元素值:");scanf("%s",&value);getchar();
			 ok=AL.getPos(pos,value);
			 if(ok==false) printf("查找元素位置操作失败!\n");
			 else printf("查找元素位置操作成功,元素位置为:%d\n",pos);
			 break;
		 case 8:
			 printf("请输入查找元素位置:");scanf("%d",&pos);getchar();
			 ok=AL.getValue(pos,value);
			 if(ok==false) printf("查找元素位置操作失败!\n");
			 else printf("查找元素位置操作成功,元素值位置为:%c\n",value);
			 break;
		 default: printf("选择错误!\n");
		}
    
	}while(choice!=0);

	getchar();									//暂停
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值