實驗講義
一、實驗目的
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;
}