(1)掌握模板的定义和使用方法;
(2)根据要求正确定义模板类,实例化模板;
(3)掌握文件流的打开、关闭及读写方法。(暂未实现)
(1)单链表模板的定义和实现。
(2)员工表类数据的读写。
(1)单链表模板的定义和实现,并设计主程序对模板进行测试。
(2)使用文件流为实验一的员工表类提供数据读写的方法
ListNode.h
#pragma once template<typename Type> class SingleList; template<typename Type> class ListNode { private: friend typename SingleList<Type>; ListNode() :m_pnext(NULL) {} ListNode(const Type item, ListNode<Type> *next = NULL) :m_data(item), m_pnext(next) {} ~ListNode() { m_pnext = NULL; } public: Type GetData(); friend ostream& operator<< <Type>(ostream&, ListNode<Type>&); private: Type m_data; ListNode *m_pnext; }; template<typename Type> Type ListNode<Type>::GetData() { return this->m_data; } template<typename Type> ostream& operator<<(ostream& os, ListNode<Type>& out) { os << out.m_data; return os; }SingleList.h
#pragma once #include "ListNode.h" template<typename Type> class SingleList { public: SingleList() :head(new ListNode<Type>()) {} ~SingleList() { MakeEmpty(); delete head; } public: void MakeEmpty();//清空链表 int Length();//获取长度 bool Insert(Type item, int n = 0); Type Remove(int n = 0); //删除某一元素 bool RemoveAll(Type item); //删除所有元素 Type Get(int n); //查询某一位元素 void Print();//输出链表 private: ListNode<Type> *head; }; template<typename Type> void SingleList<Type>::MakeEmpty() { ListNode<Type> *pdel; while (head->m_pnext != NULL) { pdel = head->m_pnext; head->m_pnext = pdel->m_pnext; delete pdel; } } template<typename Type> int SingleList<Type>::Length() { ListNode<Type> *pmove = head->m_pnext; int count = 0; while (pmove != NULL) { pmove = pmove->m_pnext; count++; } return count; } template<typename Type> bool SingleList<Type>::Insert(Type item, int n) { if (n < 0) { cout << "The n is illegal" << endl; return 0; } ListNode<Type> *pmove = head; ListNode<Type> *pnode = new ListNode<Type>(item); if (pnode == NULL) { cout << "Application error!" << endl; return 0; } for (int i = 0; i < n&&pmove; i++) { pmove = pmove->m_pnext; } if (pmove == NULL) { cout << "the n is illegal" << endl; return 0; } pnode->m_pnext = pmove->m_pnext; pmove->m_pnext = pnode; return 1; } template<typename Type> bool SingleList<Type>::RemoveAll(Type item) { ListNode<Type> *pmove = head; ListNode<Type> *pdel = head->m_pnext; while (pdel != NULL) { if (pdel->m_data == item) { pmove->m_pnext = pdel->m_pnext; delete pdel; pdel = pmove->m_pnext; continue; } pmove = pmove->m_pnext; pdel = pdel->m_pnext; } return 1; } template<typename Type> Type SingleList<Type>::Remove(int n) { if (n < 0) { cout << "can't find the element" << endl; exit(1); } ListNode<Type> *pmove = head, *pdel; for (int i = 0; i < n&&pmove->m_pnext; i++) { pmove = pmove->m_pnext; } if (pmove->m_pnext == NULL) { cout << "can't find the element" << endl; exit(1); } pdel = pmove->m_pnext; pmove->m_pnext = pdel->m_pnext; Type temp = pdel->m_data; delete pdel; return temp; } template<typename Type> Type SingleList<Type>::Get(int n) { if (n < 0) { cout << "The n is out of boundary" << endl; exit(1); } ListNode<Type> *pmove = head->m_pnext; for (int i = 0; i < n; i++) { pmove = pmove->m_pnext; if (NULL == pmove) { cout << "The n is out of boundary" << endl; exit(1); } } return pmove->m_data; } template<typename Type> void SingleList<Type>::Print() { ListNode<Type> *pmove = head->m_pnext; cout << "head"; while (pmove) { cout << "--->" << pmove->m_data; pmove = pmove->m_pnext; } cout << "--->over" << endl << endl << endl; }Main.cpp
#include <iostream> using namespace std; #include "SingleList.h" int main() { SingleList<int> list; for (int i = 0; i < 20; i++) { list.Insert(i * 3, i); } for (int i = 0; i < 5; i++) { list.Insert(3, i * 3); } cout << "链表的长度为: " << list.Length() << endl; list.Print(); list.Remove(5); cout << "删除第5号元素后链表的长度为:" << list.Length() << endl; list.Print(); list.RemoveAll(3); cout << "删除所有3后链表长度为: " << list.Length() << endl; list.Print(); cout << "第三号元素为:" << list.Get(3) << endl; cout << endl; list.MakeEmpty(); cout << "清空链表后长度为:" << list.Length() << endl; list.Print(); system("pause"); return 0; }运行结果:
