实验二 单链表的实现
一、 实验目的
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();
}