實驗二 單鏈表的實現
一、 實驗目的
1. 掌握線性表的連結儲存結構;
2. 驗證單鏈表及其基本操作的實現;
3. 進一步掌握資料結構及演算法的程式實現的基本方法。
二、 實驗內容。
1.根據課件關於單鏈表的定義,實現帶頭結點的單鏈表;
2.用頭插法(或尾插法)建立帶頭結點的單鏈表;
3.實現基本線性表的就地逆置reverse()方法,也就是將基本線性表中的資料元素交換位置排列,新的序列與原來的順序正好相反,比如原來序列“abcdef”,倒置後變為“fedcba”。
[提示]:把一個單鏈表斷開為兩個單鏈表,其中一個由first指標指向,只包含一個頭結點成為一個空表,另一個單鏈表由p指標指向,成為一個不帶頭結點單鏈表,接下來從p單鏈表中取出第一個元素插入first鏈表的頭部,直到p指向空為止。
4.用單鏈表格儲存體學生表格,測試資料如下:
5. A、建立空表,判斷表是否空
B、按順序插入資料 001
張三 2005 70
002
李四 2004 65
C、張三之後插入 003
王五 2005 80
張三之前插入 004
馬六 2006 90
李四之後插入 005
黃榮 2004 85
D、刪除第一條記錄
刪除最後一條記錄
E、尋找黃榮是否在表中,在則列印“存在記錄:005
黃榮 2004 85”,否則列印“不存在”
尋找郭清是否在表中,列印相應結果
F、列印表格記錄數,
G、列印整個表格
三、 實驗環境
1.pc機,windowsxp作業系統
2.VC++6.0軟體
四、 回答問題
1. 雙鏈表插入一個結點P的操作步驟是什嗎?
If(d==0){
newNode->lLink=current->lLink;
current->lLink-> rLink= newNode;
newNode->lLink->rLink=newNode;
newNode->rLink=current;
}
Else{
newNode->rLink=current->rLink;
current->rLink=newNode;
newNode->rLink->lLink=newNode;
newNode->lLink=current;
}
2. 雙鏈表的刪除一個結點P的操作的步驟是什嗎?
If(current==NULL)returnfalse;
Current->rLink->lLink=current->lLink;
Current->lLink->rLink=current->rLink;
X=current->data;deletecurrent;
#include<iostream>
using namespace std;
template<class T>
structLinkNode{
Tdata;
LinkNode<T>*link;
LinkNode(LinkNode<T>*ptr=NULL){link=ptr;}
LinkNode(constT&item,LinkNode<T> *ptr=NULL){data=item;link=ptr;}
};
template<class T>
class List{
public:
List(){first=new LinkNode<T>;}
List(const T& x){first=newLinkNode<T>(x);}
List(List<T>&L);
~List(){makeEmpty();}
void makeEmpty();
int Length()const;
LinkNode<T> *getHead()const{returnfirst;}
LinkNode<T> *seartch(T x);
LinkNode<T> *Locate(int i);
bool getData(int i ,T& x)const;
void setData(int i,T& x);
void Insert(T endTag);
bool Remove(int i,T& x);
bool IsEmpty()const{returnfirst->link==NULL?true:false;}
bool IsFull()const{return false;}
void input();
void output();
LinkNode<T> *reverse();
void move();
protected:
LinkNode<T> *first;
};
template<class T>
List<T>::List(List<T>&L)
{
Tvalue;
LinkNode<T>*srcptr=L.getHead();
LinkNode<T>*destptr=first=new LinkNode<T>;
while(srcptr->link!=NULL)
{
value=srcptr->link->data;
destptr->link=newLinkNode<T>(value);
destptr=destptr->link;
srcptr=srcptr->link;
}
destptr->link=NULL;
}
template<class T>
voidList<T>::makeEmpty()
{
LinkNode<T>*q;
while(first->link!=NULL)
{
q=first->link;
first->link=q->link;
delete q;
}
}
template<class T>
intList<T>::Length()const
{
LinkNode<T> *m=first->link;
int count=0;
while(p!=NULL)
{m=m->link;count++;}
return count;
}
template<class T>
LinkNode<T>*List<T>::seartch(T x)
{
LinkNode<T> *current=first->link;
while(currnet!=NULL)
if(current->data==x)break;
else current=current->link;
return current;
}
template<class T>
LinkNode<T>*List<T>::Locate(int i)
{
if(i<0)returnNULL;
LinkNode<T>*current=first;int k=0;
while(current!=NULL&&k<i)
{current=current->link;k++;}
returncurrent;
}
template<class T>
voidList<T>::setData(int i,T& x)
{
if(i<=0)return ;
LinkNode<T> *current=Locate(i);
if(current==NULL)return;
else current->data=x;
}
template<class T>
voidList<T>::Insert(T endTag)
{
LinkNode<T> *newNode,*last;
T val;
makeEmpty();
cin>>val;
last=first;
while(val!=endTag)
{
newNode=new LinkNode<T>(val);
if(newNode==NULL){cerr<<"wrong"<<endl;exit(1);}
last->link=newNode;last=newNode;
cin>>val;
}
last->link=NULL;
}
template<class T>
LinkNode<T>*List<T>::reverse()
{
/*LinkNode<T> *newNode ;T val;
makeEmpty();
cin>>val;
LinkNode<T> *p;
p=first->link;
while(val!='#')
{
newNode=new LinkNode<T>(val);
if(newNode==NULL)
{cerr<<"wrong"<<endl;exit(1);}
newNode->link=first->link;
first->link=newNode;
cin>>val;
}
*/
LinkNode<T> *p,*v1,*v2;
v2=first;
v1=NULL;
while( v2!=NULL ){
p=v2->link;
v2->link=v1;
v1=v2;
v2=p;
}
while(v1!=NULL)
{
cout<<v1->data;
v1=v1->link;
}
return v1;
}
template<class T>
voidList<T>::output()
{
LinkNode<T> *current=first->link;
while(current!=NULL)
{
cout<<current->data<<endl;
current=current->link;
}
}
voidmain()
{
List<char> l;
l.Insert('#');
l.output();
l.reverse();
l.output();
}