实验二循环链表

一.实验目的

     巩固线性表的数据结构的存储方法和相关操作,学会针对具体应用,使用线性表的相关知识来解决具体问题。

二.实验内容

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

源代码:
#include<iostream> 
using namespace std; 

template<class DT>
struct Node
{
	DT data;
	Node<DT>*next;
};

template<class DT>
class Circlelist
{
public:
	Circlelist(DT a[],int n);
	~Circlelist();
	int Length();
	DT Get(int i);
	int Locate(DT x);
	void Insert(int i,DT x);
	DT Delete(int i);
	void Printlist();
private:
	Node<DT>*first;
};

template<class DT>
Circlelist<DT>::Circlelist(DT a[],int n)
{
	Node<DT>*r,*s;
	first=new Node<DT>;
	r=first;
	for (int i=0;i<n;i++)
	{
		s=new Node<DT>;s->data=a[i];
		r->next=s;r=s;
	}
	r->next=first;
}

template<class T>  
Circlelist<T>::~Circlelist()  
{  
	Node<T> *p = first->next;  
	Node<T> *temp = first;  
	while (p != first)  
	{  
		delete temp;  
		temp = p;  
		p = p->next;  
	}  
	delete temp;    
}  

template<class DT>
int Circlelist<DT>::Length()
{
	Node<DT>*p=first->next;int count=0;
	while(p!=NULL)
	{
		p=p->next;
		count++;
	}
	return count++;
}
template<class DT>
DT Circlelist<DT>::Get(int i)
{
	Node<DT>*p=first->next;int count=1;
	while(p!=NULL&&count<i)
	{
		p=p->next;
		count++;
	}
	if(p==NULL)throw"位置";
	else return p->data;
}

template<class DT>
int Circlelist<DT>::Locate(DT x)
{
	Node<DT>*p=first->next;int count=1;
	while(p!=NULL)
	{
		if(p->data==x)return count;
		p=p->next;
		count++;
	}
	return 0;
}

template<class DT>
void Circlelist<DT>::Insert(int i,DT x)
{
	Node<DT>*p=first;
	for(int count=1;count<=i-1;count++)
	{
		p=p->next;
	}
	Node<DT>*temp;
	temp=new Node<DT>;
	temp->data=x;
	temp->next=p->next;
	p->next=temp;
}

template<class DT>
DT Circlelist<DT>::Delete(int i)
{
	Node<DT>*p=first;int count=0;
	while(p!=NULL&&count<i-1)
	{
		p=p->next;
		count++;
	}
	if (p==NULL||p->next==NULL)
		throw"位置";
	else{
		Node<DT>*q=p->next;DT x=q->data;
		p->next=q->next;
		delete q;
		return x;
	}
}

template<class DT>
void Circlelist<DT>::Printlist()
{
	Node<DT>*p=first->next;
	while(p!=NULL)
	{
		cout<<p->data<<" ";
		p=p->next;
	}
}

void main()  
{  
	int a[10]={100,98,96,94,91,89,86,81,76,62};  
	Circlelist<int> Circle1(a,10);  
	cout<<"10人成绩:"<<endl;  
	Circle1.Printlist();  
	cout<<endl;  
	cout<<"排名第3的成绩为:"<<endl;  
	cout<<Circle1.Get(7)<<endl;  
	cout<<"81分的同学排名为:"<<endl;  
	cout<<Circle1.Locate(81)<<endl;  
	cout<<"尾端插入成绩为56且倒数第一:"<<endl;  
	Circle1.Insert(11,56);  
	cout<<"当前表为:"<<endl;  
	Circle1.Printlist();  
	cout<<endl;  
	cout<<"删除不及格成绩"<<endl;  
	Circle1.Delete(11);  
	cout<<"当前表为:"<<endl;  
	Circle1.Printlist();  
	cout<<endl;  
}  

运行结果:


心得体会

本程序是用单链表改成的单循环链表。循环链表成环,与单链表不同的是判断是否为最后节点时单链表的标准为“后继是否为空”,循环链表的标准是“后继是否为头节点”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值