实验八泛型程序设计
软件1502 杨成进151303230
一、实验目的
1.了解链表类的定义与实现,学习其使用方法。
2.了解栈类的定义与实现,学习其使用方法。
3.了解队列类的定义与实现,学习其使用方法。
4.了解C++标准模板库STL的使用方法。
二、实验任务
1.编写程序link.h,实现教材中例9—6的链表类。在测试程序lab9—1.cpp中定义两个整型链表A和B,分别插入5个元素,然后把B中的元素加入A的尾部。
2.编写程序queue.h,用链表实现队列(或栈)类。在测试程序lab9—2.cpp中定义一个整型队列(或栈)对象,插入5个整数,压人队列(或栈),再依次取出并显示出来。
3.使用C++标准模板库(STL)中的双向队列类(deque)重新实现上一小题。
三、实验步骤
1.参照教材《C++语言程序设计》中链表类LinkeclI。ist的定义(教材中的例程9—6.h),给出其实现,注意合理使用NodIe类(教材中的例程9—3.h)的成员函数。在测试程序中定义整型链表A和B,分别插入5个元素,使用循环语句显示链表中的元素,然后把B中的元素加入A的尾部,再显示出来。
2.队列类的特点就是其元素的操作顺序为先入先出(FIFO),用上题中的链表类实现队列类,用链表类的成员函数实现队列的成员函数,在测试程序中定义一个整型队列对象,观察队列类中的元素先入先出的特点。
3.在程序中包含语句#include
四、实验程序
1、
#include "link.h"
int main()
{
LinkedList
for(int i=0;i<5;i++)
{
A.InsertRear(2*i+1);
B.InsertRear(2*i+2);
}
A.Reset();
cout <<"链表A的元素为:" ;
while(!A.EndOfList())
{
cout << A.Data() <<"";
A.Next();
}
cout << endl;
B.Reset();
cout <<"链表B的元素为:" ;
while(!B.EndOfList())
{
cout << B.Data() <<"";
B.Next();
}
cout << endl;
cout <<"把B中的元素插入A中..."<< endl;
B.Reset();
while(!B.EndOfList())
{
A.InsertRear(
B.Data());
B.Next();
}
A.Reset();
cout <<"此时,链表A的元素为:" ;
while(!A.EndOfList())
{
cout << A.Data() <<"";
A.Next();
}
cout << endl;
}
#ifndef LINKEDLIST_CLASS
#define LINKEDLIST_CLASS
#include
#include
using namespace std;
#ifndef NULL
const int NULL = 0;
#endif // NULL
#include "9-3.h
template
class LinkedList
{
private:
Node
Node
int size;
int position;
Node
void FreeNode(Node
void CopyList(const LinkedList
public:
LinkedList(const LinkedList
~LinkedList(void);
LinkedList
int ListSize(void) const;
int ListEmpty(void) const;
void Reset(int pos = 0);
void Next(void);
int EndOfList(void) const;
int CurrentPosition(void) const;
void InsertFront(const T& item);
void InsertRear(const T& item);
void InsertAt(const T& item);
void InsertAfter(const T& item);
T DeleteFront(void);
void DeleteAt(void);
T& Data(void);
void ClearList(void);
};
template
Node
Node
{
Node
p = new Node
if (p == NULL)
{
cout <<"Memory allocation failure!\n";
exit(1);
}
return p;
}
template
void LinkedList
{
delete p;
}
template
void LinkedList
Node
int pos;
while (p != NULL)
{
p = p->NextNode();
}
if (position == -1)
return;
prevPtr = NULL;
currPtr = front;
for (pos = 0; pos != position; pos++)
{
prevPtr = currPtr;
currPtr = currPtr->NextNode();
}
}
template
LinkedList
template
LinkedList
{
front = rear = NULL;
prevPtr = currPtr = NULL;
size = 0;
position = -1;
CopyList(L);
}
template
void LinkedList
{
Node
currPosition = front;
while(currPosition != NULL)
{
nextPosition = currPosition->NextNode();
FreeNode(currPosition);
currPosition = nextPosition;
}
front = rear = NULL;
prevPtr = currPtr = NULL;
size = 0;
position = -1;
}
template
LinkedList
ClearList();
}
template
LinkedList
if (this == &L)
return *this;
ClearList();
CopyList(L);
return *this;
}
template
int LinkedList
{
return size;
}
template
int LinkedList
{
return size == 0;
}
template
void LinkedList
{
if (currPtr != NULL)
{
prevPtr = currPtr;
currPtr = currPtr->NextNode();
position++;
}
}
template
int LinkedList
{
return currPtr == NULL;
}
template
int LinkedList
{
return position;
}
template
void LinkedList
int startPos;
if (front == NULL)
return;
if (pos < 0 || pos > size-1)
{
cerr <<"Reset: Invalid list position: "<< pos << endl;
return;
}
if(pos == 0)
{
prevPtr = NULL;
currPtr = front;
position = 0;
}
else
{
currPtr = front->NextNode();
prevPtr = front;
startPos = 1;
for(position=startPos; position != pos; position++) {
prevPtr = currPtr;
currPtr = currPtr->NextNode();
}
}
}
template
T& LinkedList
{
if (size == 0 || currPtr == NULL)
{
cerr <<"Data: invalid reference!"<< endl;
exit(1);
}
return currPtr->data;
}
template
void LinkedList
{
if (front != NULL)
Reset();
InsertAt(item);
}
template
void LinkedList
Node
prevPtr = rear;
newNode = GetNode(item);
if (rear == NULL)
front = rear = newNode;
else
{
rear->InsertAfter(newNode);
rear = newNode;
}
currPtr = rear;
position = size;
size++;
}
template
void LinkedList
Node
if (prevPtr == NULL)
{
newNode = GetNode(item,front);
front = newNode;
}
else
{
newNode = GetNode(item);
prevPtr->InsertAfter(newNode);
}
if (prevPtr == rear)
{
rear = newNode;
position = size;
}
currPtr = newNode;
size++;
}
template
void LinkedList
Node
p = GetNode(item);
if (front == NULL)
{
front = currPtr = rear = p;
position = 0;
}
else
{
if (currPtr == NULL)
currPtr = prevPtr;
currPtr->InsertAfter(p);
if (currPtr == rear)
{
rear = p;
position = size;
}
else
position++;
prevPtr = currPtr;
currPtr = p;
}
size++;
}
template
T LinkedList
T item;
Reset();
if (front == NULL)
{
cerr <<"Invalid deletion!"<< endl;
exit(1);
}
item = currPtr->data;
DeleteAt();
return item;
}
template
void LinkedList
Node
if (currPtr == NULL)
{
cerr <<"Invalid deletion!"<< endl;
exit(1);
}
if (prevPtr == NULL)
{
p = front;
front = front->NextNode();
}
else
p = prevPtr->DeleteAfter();
if (p == rear)
{
rear = prevPtr;
position--;
}
currPtr = p->NextNode();
FreeNode(p);
size--;
}
#endif
2、
#ifndef QUEUE_CLASS
#define QUEUE_CLASS
#include
#include
using namespace std;
#include "link.h"
template
class Queue
{
private:
LinkedList
public:
Queue(void);
void QInsert(const T& elt);
T QDelete(void);
T QFront(void);
int QLength(void) const;
int QEmpty(void) const;
void QClear(void);
};
template
Queue
{}
template
int Queue
{
return queueList.ListSize();
}
template
int Queue
{
return queueList.ListEmpty();
}
template
void Queue
{
queueList.ClearList();
}
template
void Queue
{
queueList.InsertRear(elt);
}
template
T Queue
{
if (queueList.ListEmpty())
{
cerr <<"Calling QDelete for an empty queue!"<< endl;
exit(1);
}
return queueList.DeleteFront();
}
template
T Queue
{
if (queueList.ListEmpty())
{
cerr <<"Calling QFront for an empty queue!"<< endl;
exit(1);
}
queueList.Reset();
return queueList.Data();
}
#endif
#ifndef LINKEDLIST_CLASS
#define LINKEDLIST_CLASS
#include
#include
using namespace std;
#ifndef NULL
const int NULL = 0;
#endif
#include "9-3.h"
template
class LinkedList
{
private:
Node
Node
int size;
int position;
Node
void FreeNode(Node
void CopyList(const LinkedList
public:
LinkedList(void);
LinkedList(const LinkedList
~LinkedList(void);
LinkedList
int ListSize(void) const;
int ListEmpty(void) const;
void Reset(int pos = 0);
void Next(void);
int EndOfList(void) const;
int CurrentPosition(void) const;
void InsertFront(const T& item);
void InsertRear(const T& item);
void InsertAt(const T& item);
void InsertAfter(const T& item);
T DeleteFront(void);
void DeleteAt(void);
T& Data(void);
void ClearList(void);
};
template
Node
Node
p = new Node
if (p == NULL)
{
cout <<"Memory allocation failure!\n";
exit(1);
}
return p;
}
template
void LinkedList
{
delete p;
}
template
void LinkedList
Node
int pos;
while (p != NULL)
{
InsertRear(p->data);
p = p->NextNode();
}
if (position == -1)
return;
prevPtr = NULL;
currPtr = front;
for (pos = 0; pos != position; pos++)
{
prevPtr = currPtr;
currPtr = currPtr->NextNode();
}
}
template
LinkedList
template
LinkedList
{
front = rear = NULL;
prevPtr = currPtr = NULL;
size = 0;
position = -1;
CopyList(L);
}
template
void LinkedList
{
Node
currPosition = front;
while(currPosition != NULL)
{
nextPosition = currPosition->NextNode();
FreeNode(currPosition);
currPosition = nextPosition;
}
front = rear = NULL;
prevPtr = currPtr = NULL;
size = 0;
position = -1;
}
template
LinkedList
{
ClearList();
}
template
LinkedList
(const LinkedList
if (this == &L)
return *this;
ClearList();
CopyList(L);
return *this;
}
template
int LinkedList
{
return size;
}
template
int LinkedList
{
return size == 0;
}
template
void LinkedList
{
if (currPtr != NULL)
{
prevPtr = currPtr;
currPtr = currPtr->NextNode();
position++;
}
}
template
int LinkedList
{
return currPtr == NULL;
}
template
int LinkedList
{
return position;
}
template
void LinkedList
{
int startPos;
if (front == NULL)
return;
if (pos < 0 || pos > size-1)
{
cerr <<"Reset: Invalid list position: "<< pos << endl;
return;
}
if(pos == 0)
{
prevPtr = NULL;
currPtr = front;
position = 0;
}
else
{
currPtr = front->NextNode();
prevPtr = front;
startPos = 1;
for(position=startPos; position != pos; position++) {
prevPtr = currPtr;
currPtr = currPtr->NextNode();
}
}
}
template
T& LinkedList
{
if (size == 0 || currPtr == NULL)
{
cerr <<"Data: invalid reference!"<< endl;
exit(1);
}
return currPtr->data;
}
template
void LinkedList
if (front != NULL)
Reset();
InsertAt(item);
}
template
void LinkedList
Node
prevPtr = rear;
newNode = GetNode(item);
if (rear == NULL)
front = rear = newNode;
else
{
rear->InsertAfter(newNode);
rear = newNode;
}
currPtr = rear;
position = size;
size++;
}
template
void LinkedList
Node
if (prevPtr == NULL)
{
newNode = GetNode(item,front);
front = newNode;
}
else
{
newNode = GetNode(item);
prevPtr->InsertAfter(newNode);
}
if (prevPtr == rear)
{
rear = newNode;
position = size;
}
currPtr = newNode;
size++;
}
template
void LinkedList
Node
p = GetNode(item);
if (front == NULL)
{
front = currPtr = rear = p;
position = 0;
}
else
{
if (currPtr == NULL)
currPtr = prevPtr;
currPtr->InsertAfter(p);
if (currPtr == rear)
{
rear = p;
position = size;
}
else
position++;
prevPtr = currPtr;
currPtr = p;
}
size++;
}
template
T LinkedList
{
T item;
Reset();
if (front == NULL)
{
cerr <<"Invalid deletion!"<< endl;
exit(1);
}
item = currPtr->data;
DeleteAt();
return item;
}
template
void LinkedList
Node
if (currPtr == NULL)
{
cerr <<"Invalid deletion!"<< endl;
exit(1);
}
if (prevPtr == NULL)
{
p = front;
front = front->NextNode();
}
else
p = prevPtr->DeleteAfter();
if (p == rear)
{
rear = prevPtr;
position--;
}
currPtr = p->NextNode();
FreeNode(p);
size--;
}
#endif // LINKEDLIST_CLASS
#include "queue.h"
int main()
{
Queue
for(int i=0;i<5;i++)
{
A.QInsert(2*i+1);
}
cout <<"队列A的元素为:" ;
while(!A.QEmpty())
{
cout << A.QFront() <<"";
A.QDelete();
}
cout << endl;
}
4、
5、
#include
#include "array1.h"
using namespace std;
int main()
{
Array
int i,k;
int SortType;
int SearchNum;
cout <<"请输入10个整数"<< endl;
for(i=0;i<10;i++)
{
cout <<"输入第"<< i+1 <<"个数字:";
cin >> A[i];
}
cout <<"输入的数组为:"<< endl;
for(i=0;i<10;i++)
cout << A[i] <<"";
cout << endl;
cout <<"请选择排序方法:1.直接插入排序2.直接选择排序3.冒泡排序:" ;
cin >> SortType;
switch(SortType)
{
case 1:
A.InsertionSort();
break;
case 2:
A.SelectionSort();
break;
case 3:
A.BubbleSort();
break;
default:
cout <<"输入错误,程序退出!";
exit(0);
}
cout <<"排序后的数组为:"<< endl;
for(i=0;i<10;i++)
cout << A[i] <<"";
cout << endl;
cout <<"请输入待查找的数字:";
cin >> SearchNum;
k= A.SeqSearch(SearchNum);
if (k<0)
cout <<"没有找到数字"<< SearchNum << endl;
else
cout << SearchNum <<"是第"<< k+1 <<"个数字"<< endl; }
#ifndef ARRAY1_CLASS
#define ARRAY1_CLASS
#include
#include
using namespace std;
#ifndef NULL
const int NULL = 0;
#endif
enum ErrorType
{invalidArraySize, memoryAllocationError, indexOutOfRange}; char *errorMsg[] =
{
"Invalid array size", "Memory allocation error",
"Invalid index: "
};
template
class Array
{
private:
T* alist;
int size;
void Error(ErrorType error,int badIndex=0) const;
public:
Array(int sz = 50);
Array(const Array
~Array(void);
Array
T& operator[](int i);
operator T* (void) const;
int ListSize(void) const;
void Resize(int sz);
void InsertionSort();
void SelectionSort();
void BubbleSort();
int SeqSearch(T key);
};
template
void Array
cerr << errorMsg[error];
if (error == indexOutOfRange)
cerr << badIndex;
cerr << endl;
exit(1);
}
template
Array
{
if (sz <= 0)
Error(invalidArraySize);
size = sz;
alist = new T[size];
if (alist == NULL)
Error(memoryAllocationError);
}
template
Array
{
delete [] alist;
}
template
Array
{
int n = X.size;
size = n;
alist = new T[n];
if (alist == NULL)
Error(memoryAllocationError);
T* srcptr = X.alist;
T* destptr = alist;
while (n--)
*destptr++ = *srcptr++;
}
template
实验一熟悉C程序运行环境 班级学号成绩 一、实验目的 1. 熟悉C语言Visual C++6.0调试环境。 2. 掌握C程序的编辑、调试及运行。 二、实验内容 项目1. 调试并运行下面程序,并写出运行结果: #include
项目3. 调试并运行下面程序,并写出运行结果: #include
说明 每个实验做完以后,按照实验报告模板格式完成相应的实验报告,存储为word 文档,最终提交的实验文档数量种类和命名原则如下例:(不按要求 者拒收) 目录结构图目录实验 1 内的文件种类和命名原则实验报告成绩将作为平时成绩的一部分计算到期末总成绩中。 实验报告严禁相互抄袭,一经发现抄袭和被抄袭者本次实验按零分计算!
实验1 C 的实验环境和C 语言的数据类型 1. 实验目的 ⑴ 了解在具体的语言环境下如何编辑、编译、连接和运行一个C 程序。 ⑵ 通过运行简单的C 程序,初步了解C 源程序的特点。 ⑶ 掌握C 语言数据类型, 熟悉如何定义一个整型、字符型和实型的变量,以及对它 们赋值的方法。 ⑷ 掌握不同的类型数据之间赋值的规律。 ⑸ 学会使用C 的有关算术运算符,以及包含这些运算符的表达式,特别是自加(+ +)和自减(--)运算符的使用。 2. 实验内容和步骤 检查所用的计算机系统是否已安装了C 编译系统并确定他所在的子目录。 进入所用的集成环境。 熟悉集成环境的界面和有关菜单的使用方法。 输入并运行一个简单的、正确的程序。 3. 实验题目 输入下面的程序 # include "stdio.h" void main() { printf( "This is a c program.\n" ); } 程序无误,其运行的结果为:(请填写) ⑵ 输入并编辑一个有错误的 C 程序。 # include “ stdio.h ” void main() { int a,b,sum a=123; b=456; sum=a+b print( “ suism%d n” ,sum); } 运行后程序出现几处错误,请分别指出,并逐一更改: ⑶ 若k,g 均为int 型变量, 则下列语句的输出为, : # include "stdio.h" void main() { int k, g; k=017; g=111;
1.1习题1解答 1. (1)机器语言是计算机直接理解执行的语言,由一系列(二进制)指令组成,其助记符构成了汇编语言;接近人的自然语言习惯的程序设计语言为高级语言。 (2)结构化程序设计方法主要内容有:自顶向下,逐步求精;面向对象方法将现实世界中的客观事物描述成具有属性和行为的对象,抽象出共同属性和行为,形成类。 (3)C++程序开发通常要经过5个阶段,包括:编辑,编译,连接,运行,调试。首先是编辑阶段,任务是编辑源程序,C++源程序文件通常带有.c p p扩展名。接着,使用编译器对源程序进行编译,将源程序翻译为机器语言代码(目标代码),过程分为词法分析、语法分析、代码生成3个步骤。 在此之前,预编译器会自动执行源程序中的预处理指令,完成将其他源程序文件包括到要编译的文件中,以及执行各种文字替换等。 连接器的功能就是将目标代码同缺失函数的代码连接起来,将这个“漏洞”补上,生成可执行文件。程序运行时,可执行文件由操作系统装入内存,然后CPU从内存中取出程序执行。若程序运行进程中出现了错误,还在需要对程序进行调试。 (4)对象与对象之间通过消息进行相互通信。 (5)类是具有相同属性和行为的一组对象的抽象;任何一个对象都是某个类的一个实例。(6)多态性是指在一般类中定义的属性或行为,被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为。 (7)面向对象的软件开发过程主要包括面向对象的方法分析、面向对象的设计、面向对象的编程、面向对象的测试和面向对象的维护。 (8)泛型程序设计是指在程序设计时,将数据类型参数化,编写具有通用性和可重用的程
序。 (9)#include
《C程序设计基础》实验指导 实验1 C程序的设计环境和运行方法 【实验目的】 1.熟悉所用计算机系统的基本操作方法。 2.学习Turbo C 2.0的使用方法,掌握程序编辑、编译、连接、运行及查看运行结果的方法。 3.掌握C程序的基本结构。 【实验内容】 1.熟悉使用的计算机系统的基本操作,创建自己的工作目录,参照附录中介绍的方法,掌握Turbo C 2.0的启动方法(一种或多种),了解Turbo C 2.0系统的安装路径和结构。2.进入Turbo C 2.0的工作环境,参照附录设置环境,用File/Change dir…设置当前工作目录、用Options/Directories设置系统的安装路径、包含文件路径、标准库文件路径、输出文件路径和源文件路径。 3.熟悉Turbo C 2.0的系统菜单组成及功能。学习使用功能键和快捷键调用菜单项的方法。 掌握文件建立、编辑、修改和保存的方法。落实文件的存储位置是否是你的工作目录,如果不是,回第二步重新设置。了解编译、连接和运行命令在屏幕菜单项的位置和调用方法。 4.输入并运行下面最简单的C程序 ①使用File菜单的New命令创建一个新文件。 ②在编辑区输入下面程序: #include
《面向对象程序设计》习题 第8章泛型编程 一、选择题(共40分,每题2分) 二、填空题(共20分,每空2分) 1. 逻辑数据类型 2. 函数类 3. 函数模板类模板 4.函数类型形参类型 5.2 6. 尖括号 三、下列程序有2个错,找出并修改(共6分) 错1:public: A(T a, b) // A(T a,T b) {x=a,y=b;s=x+y;} 错2: int main() { A add(10,100); // A