实验2.3 运用双链表实现对数据的基本操作

一、实验目的

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

学会针对具体应用,

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


二、实验内容

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

三 、实验步骤

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

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

3、完整程序;

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

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


四、实验算法(参考书本第40~41页)

1、采用C++的模板机制
#ifndef LinkList_H
#define LinkList_H 

template<class DataType>
struct DulNode
{
	DataType data;
	DulNode<DataType>*prior,*next;
 } ;
 
 template<class DataType>
 class DulLinkList
 {
 	public:
 		DulLinkList();
 		DulLinkList(DataType a[],int n);
 		~DulLinkList();
 		int Locate(DataType x);
 		void Insert(int i,DataType x);
 		DataType Delete(int i);
 		void PrintList();
 	private:
 		DulNode<DataType>*frist;
 };
#endif
2、新建dullinklist类声明
#include<iostream>
 using namespace std;
 template<class DataType>
 DulLinkList<DataType>::DulLinkList()
 {
 	frist=new DulNode<DataType>;
 	frist->next=NULL;
	frist->prior=NULL;
 }
 
 template<class DataType>
 DulLinkList<DataType>::DulLinkList(DataType a[],int n)
 {
 	DulNode<DataType>*r,*s;
 	frist=new DulNode<DataType>;
	 r=frist;
	 for(int i=0;i<n;i++)
	 {s=new DulNode<DataType>;
	 s->data=a[i];
	 r->next=s;r=s;
	  } 
	  r->next=NULL;
 }
 
 template<class DataType>
 DulLinkList<DataType>::~DulLinkList()
 {
	DulNode<DataType>*q=NULL;
 	while(frist!=NULL)
 	{
		q=frist;
		frist->prior->next=frist->next;
		frist->next->prior=frist->prior;
		frist=frist->next;
 		delete q;
	 }
	delete frist;
  } 
3、双链表的插入
template<class DataType>
void DulLinkList<DataType>::Insert(int i,DataType x)
{
	DulNode<DataType>*p=frist,*s=NULL;
	int count=0;
	while(p!=NULL&&count<i-1)
	{
		p=p->next;
		count++;
	}
	if(p==NULL)throw"位置";
	else{
		s=new DulNode<DataType>;
		s->data=x;
		s->prior=p;
		s->next=p->next;
		(p->next)->prior=s;
		p->next=s;
	}
 } 

4、双链表的删除
template<class DataType>
DataType DulLinkList<DataType>::Delete(int i)
{
	DulNode<DataType>*p=frist,*q=NULL;
	DataType x;
	int count=0;
	while(p!=NULL&&count<i-1)
	{
		p=p->next;
		count++;
	}
	if(p==NULL||p->next==NULL)
	throw"位置";
	else{
		DataType x=p->data;
		(p->prior)->next=p->next;
		(p->next)->prior=p->prior;
		delete q;
		return x;
	}
  }  

5、双链表的定义
template<class DataType>
  int DulLinkList<DataType>::Locate(DataType x)
  {
  	DulNode<DataType>*p=frist->next;
	int count=1;
  	while(p!=NULL)
  	{
  		if(p->data==x)return count;
  		p=p->next;
  		count ++;
	  }
	  return 0;
  }
 
 template<class DataType>
 void DulLinkList<DataType>::PrintList()
 {
 	DulNode<DataType>*p=frist->next;
 	while(p!=NULL)
 	{
 		cout<<p->data<<" ";
 		p=p->next;
	 }
	 cout<<endl;
 }
6、主函数
int main()
 {
 	int r[5]={87,68,74,90,80};
 	DulLinkList<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(); 
 }

五、实验代码

#ifndef LinkList_H
#define LinkList_H 

template<class DataType>
struct DulNode
{
	DataType data;
	DulNode<DataType>*prior,*next;
 } ;
 
 template<class DataType>
 class DulLinkList
 {
 	public:
 		DulLinkList();
 		DulLinkList(DataType a[],int n);
 		~DulLinkList();
 		int Locate(DataType x);
 		void Insert(int i,DataType x);
 		DataType Delete(int i);
 		void PrintList();
 	private:
 		DulNode<DataType>*frist;
 };
#endif
 
 
 #include<iostream>
 using namespace std;

 
 template<class DataType>
 DulLinkList<DataType>::DulLinkList()
 {
 	frist=new DulNode<DataType>;
 	frist->next=NULL;
	frist->prior=NULL;
 }
 
 template<class DataType>
 DulLinkList<DataType>::DulLinkList(DataType a[],int n)
 {
 	DulNode<DataType>*r,*s;
 	frist=new DulNode<DataType>;
	 r=frist;
	 for(int i=0;i<n;i++)
	 {s=new DulNode<DataType>;
	 s->data=a[i];
	 r->next=s;r=s;
	  } 
	  r->next=NULL;
 }
 
 template<class DataType>
 DulLinkList<DataType>::~DulLinkList()
 {
	DulNode<DataType>*q=NULL;
 	while(frist!=NULL)
 	{
		q=frist;
		frist->prior->next=frist->next;
		frist->next->prior=frist->prior;
		frist=frist->next;
 		delete q;
	 }
	delete frist;
  } 
  
template<class DataType>
void DulLinkList<DataType>::Insert(int i,DataType x)
{
	DulNode<DataType>*p=frist,*s=NULL;
	int count=0;
	while(p!=NULL&&count<i-1)
	{
		p=p->next;
		count++;
	}
	if(p==NULL)throw"位置";
	else{
		s=new DulNode<DataType>;
		s->data=x;
		s->prior=p;
		s->next=p->next;
		(p->next)->prior=s;
		p->next=s;
	}
 } 
   
template<class DataType>
DataType DulLinkList<DataType>::Delete(int i)
{
	DulNode<DataType>*p=frist,*q=NULL;
	DataType x;
	int count=0;
	while(p!=NULL&&count<i-1)
	{
		p=p->next;
		count++;
	}
	if(p==NULL||p->next==NULL)
	throw"位置";
	else{
		DataType x=p->data;
		(p->prior)->next=p->next;
		(p->next)->prior=p->prior;
		delete q;
		return x;
	}
  }  
  
  template<class DataType>
  int DulLinkList<DataType>::Locate(DataType x)
  {
  	DulNode<DataType>*p=frist->next;
	int count=1;
  	while(p!=NULL)
  	{
  		if(p->data==x)return count;
  		p=p->next;
  		count ++;
	  }
	  return 0;
  }
 
 template<class DataType>
 void DulLinkList<DataType>::PrintList()
 {
 	DulNode<DataType>*p=frist->next;
 	while(p!=NULL)
 	{
 		cout<<p->data<<" ";
 		p=p->next;
	 }
	 cout<<endl;
 }
 
 int main()
 {
 	int r[5]={87,68,74,90,80};
 	DulLinkList<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(); 
 }
 

六、实验运行结果


七、实验总结和心得

通过查阅课本以及询问同学,知道双链表的做法与单链表有类似的地方。
是在单链表的每个结点中再设置一个指向前驱结点的指针域就形成了双链表。
但是在运行是还是出现了报错的情况,修改了以后还是有不对的地方,这我就不太懂了。
结果还是可以运行出来的,不知道是哪里出了问题。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值