实验2.4 运用静态链表实现对数据的基本操作

一、实验目的

巩固线性表的数据结构的存储方法和相关操作,

学会针对具体应用,

使用线性表的相关知识来解决具体问题。

二、实验内容

建立一个由n个学生成绩的顺序表,
n的大小由自己确定,
每一个学生的成绩信息由自己确定,
实现数据的对表进行插入、删除、查找等操作。分别输出结果。
三 、实验步骤

1、依据实验内容分别说明实验程序中用到的数据类型的定义;

2、相关操作的算法表达;

3、完整程序;

4、总结、运行结果和分析。

5、总体收获和不足,疑问等。

四、实验算法(参考书本第43~45页)

1、采用C++的模板机制
const int MaxSize=100;   //100只是示例数据,可以根据实际问题具体定义
template<class DataType>
struct Node
{
	DataType data;   //DataType 表示不确定的数据类型
	int next;       //指针域,注意不是指针类型
};
 
 template<class DataType>
 class static_LinkList
 {
 	public:
 		static_LinkList();
 		static_LinkList(DataType a[],int n);
 		~static_LinkList(){};
 		void Insert(int i,int x);
 		int Locate(DataType x);
 		DataType Delete(int i);
 		void PrintList();
 	private:
 		Node<DataType>data[MaxSize];
		int frist;
		int avail;
 };
2、 新建static_linklist类声明
template<class DataType>
 static_LinkList<DataType>::static_LinkList()
 {
 	frist=0;
	avail=0;
	data[0].next=-1;
	for(int i;i<MaxSize-1;i++)
	{
		data[i].next=i+1;
	}
	data[MaxSize-1].next=-1;
 }
 
 template<class DataType>
 static_LinkList<DataType>::static_LinkList(DataType a[],int n)
 {
 	int s;
	if(n>=MaxSize||n<=0)
	{
		throw"位置";
	}
	frist=0;
	data[0].next=avail=1;
	for(int i=0;i<MaxSize-1;i++)
	{
		data[i].next=i+1;
	}
	data[MaxSize-1].next=-1;
	for(int i=0;i<n;i++)
	{
		s=avail;
		data[s].data=a[i];
		avail=data[avail].next;
	}
	data[s].next=-1;
 }
3、插入
template<class DataType>
void static_LinkList<DataType>::Insert(int i,int x)
{
	int s;
	s=avail;
	avail=data[avail].next;
	data[s].data=x;
	for(int p=0;p<MaxSize-1;p++)
	{
		if(p==i)
		{
			data[s].next=data[p].next;
			data[p].next=s;
		}
	}
 } 
4、删除
template<class DataType>
DataType static_LinkList<DataType>::Delete(int i)
{
	if(i>0&&i<MaxSize)
	{
		int q;
		i=i-1;
		q=data[i].next;
		data[i].next=data[q].next;
		data[q].next=avail;
		avail=q;
		return data[q].data;
  }  
	else
	{
		throw"位置";
	}
}
5、定义
 template<class DataType>
  int static_LinkList<DataType>::Locate(DataType x)
  {
  	int count;
	count=data[frist].next;
	for(count;count!=-1;count++)
	{if(data[count].data==x)
	{
		return count;
  }
	}
	return 0;
  }
 
 template<class DataType>
 void static_LinkList<DataType>::PrintList()
 {
 	int p;
	p=data[frist].next;
	while(p!=-1)
	{
		cout<<data[p].data<<endl;
		p=data[p].next;
	}
 }
6、主函数
int main()
 {
 	int r[5]={87,68,74,90,80};
 	static_LinkList<int>L(r,5);
 	cout<<"执行插入成绩操作前数据为:"<<endl;
 	L.PrintList();
 	try
 	{
 		L.Insert(2,70);
	 }
	 catch(char*s)
	 {
	 	cout<<s<<endl;
	 }
	 cout<<"执行插入成绩操作后数据为:"<<endl;
	 L.PrintList();
	 cout<<"值为74的元素位置为:";
	 cout<<L.Locate(74)<<endl;
	 cout<<"执行删除第一个学生成绩操作前数据为:"<<endl;
	 L.PrintList();
	 try
	 {
	 	L.Delete(1);
	  } 
	  catch(char*s)
	  {
	  cout<<s<<endl;
	  }
	  cout<<"执行删除成绩操作后数据为:"<<endl;
	  L.PrintList(); 
	  return 0;
 }

五、实验代码

 #include<iostream>
 using namespace std;
const int MaxSize=100;
template<class DataType>
struct Node
{
	DataType data;
	int next;
};
 
 template<class DataType>
 class static_LinkList
 {
 	public:
 		static_LinkList();
 		static_LinkList(DataType a[],int n);
 		~static_LinkList(){};
 		void Insert(int i,int x);
 		int Locate(DataType x);
 		DataType Delete(int i);
 		void PrintList();
 	private:
 		Node<DataType>data[MaxSize];
		int frist;
		int avail;
 };

 template<class DataType>
 static_LinkList<DataType>::static_LinkList()
 {
 	frist=0;
	avail=0;
	data[0].next=-1;
	for(int i;i<MaxSize-1;i++)
	{
		data[i].next=i+1;
	}
	data[MaxSize-1].next=-1;
 }
 
 template<class DataType>
 static_LinkList<DataType>::static_LinkList(DataType a[],int n)
 {
 	int s;
	if(n>=MaxSize||n<=0)
	{
		throw"位置";
	}
	frist=0;
	data[0].next=avail=1;
	for(int i=0;i<MaxSize-1;i++)
	{
		data[i].next=i+1;
	}
	data[MaxSize-1].next=-1;
	for(int i=0;i<n;i++)
	{
		s=avail;
		data[s].data=a[i];
		avail=data[avail].next;
	}
	data[s].next=-1;
 }

template<class DataType>
void static_LinkList<DataType>::Insert(int i,int x)
{
	int s;
	s=avail;
	avail=data[avail].next;
	data[s].data=x;
	for(int p=0;p<MaxSize-1;p++)
	{
		if(p==i)
		{
			data[s].next=data[p].next;
			data[p].next=s;
		}
	}
 } 
   
template<class DataType>
DataType static_LinkList<DataType>::Delete(int i)
{
	if(i>0&&i<MaxSize)
	{
		int q;
		i=i-1;
		q=data[i].next;
		data[i].next=data[q].next;
		data[q].next=avail;
		avail=q;
		return data[q].data;
  }  
	else
	{
		throw"位置";
	}
}
  
  template<class DataType>
  int static_LinkList<DataType>::Locate(DataType x)
  {
  	int count;
	count=data[frist].next;
	for(count;count!=-1;count++)
	{if(data[count].data==x)
	{
		return count;
  }
	}
	return 0;
  }
 
 template<class DataType>
 void static_LinkList<DataType>::PrintList()
 {
 	int p;
	p=data[frist].next;
	while(p!=-1)
	{
		cout<<data[p].data<<endl;
		p=data[p].next;
	}
 }
 
 int main()
 {
 	int r[5]={87,68,74,90,80};
 	static_LinkList<int>L(r,5);
 	cout<<"执行插入成绩操作前数据为:"<<endl;
 	L.PrintList();
 	try
 	{
 		L.Insert(2,70);
	 }
	 catch(char*s)
	 {
	 	cout<<s<<endl;
	 }
	 cout<<"执行插入成绩操作后数据为:"<<endl;
	 L.PrintList();
	 cout<<"值为74的元素位置为:";
	 cout<<L.Locate(74)<<endl;
	 cout<<"执行删除第一个学生成绩操作前数据为:"<<endl;
	 L.PrintList();
	 try
	 {
	 	L.Delete(1);
	  } 
	  catch(char*s)
	  {
	  cout<<s<<endl;
	  }
	  cout<<"执行删除成绩操作后数据为:"<<endl;
	  L.PrintList(); 
	  return 0;
 }
 

六、实验运行结果


七、实验总结和心得

静态链表是用数组来表示单链表,用数组元素的下标来模拟单链表的指针。
运用s=avail可以不用申请新结点,而是利用空闲链的第一个结点。
在插入和删除操作时,只需要修改游标,不需要移动表中的元素,
从而改进了在顺序表中 插入和删除操作需要移动大量元素的缺点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值