链表及应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验十九链表及应用

一、实验目的

1.理解线性表的第二类形式——链表的构成。

2.掌握链表的算法编程与应用,包括构造链表、查找结点、插入结点、删除结点和对链表排序等基本操作。

二、实验内容

1.编程:修改主教材例7.6,数据由文本文件导入。

2. 范例:修改单链表模板类,使结点类的数据域改为数据类对象的指针。要求为该单链表模板类建立深复制函数,这需要结点类和学生类的复制构造函数均为深复制。其中学生类的深复制是调用string类的复制构造函数完成的,直接用默认的,同样析构函数也不要重编。

并据此建立一个学生链表,原始数据放在文本文件EXP19_2.txt中。

新的单链表模板类如下:

//文件Exp19_2.h

#include

using namespace std;

//链表结点采用结点类,凡与结点数据和指针操作有关函数作为成员函数

templateclass List;

templateclass Node{

T* info; //数据域

Node *link; //指针域

public:

Node(){info=NULL;link=NULL;} //生成头结点的构造函数

Node(const T & data){ //生成一般结点的构造函数

info=new T(data);

link=NULL;

}

Node(Node &); //复制构造函数

~Node(){delete info;}

void InsertAfter(Node* P); //在当前结点后插入一个结点

Node* RemoveAfter(); //删除当前结点的后继结点,返回该结点备用friend class List;

//以List为友元类,List可直接访问Node的私有函数,与结构一样方便,但更安全

};

template Node::Node(Node & node){ //复制构造函数

info=new T(*);

link=NULL;

}

templatevoid Node::InsertAfter(Node* p){

p->link=link;

link=p;

}

templateNode* Node::RemoveAfter(){

Node* tempP=link;

if(link==NULL) tempP=NULL; //已在链尾,后面无结点

else link=tempP->link;

return tempP;

}

//再定义链表类,选择常用操作:包括建立有序链表、搜索、插入、删除、取数据等templateclass List{

Node *head,*tail;//链表头指针和尾指针

public:

List(){head=tail=new Node();} //构造函数,生成头结点(空链表)

List(List & ls); //复制构造函数

~List(); //析构函数

void MakeEmpty(); //清空一个链表,只余表头结点

Node* Find(T data); //搜索数据域与data相同的结点,返回该结点的地址int Length(); //计算单链表长度

void PrintList(); //打印链表的数据域

void InsertFront(Node* p); //可用来向前生成链表,在表头插入一个结点void InsertRear(Node* p); //可用来向后生成链表,在表尾添加一个结点void InsertOrder(Node *p); //按升序生成链表

Node*CreatNode(T data); //创建一个结点(孤立结点)

Node*DeleteNode(Node* p); //删除指定结点

};

templateList::List(List & ls){ //复制构造函数

Node* TempP=ls.head->link,*P1;

head=tail=new Node();

while(TempP!=NULL){

P1=new Node(*TempP);//或仅初始化数据域,P1=new Node(*TempP->info)

P1->link=tail->link; //向后生成list1

tail->link=P1;

tail=P1;

TempP=TempP->link;

}

}

templateList::~List(){

MakeEmpty();

delete head;

}

templatevoid List::MakeEmpty(){

Node *tempP;

while(head->link!=NULL){

tempP=head->link;

相关文档
最新文档