题目

参照教材中链表类LinkedList的定义(教材中的例程9-6.h),给出其实现,注意合理使用Node类(教材中的例程9-3.h)的成员函数。在测试程序中定义整型链表A和B,分别插入5个元素,使用循环语句显示链表中的元素,然后把B中的元素加入A的尾部,再显示出来。

C++代码如下:

//node.h

//node.h
#ifndef NODE_H//结点类模板
#define NODE_H
template<class T>
class linkedlist;//新添
template<class T>//新添
class node
{private:node<T>* next;//指向后继指针的结点
public:T data;//数据域node(const T& data, node<T>* next = 0);//构造函数void insertAfter(node<T>* p);//在本结点之后插入一个同类的结点Pnode<T>* deleteAfter();//删除本结点的后继结点,并返回其地址node<T>* nextNode();//获取后继结点的地址const node<T>* nextNode()const;//获取后继结点的地址friend linkedlist<T>;//因操作需要将linkedlist<T>作为node的友元(新添)
};
template<class T>
node<T>::node(const T& data, node<T>* next/*=0*/) :data(data), next(next)
{}
template<class T>
node<T>* node<T>::nextNode()
{return next;
}
template<class T>
const node<T>* node<T>::nextNode()const
{return next;
}
template<class T>
void node<T>::insertAfter(node<T>* p)
{p->next = next;next = p;
}
template<class T>
node<T>* node<T>::deleteAfter()
{node<T>* tempPtr = next;if (next == 0)return 0;next = tempPtr->next;return tempPtr;
}
#endif

//link.h

//link.h
#ifndef LINKEDLIST_H
#define LINKEDLIST_H
#include<iostream>
using namespace std;
#include "node.h"
template<class T>
class linkedlist
{private:node<T>* front, * rear;//表头和表尾指针node<T>* prevPtr, * currPtr;//记录表当前遍历位置的指针,由插入和删除操作更新int size;//表中的元素个数int position;//当前元素在表中的位置序号,由函数reset使用//函数成员://生成新结点,数据域为item,指针域为ptrNextnode<T>* nextNode(const T& item, node<T>* ptrNext = NULL);void freeNode(node<T>* p);//释放结点                                     (未用)//将链表L复制到当前表(假设当前表为空)//被复制构造函数和“operator=”调用void copy(linkedlist<T>& L);//(因实现需要,无法使用(linkedlist<T>const&L)作为形参表)
public:void print();//打印链表类里的数据及其数目(新添)linkedlist();linkedlist(linkedlist<T>& L);//复制构造函数(因实现需要,无法使用(linkedlist<T>const&L)作为形参表)~linkedlist();linkedlist<T>& operator=(linkedlist<T>& L);//重载赋值运算符(因实现需要,无法使用(linkedlist<T>const&L)作为形参表)int getSize()const;//返回链表中的元素个数bool isEmpty()const;//链表是否为空                                      (未用)void reset(int pos = 0);//初始化游标的位置(第一位数的位置设为0)void next();//使游标移动到下一个结点bool endOfList()const;//游标是否到了链尾int currentPosition(void);//返回游标当前的位置void insertFront(const T& item);//在表头插入结点void insertRear(const T& item);//在表尾添加结点void insertAt(const T& item);//在当前结点之前插入结点void insertAfter(const T& item);//在当前结点之后插入结点T deleteFront();//删除头结点void deleteCurrent();//删除当前结点T& data();//返回对当前结点成员数据的引用const T& data()const;//返回对当前结点成员数据的常引用//清空链表:释放所有结点的内存空间。被析构函数和“operator ="调用void clear();
};
template<class T>
node<T>* linkedlist<T>::nextNode(const T& item, node<T>* ptrNext)//生成新结点,数据域为item,指针域为ptrNext
{node<T>* tempPtr = new node<T>(item, ptrNext);return tempPtr;
}
template<class T>
void linkedlist<T>::freeNode(node<T>* p)//释放结点
{delete p;
}
template<class T>
void linkedlist<T>::print()//打印链表类里的数据及其数目(新添)
{reset();while (!endOfList()){cout << data() << " ";next();}cout << endl;cout << "size=" << getSize() << endl;
}
template<class T>
linkedlist<T>::linkedlist()//构造函数
{size = 0;front = rear = new node<T>(0);currPtr = prevPtr = front;
}
template<class T>
int linkedlist<T>::currentPosition(void)//返回游标当前的位置
{node<T>* tempPtr = front->nextNode();position = 0;while (tempPtr != currPtr){tempPtr = tempPtr->nextNode();position++;}return position;
}template<class T>
int linkedlist<T>::getSize()const//返回链表中的元素个数
{return size;
}template<class T>
T& linkedlist<T>::data()//返回对当前结点成员数据的引用
{return currPtr->data;
}
template<class T>
const T& linkedlist<T>::data()const//返回对当前结点成员数据的常引用
{return currPtr->data;
}
template<class T>
void linkedlist<T>::next()//使游标移动到下一个结点
{prevPtr = currPtr;currPtr = currPtr->nextNode();
}
template<class T>
bool linkedlist<T>::endOfList()const//游标是否到了链尾
{if (currPtr == NULL)return true;else return false;
}
template<class T>
bool linkedlist<T>::isEmpty()const//链表是否为空
{if (front == rear)return true;else return false;
}
template<class T>
void linkedlist<T>::reset(int pos)//初始化游标的位置(第一位数的位置设为0)
{prevPtr = front;currPtr = front->nextNode();position = pos;for (int i = 0; i < position; i++){prevPtr = currPtr;currPtr = currPtr->nextNode();}
}
template<class T>
void linkedlist<T>::insertFront(const T& item)//在表头插入结点
{prevPtr = currPtr;currPtr = nextNode(item, front->nextNode());front->next = currPtr;if (rear == front){rear = currPtr;}size++;
}
template<class T>
void linkedlist<T>::insertRear(const T& item)//在表尾添加结点
{prevPtr = currPtr;currPtr = nextNode(item, rear->nextNode());rear->next = currPtr;rear = currPtr;size++;
}
template<class T>
void linkedlist<T>::insertAfter(const T& item)//在当前结点之后插入结点
{prevPtr = currPtr;node<T>* tempPtr = nextNode(item, currPtr->nextNode());currPtr->next = tempPtr;if (currPtr == rear){rear = tempPtr;}currPtr = tempPtr;size++;}
template<class T>
void linkedlist<T>::insertAt(const T& item)//在当前结点之前插入结点
{currPtr = nextNode(item, prevPtr->nextNode());prevPtr->next = currPtr;size++;
}
template<class T>
T linkedlist<T>::deleteFront()//删除头结点
{currPtr = front->nextNode();delete front;front = currPtr;size--;return front->data;
}
template<class T>
void linkedlist<T>::deleteCurrent()//删除当前结点
{node<T>* tempPtr = currPtr;prevPtr->deleteAfter();delete currPtr;currPtr = prevPtr;size--;
}
template<class T>
void linkedlist<T>::clear()//清空链表:释放所有结点的内存空间。被析构函数和“operator ="调用
{node<T>* tempPtr = front->nextNode();while (tempPtr != NULL){node<T>* tempQ = tempPtr;tempPtr = tempPtr->nextNode();delete tempQ;size--;}rear = front;currPtr = prevPtr = front;
}
template<class T>
linkedlist<T>::~linkedlist()//析构函数
{clear();delete front;
}
template<class T>
void linkedlist<T>::copy(linkedlist<T>& L)//将链表L复制到当前表(假设当前表为空)被复制构造函数和“operator=”调用
//(因实现需要,无法使用(linkedlist<T>const&L)作为形参表)
{//clear();L.reset();for (int i = 0; i < L.size; i++){insertRear(L.data());L.next();}}
template<class T>
linkedlist<T>& linkedlist<T>::operator =(linkedlist<T>& L)//重载赋值运算符(因实现需要,无法使用(linkedlist<T>const&L)作为形参表)
{clear();front->next = NULL;copy(L);cout << "调用重载运算符=" << endl;return *this;
}
template<class T>
linkedlist<T>::linkedlist(linkedlist<T>& L)//复制构造函数(因实现需要,无法使用(linkedlist<T>const&L)作为形参表)
{size = 0;front = rear = new node<T>(0);currPtr = prevPtr = front;copy(L);cout << "调用复制构造函数" << endl;
}
#endif

//lab9_1.cpp

//lab9_1.cpp
#include<iostream>
#include"link.h"
using namespace std;
int main()
{linkedlist<int>A, B;cout << "Please enter 5 numbers of A"<<endl;for (int i = 0; i < 5; i++){int item;cin >> item;A.insertFront(item);}cout << "Please enter 5 numbers of B"<<endl;for (int i = 0; i < 5; i++){int item;cin >> item;B.insertFront(item);}cout << "The list A:" << endl;A.reset();while (!A.endOfList()){cout << A.data() << " ";A.next();}cout << endl;cout << "The list B:" << endl;B.reset();while (!B.endOfList()){cout << B.data() << " ";B.next();}cout << endl;cout << "Insert elements from B into A" << endl;B.reset();while (!B.endOfList()){A.insertRear(B.data());B.next();}cout << "Now,the list A:" << endl;A.reset();while (!A.endOfList()){cout << A.data() << " ";A.next();}cout << endl;return 0;
}

实验8.1 链表类的定义与实现相关推荐

  1. 实验8.2 队列类的定义与实现

    题目 编写程序queue.h,用链表实现队列(或栈)类.在测试程序lab9_2.cpp中定义一个整型队列(或栈)对象,插入5个整数,压入队列(或栈),再依次取出并显示出来. C++代码如下: //no ...

  2. java实验:银行账户类的定义与使用

    内容要求: 一.实验目的 (1)理解对象和类,掌握用类创建对象模型. (2)理解和掌握抽象类的使用 (3)理解和掌握继承.方法覆盖的使用 (4)初步掌握使用多态性的方法 二.实验内容 按照如下步骤完成 ...

  3. SCAU 银行账户类的定义与使用

    随堂实验6 银行账户类的定义与使用 题目类别: C实验 关键字: 继承 覆盖 内容要求: 按照以下步骤的要求编写程序,实现银行账户类的定义. 步骤1:定义一个名为Account的抽象类代表一个银行账户 ...

  4. 数据结构课本学习 --单链表类定义

    单链表的类定义: 复合类: class List;class LinkNode{ //结点类定义 friend class List; //List类所有成员可以使用LinkNode的私有成员,反过来 ...

  5. Java实验实现一个circle类,java实验报告-类的定义.doc

    java实验报告-类的定义 南京理工大学泰州科技学院 实验报告书 课程名称: <JAVA面向对象程序设计> 实验题目: 实验三 类的定义 班 级: 09计算机(2) 学 号: 090903 ...

  6. java数组使用实验报告_JAVA数组与类的定义-java实验报告

    JAVA数组与类的定义-java实验报告 JAVA数组与类的定义-java实验报告 .实验目的与要求 1. 熟悉Java类.对象和方法的一般操作练习等. 2. 熟悉数组等的定义和使用. 二.实验内容及 ...

  7. C++ 实验2:函数重载、函数模板、简单类的定义和实现

    1.函数重载编程 编写重载函数add(),实现对int型,double型,Complex型数据的加法.在main()函数中定义不同类型 数据,调用测试. #include <iostream&g ...

  8. java实验:正n多边形类的定义与使用

    一.实验目的 (1)理解对象和类,掌握用类创建对象模型. (2)理解和掌握数据域封装,可见性修饰符的使用 (3)学习如何定义类和创建对象,理解对象引用变量的概念. (4)理解构造方法的作用,并使用构造 ...

  9. 模拟STL链表类的实现

    模拟STL链表类的实现 STL内部定义了多种容器和迭代器,方便了数据结构类的使用,且不需关注内部源码.为了方便个人使用习惯,我又重写了一个链表类,作为学C++后的第一个项目作业.我将其命名为clist ...

最新文章

  1. 简单轻松学 Linux 之 awk
  2. Linux运维系统工程师系列---16
  3. 使用SVCUtil.exe生成客户端代理类和配置文件
  4. java 时间轮算法_时间轮算法(TimingWheel)是如何实现的?
  5. 云原生时代,企业多活容灾体系构建思路与最佳实践
  6. MySQL数据库优化技巧(二)
  7. matlab求固有频率,eig()函数求固有频率和有限元软件求固有频率结果不相等
  8. java gc回收区域_java内存区域以及GC回收
  9. SAP Cloud for Customer的Calculated field字段
  10. Apache2.2.8、php5.2.6、mysql5、phpMyAdmin2.11.6在Windows 下的安装和配置
  11. crowd counting_[crowd_counting]-SFANet-arxiv1902
  12. css中的滤镜,CSS中的filter(滤镜)属性
  13. 【听课笔记】复旦大学遗传学_07基因表达调控
  14. USACO 2019 February Contest Platinum T3: Mowing Mischief
  15. qt编写的mask遮罩的半透明涂抹功能
  16. cocos 躲避球游戏(2) --资源导入和碰撞检测
  17. 鲜为人知 的 人名典故
  18. 20款免费的WordPress企业站主题下载
  19. ruby-下载图片,根据图片URL下载到本地
  20. mysql导入表空间太慢_Oracle 11g统计表空间使用率很慢

热门文章

  1. Intel vt-d技术资料收集
  2. Path.GetExtension 方法
  3. android客户端设置,android客户端设置界面开发实例
  4. Sharepoint 自定义搜索
  5. @WebFilter()配置servlet访问出现404的原因
  6. Oracle 11.2.0.4.0 Dataguard部署和日常维护(7) - Dataguard Flashback篇
  7. Python练习-内置函数的应用
  8. 良好的开端是成功的第一步———构建程序
  9. How to recover from root.sh on 11.2 Grid Infrastructure Failed
  10. 诗歌rails之Hacking ActiveRecord