1. 程式人生 > >實驗二線性表綜合實驗2

實驗二線性表綜合實驗2

一.實驗目的

鞏固線性表的資料結構的儲存方法和相關操作,學會針對具體應用,使用線性表的相關知識來解決具體問題。

二..實驗內容

1.建立一個由n個學生成績的順序表,n的大小由自己確定,每一個學生的成績資訊由自己確定,實現資料的對錶進行插入、刪除、查詢等操作。分別輸出結果。

要求如下:

2)用單鏈表來實現。

三、原始碼

#include<iostream>
using namespace std;
template <class T>
struct Node
{
	T data;
	Node <T>*next;
};
template <class T>
class Linklist
{
public:
	Linklist();
	Linklist(T a[],int n);
	~Linklist();
	void Insert(int i,T x);
	T Delete(int i);
	int Locate(T x);
	void Printlist();
private:
	Node<T>*first;
};
template <class T>
Linklist<T>::Linklist()
{
	first=new Node<T>;
	first->next=NULL;
}
template <class T>
Linklist<T>::Linklist(T a[],int n)
{
	Node<T>*r,*s;
	first=new Node<T>;
	r=first;
	for(int i=0;i<n;i++)
	{
		s=new Node<T>;
		s->data=a[i];
		r->next=s;
		r=s;
	}
	r->next=NULL;
}
template <class T>
Linklist<T>::~Linklist()
{
	Node<T>*q=NULL;
	while(first!=NULL)
	{
		q=first;
		first=first->next;
		delete q;
	}
}
template <class T>
void Linklist<T>::Insert(int i,T x)
{
	Node<T>*p=first;int count=0;
	Node<T>*s=NULL; 
	while(p!=NULL&&count<i-1)
	{
		p=p->next;
	count++;
	}
	if(p==NULL)throw"位置";
		else
	{
		s=new Node<T>;s->data=x;
		s->next=p->next;p->next=s;
	}
}
template <class T>
T Linklist<T>::Delete(int i)
{
	Node<T>*p=first;int count=0;T x;
	while(p!=NULL&&count<i-1)
	{
		p=p->next;
		count++;
	}
	if(p==NULL||p->next==NULL)throw"位置";
	else{	
		Node<T>*q=p->next;x=q->data;
		p->next=q->next;
		delete q;
		return x;
	}
}
template <class T>
int Linklist<T>::Locate(T x)
{
	Node<T>*p=first->next;
	int count=1;
	while(p!=NULL)
	{
		if(p->data==x)return count;
		p=p->next;
		count++;
	}
	return 0;
}
template <class T>
void Linklist<T>::Printlist()
{
	Node<T>*p=first->next;
	while(p!=NULL)
	{
		cout<<p->data<<" ";
		p=p->next;
	}
	cout<<endl;
}
int main()
{
	int n,i,j,k; 
	int r[7]={1,2,3,4,5,6};
	Linklist<int> S(r,6);
	cout<<"輸出操作前的資料:";
	S.Printlist();
	cout<<"輸入插入的位置和資料:";
	cin>>n>>i;
	try
	{
		S.Insert(n,i);
	}
	catch(char *s)
	{
		cout<<s<<endl;
	}
	cout<<"輸出插入後的資料:";
	S.Printlist();
	cout<<"輸入要刪除的位置:";
	cin>>j;
	try
	{
		S.Delete(j);
	}
	catch(char *s)
	{
		cout<<s<<endl;
	}
	cout<<"輸出刪除後的資料:";
	S.Printlist();
	cout<<"輸入要查到的值:";
	cin>>k; 
	S.Locate(k);
	cout<<"輸出查詢值為k的位置:"<<S.Locate(k)<<endl;
	cout<<"輸出操作完的資料:";
	S.Printlist();
	cout<<endl;
}
四、實驗結果


五、實驗心得

單鏈表是線性表的鏈式儲存結構,他可以零散分佈在記憶體中的任意位置。單鏈表要有資料域(data),是用來存放資料元素;指標域(next)是用來存放該結點的後繼結點的地址。單鏈表就是通過每個結點的指標域將線性表的資料元素按其邏輯次序連結在一起,由於每個結點只有一個指標域,所以成為單鏈表。

    單鏈表的特點是:邏輯次序和物理次序不一定相同;元素之間的邏輯關係要有指標表示。在單鏈表建構的時候第一個節點是沒有資料的,所以要設一個型別相同的結點,稱為頭結點,把頭指標變數稱為頭指標(first指標),頭指標一定要初始化。

    在些程式的時候,建構函式的作用是生成頭指標的空連結串列。單鏈表的優點是:單鏈表的儲存充分利用了剩餘的空間;插入和刪除不需要移動元素。