1. 程式人生 > >學生成績——單鏈表

學生成績——單鏈表

#include<iostream>  
using namespace std;  
template<class Datatype>    
struct Node  //設定結點
{    
    Datatype data;    
    Node<Datatype> *next;    
};   
template <class Datatype>  
class Linklist
{  
	Node<Datatype> *first;  
public:  
    Linklist();  
    Linklist(Datatype a[],int n);  
    ~Linklist();  
    int length();//求連結串列長度  
    Datatype get(int i);//按位查詢  
    int locate(Datatype x);//按值查詢  
    void insert(int i,Datatype x);//插入  
    Datatype Delete(int i);//刪除  
    void printlist();//遍歷    
};  
//成員函式的定義
template <class Datatype>  
Linklist<Datatype>::Linklist()
{  
	first=new Node<Datatype>;  
	first->next=NULL;  
}  
template<class Datatype>  
void Linklist<Datatype>::printlist()
{  
    Node<Datatype> *p=NULL;  
	p=first->next;  
	cout<<"輸出成績:";
	while(p!=NULL)  
	{  
		cout<<p->data<<"  ";  
		p=p->next;  
	}  
}  
template<class Datatype>  
Linklist<Datatype>::Linklist(Datatype a[],int n)
{  
    Node<Datatype> *s;  
	first=new Node<Datatype>;  
	first->next=NULL;  
	for(int i=0;i<n;i++)  
	{  
	s=new Node<Datatype>;  
	s->data=a[i];  
	s->next=first->next;  
	first->next=s;  
	}  
}  
template<class Datatype>  
Linklist<Datatype>::~Linklist()
{  
    Node<Datatype> *q=NULL;  
    while(first!=NULL)  
    {  
        q=first;  
        first=first->next;  
        delete q;  
    }  
cout<<"\n資料清空,歡迎再次使用!"<<endl;  
}  
template<class Datatype>  
int Linklist<Datatype>::length()
{  
    Node<Datatype> *p=NULL;  
	p=first->next;  
	int count=0;  
	while(p!=NULL)  
	{  
		p=p->next;  
		count++;  
	}  
	return count;  
}  
template<class Datatype>  
Datatype Linklist<Datatype>::get(int i)
{  
    Node<Datatype> *p=NULL;  
    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 Datatype>  
int Linklist<Datatype>::locate(Datatype x)
{  
    Node<Datatype> *p=NULL;  
	p=first->next;  
	int count=1;  
	while(p!=NULL){  
		if(p->data==x)  
    return count;  
		p=p->next;  
		count++;  
	}  
	return 0;  
}  
template<class Datatype>  
void Linklist<Datatype>::insert(int i,Datatype x)
{  
    Node<Datatype> *p,*s;  
	p=first;  
	int count=0;  
	while(p!=NULL && count<i-1)  
	{  
		p=p->next;  
		count++;  
	}  
	if(p==NULL)  throw"溢位";  
	else  
    {s=new Node<Datatype>;  
	s->data=x;  
	s->next=p->next;  
	p->next=s;}  
}  
template<class Datatype>  
Datatype Linklist<Datatype>::Delete(int i)
{  
    Node<Datatype> *p;  
	p=first;  
	int count=0;  
	while(p!=NULL&&count<i-1){  
		p=p->next;  
		count++;  
	}  
	if(p==NULL||p->next==NULL)  
		throw"位置";  
	else  
	{Node<Datatype> *q=NULL;  
	q=p->next;  
	Datatype x=q->data;  
	p->next=q->next;  
	delete q;  
	return x;  
	}  
}  
int main(){  
    int stu_score[6]={53,78,96,56,88,68};  
    Linklist<int>list1(stu_score,6); 
	cout<<"初始成績如下!"<<endl;
    list1.printlist();//遍歷  
    cout<<endl;  
    cout<<"1、按位查詢\n第3位學生的分數為:"<<list1.get(4)<<endl;//按位查詢  
    cout<<"2、按值查詢\n96分所在的學生位置在第"<<list1.locate(96)<<"位"<<endl;//按值查詢  
    cout<<"此時的資料長度為:"<<list1.length()<<endl;//長度  
    cout<<"在第4個學生位置插入88"<<endl;  
    list1.insert(4,88);//插入  
    list1.printlist();  
    cout<<endl;  
    cout<<"此時的資料長度為:";  
    cout<<list1.length()<<endl;  
    cout<<"刪除第一個分數!"<<list1.Delete(1)<<endl;//刪除  
    list1.printlist();  
    cout<<endl;  
}