实验4-群体类和群体数据---吕恩在_第1页
实验4-群体类和群体数据---吕恩在_第2页
实验4-群体类和群体数据---吕恩在_第3页
实验4-群体类和群体数据---吕恩在_第4页
实验4-群体类和群体数据---吕恩在_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、学校代码: 学 号: 面向对象程序设计实验报告(题 目:群体类和群体数据学生姓名:学 院:系 别:专 业:班 级:任课教师: 二一五年十二月群体类和群体数据一、 实验目的1. 了解节点类的声明和实现,学习其使用方法2. 了解链表类的声明和实现,学习其使用方法3. 了解栈类的声明和实现,学习其使用方法4. 了解队列类的声明和实现,学习其使用方法5. 掌握对数组元素排序的方法6. 掌握对数组元素查找的方法二、实验任务1.编写程序Node.h实现例9-5的节点类,并编写测试程序lab9_1.cpp,实现链表的基本操作2.编写程序link.h实现例9-6的链表类,在测试程序lab_2.cpp中声明两个

2、整型链表A和B,分别插入5元素,然后把B中的元素加入A的尾部3.编写程序queue.h,用链表实现队列(或栈),在测试程序lab9_3.cpp中声明一个整型队列(或栈)对象,插入5个整数,压入队列(或栈),再依次取出并显示出来。4.(选做)声明course(课程)类,有属性:课程名char name21、成绩short score;在实验七的student类中增加属性;所修课程course,为课程类对象的链表。在测试程序中测试这个类,学生类与课程类关系如图5. 将直接插入排序、直接选择排序、冒泡排序、顺序查找函数封装到第九章的数组类中,作为成员函数,实现并测试这个类三、实验内容:1. /9-5

3、.h#ifndef NODE_CLASS#define NODE_CLASStemplate class Node private: Node *next; /指向后继节点的指针 public: T data; /数据域 Node (const T& item, Node* ptrnext = NULL); void InsertAfter(Node *p); Node *DeleteAfter(void); Node *NextNode(void) const;template Node:Node(const T& item, Node* ptrnext) : data(item), nex

4、t(ptrnext) template Node *Node:NextNode(void) const return next;template void Node:InsertAfter(Node *p) p-next = next; /p节点指针域指向当前节点的后继节点 next = p; /当前节点的指针域指向ptemplate Node *Node:DeleteAfter(void)Node *tempPtr = next; /将欲删除的节点地址存储到tempPtr中 if (next = NULL) /如果当前节点没有后继节点,则返回NULL return NULL; next =

5、tempPtr-next; /使当前节点的指针域指向tempPtr的后继节点 return tempPtr; /返回被删除的节点的地址#endif / NODE_CLASS/Node.h#ifndef NODE_LIBRARY#define NODE_LIBRARY#include #include #include 9_5.husing namespace std;template Node *GetNode(const T& item, Node *nextPtr = NULL) Node *newNode; newNode = new Node(item, nextPtr); if (n

6、ewNode = NULL) /如果分配内存失败,程序中止 cerr Memory allocation failure! endl; exit(1); return newNode;enum AppendNewline noNewline,addNewline;template void PrintList(Node *head, AppendNewline addnl = noNewline) Node *currPtr = head; while(currPtr != NULL) if(addnl = addNewline) cout data endl; else cout data

7、NextNode(); template int Find(Node *head, T& item, Node* &prevPtr) Node *currPtr = head; /从第一个结点开始遍历 prevPtr = NULL; while(currPtr != NULL) if (currPtr-data = item) return 1; prevPtr = currPtr; /记录下当前结点的地址 currPtr = currPtr-NextNode(); return 0; /找不到时template void InsertFront(Node* & head, T item) h

8、ead = GetNode(item,head);template void InsertRear(Node* & head, const T& item) Node *newNode, *currPtr = head; if (currPtr = NULL) InsertFront(head,item); else while(currPtr-NextNode() != NULL) currPtr = currPtr-NextNode(); newNode = GetNode(item); currPtr-InsertAfter(newNode); template void DeleteF

9、ront(Node* & head) Node *p = head; /取得将被删除的结点的地址 if (head != NULL) / 确认链表不空 head = head-NextNode(); / 将表头指针head移向第二个结点 delete p; /删除原第一个结点 template void Delete (Node* & head, T key) Node *currPtr = head, *prevPtr = NULL; if (currPtr = NULL) return; while (currPtr != NULL & currPtr-data != key) / cur

10、rPtr前行,prevPtr跟随其后 prevPtr = currPtr; currPtr = currPtr-NextNode(); if (currPtr != NULL) if(prevPtr = NULL) /找到的是链表第一个结点 head = head-NextNode(); else prevPtr-DeleteAfter(); delete currPtr; /释放被删除的结点所占的内存空间 template void InsertOrder(Node* & head, T item) Node *currPtr, *prevPtr, *newNode; prevPtr = N

11、ULL; currPtr = head; while (currPtr != NULL) if (item data) break; / currPtr前行,prevPtr跟随其后 prevPtr = currPtr; currPtr = currPtr-NextNode(); if (prevPtr = NULL) /如果插入点在表头 InsertFront(head,item); else newNode = GetNode(item); prevPtr-InsertAfter(newNode); template void ClearList(Node * &head) Node *cu

12、rrPtr, *nextPtr; currPtr = head; while(currPtr != NULL) nextPtr = currPtr-NextNode(); delete currPtr; currPtr = nextPtr; /使指针currPtr指向下一个结点 head = NULL; /将头结点置为NULL,标志着链表为空#endif / NODE_LIBRARY/lab9_1.cpp#include #include 9_5.h#include node.husing namespace std;int main() Node *head = NULL, *prevPtr

13、, *delPtr; int i, key, item; for (i=0;i 10;i+) coutplease input i+1 number To insert a header :item; InsertFront(head, item); cout List: ; PrintList(head,noNewline); cout endl; cout key; prevPtr = head; while (Find(head,key,prevPtr) != NULL) if(prevPtr = NULL) /找到的是链表第一个结点 head = head-NextNode(); el

14、se delPtr=prevPtr-DeleteAfter(); delete delPtr; cout List: ; PrintList(head,noNewline); cout endl; ClearList(head);运行结果:please input 1 number To insert a header :1please input 2 number To insert a header :2please input 3 number To insert a header :3please input 4 number To insert a header :4please i

15、nput 5 number To insert a header :5please input 6 number To insert a header :6please input 7 number To insert a header :7please input 8 number To insert a header : 8please input 9 number To insert a header :9please input 10 number To insert a header :10List: 10 9 8 7 6 5 4 3 2 1请输入一个需要删除的整数: 2List:

16、10 9 8 7 6 5 4 3 12. /link.h#ifndef LINKEDLIST_CLASS#define LINKEDLIST_CLASS#include #include using namespace std;#ifndef NULLconst int NULL = 0;#endif / NULL#include 9_5.htemplate class LinkedList private: Node *front, *rear; Node *prevPtr, *currPtr; int size; int position; Node *GetNode(const T& i

17、tem,Node *ptrNext=NULL); void FreeNode(Node *p); void CopyList(const LinkedList& L); public: LinkedList(void); LinkedList(const LinkedList& L); /拷贝构造函数 LinkedList(void); LinkedList& operator= (const LinkedList& L); int ListSize(void) const; /返回链表中元素个数(size) int ListEmpty(void) const; /size等于0时返回TRUE

18、,否则返回FALSE void Reset(int pos = 0); void Next(void); /使prevPtr和currPtr移动到下一个节点 int EndOfList(void) const; int CurrentPosition(void) const; /返回数据成员position void InsertFront(const T& item); /在表头插入 void InsertRear(const T& item); /在表尾添加 void InsertAt(const T& item); /在当前节点之前插入 void InsertAfter(const T&

19、 item); /在当前节点之后插入 T DeleteFront(void); /删除头节点 void DeleteAt(void); /删除当前节点 T& Data(void); void ClearList(void);template Node *LinkedList:GetNode(const T& item, Node* ptrNext) Node *p; p = new Node(item,ptrNext); if (p = NULL) cout Memory allocation failure!n; exit(1); return p;template void LinkedL

20、ist:FreeNode(Node *p) delete p;template void LinkedList:CopyList(const LinkedList& L) Node *p = L.front; 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 = curr

21、Ptr-NextNode(); template LinkedList:LinkedList(void): front(NULL), rear(NULL), prevPtr(NULL),currPtr(NULL), size(0), position(-1)template LinkedList:LinkedList(const LinkedList& L) front = rear = NULL; prevPtr = currPtr = NULL; size = 0; position = -1; CopyList(L);template void LinkedList:ClearList(

22、void) Node *currPosition, *nextPosition; currPosition = front; while(currPosition != NULL) nextPosition = currPosition-NextNode(); FreeNode(currPosition); currPosition = nextPosition; / 移动到下一结点 front = rear = NULL; prevPtr = currPtr = NULL; size = 0; position = -1;template LinkedList:LinkedList(void

23、) ClearList();template LinkedList& LinkedList:operator= (const LinkedList& L) if (this = &L) / 不能将链表赋值给它自身 return *this; ClearList(); CopyList(L); return *this;template int LinkedList:ListSize(void) const return size; template int LinkedList:ListEmpty(void) const return size = 0;template void Linked

24、List:Next(void) if (currPtr != NULL) prevPtr = currPtr; currPtr = currPtr-NextNode(); position+; template int LinkedList:EndOfList(void) const return currPtr = NULL;template int LinkedList:CurrentPosition(void) const return position;template void LinkedList:Reset(int pos) int startPos; if (front = N

25、ULL) return; if (pos size-1) cerr Reset: Invalid list position: pos NextNode(); prevPtr = front; startPos = 1; for(position=startPos; position != pos; position+) prevPtr = currPtr; currPtr = currPtr-NextNode(); template T& LinkedList:Data(void) if (size = 0 | currPtr = NULL) cerr Data: invalid refer

26、ence! data;template void LinkedList:InsertFront(const T& item) if (front != NULL) Reset(); InsertAt(item); / 在表头插入template void LinkedList:InsertRear(const T& item) Node *newNode; prevPtr = rear; newNode = GetNode(item); / 创建新结点 if (rear = NULL) / 如果表空则插入在表头 front = rear = newNode; else rear-InsertA

27、fter(newNode); rear = newNode; currPtr = rear; position = size; size+;template void LinkedList:InsertAt(const T& item) Node *newNode; if (prevPtr = NULL) newNode = GetNode(item,front); front = newNode; else newNode = GetNode(item); prevPtr-InsertAfter(newNode); if (prevPtr = rear) rear = newNode; po

28、sition = size; currPtr = newNode; size+; template void LinkedList:InsertAfter(const T& item) Node *p; 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 = s

29、ize; else position+; prevPtr = currPtr; currPtr = p; size+; / 使链表长度增值template T LinkedList:DeleteFront(void) T item; Reset(); if (front = NULL) cerr Invalid deletion! data; DeleteAt(); return item;template void LinkedList:DeleteAt(void) Node *p; if (currPtr = NULL) cerr Invalid deletion! NextNode();

30、 else p = prevPtr-DeleteAfter(); if (p = rear) rear = prevPtr; position-; currPtr = p-NextNode(); FreeNode(p); size-;#endif / LINKEDLIST_CLASS/lab9_2.cpp#include link.hint main() LinkedList A, B; for(int i=0;i5;i+) A.InsertRear(2*i+1); B.InsertRear(2*i+2); A.Reset(); cout 链表A的元素为: ; while(!A.EndOfLi

31、st() 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.Ret(); while(!B.EndOfList() A.InsertRear(B.Data(); B.Next(); A.Reset(); cout 此时,链表A的元素为: ; while(!A.EndOfList() cout A.Data() ; A.Next(); cout endl;3. /queue.h#ifndef QUEUE_CLASS#define QUEUE_CLASS#include #include using namespace std;#include link.htemplate

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论