link鏈表類實驗(多文件模式)

實驗講義

一、實驗目的
1.掌握使用new運算符創建對象的方法;
2.掌握使用delete運算符釋放對象內存的方法;
3.掌握使用面向對象思想實現鏈表類並對鏈表進行操作的方法。
二、實驗內容
1.設計並編寫鏈表類,能夠實現鏈表的初始化(建立)、輸出釋放等功能。
三、實驗指導
(1)鏈表由若干個結點【Node類對象】構成(每個結點有data域和next域,假設每個結點的data域是一個整數,並且沒有重複元素),那麼某個鏈表的邏輯示意圖如下:
3
1
2
6
5 NULL

圖3-1 鏈表邏輯結構示意圖
下面給出鏈表中結點類的定義:
class Node //結點類
{ public:
Node( ); //構造函數
void SetNext(Node *p); //設置後繼結點
int Getd(); //得到當前結點的數據值
Node *GetNext( ); //得到後繼結點的地址
~Node( ); //析構函數
private:
int data;
Node *next;
};
Node::Node( )
{ cin>>data; next=NULL;}
void Node::SetNext(Node p)
{ next=p;}
int Node::Getd( )
{ return data;}
Node
Node::GetNext( )
{ return next;}
Node::~Node( )
{ cout<<data<<" 被析構!"<<endl;}

上面的Node類代碼同學們可以直接使用,下面(2)、(3)爲必做內容
(2)利用Node類,設計並編寫Link(鏈表)類,類中包含:
 數據成員
 Head //頭指針
 Num //鏈表中結點個數 【即鏈表的長度】
 函數成員:
 Link( ) //初始化(建立)空鏈表
 Link(int n) //初始化(建立)一個具有n個結點的鏈表
【在建立鏈表的過程中按值從小到大排序】
 LinkPrint( ) //輸出鏈表中所有結點data域的值
 GetHead( ) //返回鏈表的頭指針
 ~Link( ) //釋放鏈表中所有結點的內存空間
(3)編寫main( )函數,測試Link類中所有函數
【選作內容:編寫Link類的如下成員函數,根據實際完成情況有加分】
 Link_Insert(int x) //在鏈表中插入值爲x的結點
 Link_Delete( int x) //刪除鏈表中值爲x的結點
 Link_Connect(Link &p) //兩個鏈表的連接
【即將p鏈表連接在當前鏈表的尾部】
 Link( Link &p) //使用深複製編寫複製構造函數
 自己設計Node類中data的類型,使本題實現一個具體的應用
四、考覈標準
本實驗總計10分。
(1) Link類的框架 (2分)
(2) Link類成員函數的實現(5分)
(3) main()函數編寫的合理性及功能演示(3分)

Node 類(節點)

Node.h

#ifndef NODE_H
#define NODE_H
class Node
{
    public:
        Node();
        Node(int x);
   	    void SetNext(Node *p);
   	    int Getd();
   	    Node *GetNext();
   	    ~Node();
   private:
        int data;
        Node *next;	
};

#endif

Node.cpp

#include "Node.h"
#include<iostream>
using namespace std;

Node::Node(){
	cin>>data;
	next=NULL;
}

void Node::SetNext(Node *p){
    next=p;
}

int Node::Getd(){
    return data;
}

Node::Node(int x)
{
	data=x;
	next=NULL;
}

Node* Node::GetNext(){
    return next;
}

Node::~Node( ){
    cout<<data<<" 被析構!"<<endl;
}

Link類(鏈表)

Link.h

#ifndef LINK_H
#define LINK_H
#include<iostream>
#include "Node.h"
using namespace std;
class Link
{
	public:
		Link();
		Link(int n);
		Link(Link&);
		~Link();
		void LinkPrint();
		Node* GetHead();
		void Insert(int x);
		void Delete(int x);
		void Connect(Link&);
	private:
		Node *Head;
		int Num;
};

#endif

Link.cpp

#include "Link.h"
#include "Node.h"
#include<iostream>
#include<algorithm>
using namespace std;

Link::Link()
{
	Head=NULL;
	Num=0;
}

Link::Link(int n)
{
	Num=n;
	Head=new Node();
	Node *ph=Head;
	for(int i=1;i<n;i++)
	{
		ph->SetNext(new Node());
		ph=ph->GetNext();
	}
}

Node* Link::GetHead()
{
	return Head;
}

void Link::LinkPrint()
{
	cout<<"該鏈表的所有Date的值爲\n";
	Node *ph=Head;
	int sum=0;
	while(ph!=NULL)
	{
		cout<<ph->Getd()<<" ";
		ph=ph->GetNext();
	}
	cout<<endl; 
}

Link::~Link()
{
	Node *ph=Head,*t;
	while(ph!=NULL)
	{
		t=ph;
		delete(t);
		ph=ph->GetNext();
	}
}

void Link::Insert(int x)
{
	Node *p=Head;
	if(Head==NULL)
	Head=new Node(x);
	while(p->GetNext()!=NULL)
	p=p->GetNext();
	p->SetNext(new Node(x));
}

void Link::Delete(int x)
{
	cout<<"刪除操作  ";
	if(Head->Getd()==x)
	{
	    Node *t=Head->GetNext();
	    delete(Head);
	    Head=t;
	}
	else
	{
		Node *t=Head;
		while(t->GetNext()->Getd()!=x)
		t=t->GetNext();
		Node *tf=t;
		t=t->GetNext();
		Node *t2=t->GetNext();
		tf->SetNext(t2);
		delete(t);
	}
}

void Link::Connect(Link&pl)
{
	Node *p=Head;
	Num+=pl.Num;
	while(p->GetNext()!=NULL)
	p=p->GetNext();
	Node *t=pl.Head; 
	while(t!=NULL)
	{
		p->SetNext(new Node(t->Getd()));
		p=p->GetNext();
		t=t->GetNext();
	}
}

Link::Link(Link&l)
{
	Num=l.Num;
	Node *p=l.GetHead();
	Head=new Node(p->Getd());
	p=p->GetNext();
	Node *t=Head;
	while(p!=NULL)
	{
		t->SetNext(new Node(p->Getd()));
		t=t->GetNext();
		p=p->GetNext();
	}
}

main.cpp
簡單測試類中函數的正確性

#include "Link.h"
#include "Node.h"
#include<iostream>
#include<algorithm>
using namespace std;
int main(int argc, char** argv)
{
	Link l1(2);
	Link l2(3);
	l2.LinkPrint();
	l1.Insert(5);
	l2.Delete(3);
	l2.Connect(l1);
	l2.LinkPrint();
	Link l3(l2);
	l3.LinkPrint();
	l3.Connect(l2);
	l3.LinkPrint();
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章