實驗二 單鏈表的實現

來源:互聯網
上載者:User

實驗二   單鏈表的實現

一、   實驗目的

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();

 

}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.