1、类模板信息13级数据结构实验1窗体顶端窗体底端一、程序设计题(10分)1. 双向链表排序问题 4分 题目描述随机输入一些数据,然后排序后输出。建议使用双向链表结点和双向链表类来实现。参考第4讲ppt里的第3个例题。可以不使用下面的参考代码,自行编写。关于双向链表和双向结点的参考代码如下:/ 自定义类型enum StatusCode SUCCESS, FAIL, UNDER_FLOW, OVER_FLOW,RANGE_ERROR, DUPLICATE_ERROR, NOT_PRESENT, ENTRY_INSERTED, ENTRY_FOUND, VISITED, UNVISITED;templ
2、ate void Write(const ElemType &e)/ 操作结果: 显示数据元素cout e ;/ 双向链表结点类模板template struct DblNode/ 数据成员: ElemType data; / 数据域 DblNode *back; / 指向前驱的指针域 DblNode *next; / 指向后继的指针域/ 构造函数模板: DblNode(); / 无数据的构造函数模板 DblNode(ElemType item, DblNode *linkBack = NULL, DblNode *linkNext = NULL);/ 已知数据域和指针域建立结构;/ 双向链表
3、结点类模板的实现部分templateDblNode:DblNode()/ 操作结果:构造指针域为空的结点next = NULL;templateDblNode:DblNode(ElemType item, DblNode *linkBack, DblNode *linkNext)/ 操作结果:构造一个数据域为item和指针域为linkBack和linkNext的结点data = item; back = linkBack; next = linkNext;/ 双向链表类模板template class DblLinkListprotected:/ 循环链表实现的数据成员: DblNode *h
4、ead; / 头结点指针 mutable int curPosition; / 当前位置的序号 mutable DblNode * curPtr; / 指向当前位置的指针 int count; / 元素个数/ 辅助函数模板: DblNode *GetElemPtr(int position) const; / 返回指向第position个结点的指针 void Init(); / 初始化线性表public:/ 抽象数据类型方法声明及重载编译系统默认方法声明: DblLinkList(); / 无参数的构造函数模板 virtual DblLinkList(); / 析构函数模板 int Lengt
5、h() const; / 求线性表长度 bool Empty() const; / 判断线性表是否为空 void Clear(); / 将线性表清空 void Traverse(void (*visit)(const ElemType &) const; / 遍历线性表 int GetCurPosition() const; / 返回当前位置 StatusCode GetElem(int position, ElemType &e) const; / 求指定位置的元素 StatusCode SetElem(int position, const ElemType &e); / 设置指定位置的元
6、素值 StatusCode Delete(int position, ElemType &e); / 删除元素 StatusCode Insert(int position, const ElemType &e); / 插入元素 DblLinkList(const DblLinkList & ccopy); / 复制构造函数模板 DblLinkList &operator =(const DblLinkList& ccopy); / 重载赋值运算符 DblNode *GetHeadPtr();templateDblNode *DblLinkList:GetHeadPtr() return he
7、ad;/ 链表类模板的实现部分templateDblNode *DblLinkList:GetElemPtr(int position) const/ 操作结果:返回指向第position个结点的指针 if (curPosition position) / 当前位置在所查找位置之前,向后查找 for (; curPosition next; / 查找位置position else if (curPosition position) / 当前位置在所查找位置之后,向前查找 for (; curPosition position; curPosition-) curPtr = curPtr-bac
8、k; / 查找位置position return curPtr;template void DblLinkList:Init()/ 操作结果:初始化线性表 head = new DblNode; / 构造头指针 head-next = head; / 空循环链表的头结点后继为头结点本身 head-back = head; / 空双向循环链表的头结点前驱为头结点本身 curPtr = head; curPosition = 0;/ 初始化当前位置 count = 0; / 初始化元素个数template DblLinkList:DblLinkList()/ 操作结果:构造一个空链表 Init()
9、;template DblLinkList:DblLinkList()/ 操作结果:销毁线性表 Clear(); / 清空线性表 delete head; / 释放头结点所点空间template int DblLinkList:Length() const/ 操作结果:返回线性表元素个数 return count;template bool DblLinkList:Empty() const/ 操作结果:如线性表为空,则返回true,否则返回false return head-next = head;template void DblLinkList:Clear()/ 操作结果:清空线性表 E
10、lemType tmpElem; / 临时元素值 while (Length() 0) / 表性表非空,则删除第1个元素 Delete(1, tmpElem); template void DblLinkList:Traverse(void (*visit)(const ElemType &) const/ 操作结果:依次对线性表的每个元素调用函数(*visit) for (DblNode *tmpPtr = head-next; tmpPtr != head; tmpPtr = tmpPtr-next) / 用tmpPtr依次指向每个元素 (*visit)(tmpPtr-data); / 对
11、线性表的每个元素调用函数(*visit) template int DblLinkList:GetCurPosition() const/ 操作结果:返回当前位置 return curPosition;template StatusCode DblLinkList:GetElem(int position, ElemType &e) const/ 操作结果:当线性表存在第position个元素时,用e返回其值,返回ENTRY_FOUND,/ 否则返回NOT_PRESENT if (position Length() / position范围错 return NOT_PRESENT; / 元素不
12、存在 else / position合法 DblNode *tmpPtr; tmpPtr = GetElemPtr(position); / 取出指向第position个结点的指针 e = tmpPtr-data; / 用e返回第position个元素的值 return ENTRY_FOUND; template StatusCode DblLinkList:SetElem(int position, const ElemType &e)/ 操作结果:将线性表的第position个位置的元素赋值为e,/ position的取值范围为1positionLength(),/ position合法时
13、返回SUCCESS,否则返回RANGE_ERROR if (position Length() / position范围错 return RANGE_ERROR; else / position合法 DblNode *tmpPtr; tmpPtr = GetElemPtr(position); / 取出指向第position个结点的指针 tmpPtr-data = e; / 设置第position个元素的值 return SUCCESS; template StatusCode DblLinkList:Delete(int position, ElemType &e)/ 操作结果:删除线性表的
14、第position个位置的元素, 并用e返回其值,/ position的取值范围为1positionLength(),/ position合法时返回SUCCESS,否则返回RANGE_ERROR if (position Length() / position范围错 return RANGE_ERROR; else / position合法 DblNode *tmpPtr; tmpPtr = GetElemPtr(position - 1); / 取出指向第position - 1个结点的指针 tmpPtr = tmpPtr-next; / tmpPtr指向第position 个结点 tmpP
15、tr-back-next = tmpPtr-next; / 修改向右的指针 tmpPtr-next-back = tmpPtr-back; / 修改向左的指针 e = tmpPtr-data; / 用e返回被删结点元素值 if (position = Length() / 删除尾结点,当前结点变为头结点 curPosition = 0; / 设置当前位置的序号 curPtr = head; / 设置指向当前位置的指针 else / 删除非尾结点,当前结点变为第position个结点 curPosition = position; / 设置当前位置的序号 curPtr = tmpPtr-next
16、; / 设置指向当前位置的指针 count-; / 删除成功后元素个数减1 delete tmpPtr; / 释放被删结点 return SUCCESS; template StatusCode DblLinkList:Insert(int position, const ElemType &e)/ 操作结果:在线性表的第position个位置前插入元素e/ position的取值范围为1positionLength()+1/ position合法时返回SUCCESS, 否则返回RANGE_ERROR if (position Length() + 1) / position范围错 retur
17、n RANGE_ERROR; / 位置不合法 else / position合法 DblNode *tmpPtr, *nextPtr, *newPtr; tmpPtr = GetElemPtr(position - 1); / 取出指向第position-1个结点的指针 nextPtr = tmpPtr-next; / nextPtr指向第position个结点 newPtr = new DblNode(e, tmpPtr, nextPtr);/ 生成新结点 tmpPtr-next = newPtr; / 修改向右的指针 nextPtr-back = newPtr; / 修改向左的指针 cur
18、Position = position; / 设置当前位置的序号 curPtr = newPtr; / 设置指向当前位置的指针 count+; / 插入成功后元素个数加1 return SUCCESS; template DblLinkList:DblLinkList(const DblLinkList & ccopy)/ 操作结果:由线性表copy构造新线性表复制构造函数模板 int copyLength = ccopy.Length(); / copy的长度 ElemType e; Init(); / 初始化线性表 for (int curPosition = 1; curPosition
19、 = copyLength; curPosition+) / 复制数据元素 ccopy.GetElem(curPosition, e); / 取出第curPosition个元素 Insert(Length() + 1, e); / 将e插入到当前线性表 template DblLinkList &DblLinkList:operator =(const DblLinkList & ccopy)/ 操作结果:将线性表copy赋值给当前线性表重载赋值运算符 if ( & ccopy != this) int copyLength = ccopy.Length(); / copy的长度 ElemTy
20、pe e; Clear(); / 清空当前线性表 for (int curPosition = 1; curPosition = copyLength; curPosition+) / 复制数据元素 ccopy.GetElem(curPosition, e); / 取出第curPosition个元素 Insert(Length() + 1, e); / 将e插入到当前线性表 return *this;template void Sort(DblLinkList &L) /请补充完整int main(void) DblLinkList la,lb; int x; /cout 随机输入一些数据,输
21、入0时结束 x & x != 0) la.Insert(la.Length() + 1, x); lb = la; /cout排序前的数据是:; lb.Traverse(Write); coutendl; Sort(la); /cout排序后的数据是:; la.Traverse(Write); return 0; / 返回值0, 返回操作系统 输入描述随机的数据,以0作为输出结束标记。 输出描述链表创建好后的数据,以及排序后链表中的数据。 样例输入2 10 3 5 0 样例输出2 10 3 52 3 5 10 2. 一元多项式问题 6分 题目描述符号多项式的操作是表处理的典型应用,在数学上一元
22、n次多项式按升幂排列,可进行加、减、乘的运算。请用单链表实现多项式的表示及三种运算操作。思路提示:#includeusing namespace std;enum StatusCode SUCCESS, FAIL, UNDER_FLOW, OVER_FLOW,RANGE_ERROR, DUPLICATE_ERROR, NOT_PRESENT, ENTRY_INSERTED, ENTRY_FOUND, VISITED, UNVISITED;/1 结点类/定义一个Node类,在线性链表类里要用到,见P32/也可查找课件文件夹里的node.h文件,直接拷贝/2 线性链表类/定义一个SimpleLin
23、kList类,实现一些方法,见教材P32/查找文件夹里的simple_lk_list.h/3 多项式项类/定义一个PolyItem类,成员有系数double coef和指数int expn/在多项式类里要用到,见教材P56/4 多项式类/定义一个Polynomial类,就是一个单链表,/只是实现了加减乘运算符的重载,见教材P57/加法在ppt课件的例题里已经讲解了/减法就是将第二项的所有系数取反,再调用加法/乘法具体的讲解见参考教材int main(void) int i,c,n,m; Polynomial fa, fb, fc; /用多项式类实例化3个对象 PolyItem it; /接收每
24、一项数据所使用的临时变量 cinn; for(i=0;i it.coef it.expn; fa.InsItem(it); /把每一项插入到多项式链表里 cinm; for(i=0;i it.coef it.expn; fb.InsItem(it); while( cinc & c) if(c=1) fc=fa+fb; else if(c=2) fc=fa-fb; else fc=fa*fb; fc.Display(); cout endl; return 0; / 返回值0, 返回操作系统 输入描述第一个多项式的项数n,每一项的系数和指数;第二个多项式的项数m,每一项的系数和指数。分别用1、2、3代表加、减、乘三种运算,输入数字即执行具体的某一种运算。输入0表示程序结束。 输出描述输出运算结果,每种运算占一行,且用数字有序对升幂表示。 样例输入31 2 3 4 5 621 2 3 4123210 样例输出2 2 6 4 5 6 5 6 1 4 6 6 14 8 15 10 5 6 2 2 6 4 5 6
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1