实验二 单链表的实现

本文介绍单链表的实现方法,包括带头结点的单链表创建、使用头插法或尾插法建立单链表,以及实现线性表的就地逆置功能。此外,还提供了一个具体的学生信息表的增删查改示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验二   单链表的实现

一、   实验目的

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

 

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值