1、实验一线性表应用实验报告学院(系)名称:计算机与通信工程学院*学号*专业计算机科学与技术班级2015级*班实验项目实验一:线性表应用课程名称数据结构与算法课程代码0661013实验时间2017年3月9日第一节实验地点7-219考核标准实验过程25分程序运行20分回答问题15分实验报告30分特色功能5分考勤违纪情况5分成绩成绩栏其它批改意见:教师签字:考核容评价在实验课堂中的表现,包括实验态度、编写程序过程等容等。功能完善, 功能不全有小错无法运行正确基本正确有提示无法回答完整较完整一般容极少无报告有无有无一、实验目的实验目的:理解线性表的逻辑特点;掌握顺序表、链表存储结构,以及线性表的基本操作
2、,如插入、删除、查找,以及线性表合并等操作在顺序存储结构和链式存储结构上的实现算法,并能够在实际问题背景下的灵活运用线性表来解决问题,实现相应算法。二、实验题目与要求1一元稀疏多项式简单的计算器1)问题描述:用线性表表示一元稀疏多项式,设计一个一元多项式运算器2)要求: (1)采用单链表存储结构一元稀疏多项式(2)输入并建立多项式(3)输出多项式(4)实现多项式加、减运算 3)分析算法时间复杂度2. 约瑟夫环问题 1)问题描述:有编号为 1, 2n 的 n 个人按顺时针方向围坐一圈,每人持有一个正整数密码。开始给定一个正整数 m,从第一个人按顺时针方向自 1 开始报数,报到 m 者出列,不再参
3、加报数,这时将出列者的密码作为 m,从出列者顺时针方向的下一人开始重新自 1 开始报数。如此下去,直到所有人都出列。试设计算法,输出出列者的序列。 2)要求: 采用顺序和链式两种存储结构实现3)分析算法时间复杂度3单链表基本操作练习1)问题描述:在主程序中提供下列菜单:1建立链表2连接链表3输出链表0结束2)实验要求:算法中包含下列过程,分别完成相应的功能:CreateLinklist(): 从键盘输入数据,创建单链表ContLinklist():将前面建立的两个单链表首尾相连OutputLinklist():输出显示单链表3)分析算法时间复杂度4单链表基本操作练习1)问题描述:已知单链表 L
4、(带头节点)是一个递增有序表,试编写算法,删除表中值大于 min 且小于 max 的节点(若表中有这样的节点),同时释放被删节点的空间。2)实验要求:min 和 max 是两个给定参数。3)分析算法时间复杂三、 实验过程与实验结果应包括如下主要容: 数据结构定义 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 算法设计思路简介 通过建立包含数据和指针的节点来保存数据,然后将一系列节点
5、通过指针插入到链表中去,实现建立链表,插入、删除节点,进而组合各种基本功能,编写符合题目要求的算法。 算法描述:可以用自然语言、伪代码或流程图等方式 1、 (1)将多项式各项的系数和指数分别存在A、B两个链表的中。 (2)用指针Pa、Pb分别指向连个链表的首元素。 (3)遍历两个链表,比较各元素的指数,若相同则相加减,将结果插入新表中,若不相等则将指数较小的插入新表中,继续向后遍历,直到其中一个链表到达表尾。 (4)将另一表中的剩余元素按指数大小顺序全部插入到新表中。 (5)新表中的元素按规定格式输出既为相加或相减后的多项式。 3、 (1)通过构造函数创建单链表 (2)通过循环变量temp找到
6、第一个链表的尾部设为p。 (3)使p的next指向第二个链表的第一个元素 (4)将连接后的两链表输出 4、 (1)用两个变量minZ,maxZ分别存储输入的最小值和最大值 (2)遍历整个单链表,将小于minZ和大于maxZ的节点删除 (3)输出操作后的单链表 算法的实现和测试结果:包括算法运行时的输入、输出,实验中出现的问题及解决办法等 出现问题 无法返回操作后的单链表 解决办法 经老师直到后,在相关函数前面加*成功返回操作后的单链表 1、3、 4、 算法时间复杂度分析 1、O(1表长度+2表长度)-可视为O(n) 3、O(1表长度+2表长度)-可视为O(n) 4、O(n) 四、收获与体会线性
7、表分为顺序表和链表,其中顺序表已相当熟悉,主要练了新接触的链表,感觉现在才真正体会到指针的魅力之处。同时也明白了顺序表和链表的优缺点,在老师的知道下,更增进了对C+的理解。算法相对来说还是比较简单的,很容易理解,关键在如何把算法变成你想要的计算机程序,在实验课以及平时的训练中,自己对代码的理解、控制能力都有所提高。五、源代码清单采取分文件方式编写源代码1、节点文件Node.hclass Node /元素节点public: Node(int iCoef = 0,int iExp = 0); void printNode();/打印函数 int coef;/系数 int exp;/指数 Node
8、*next;Node.cpp#includeNode.h#includeusingnamespace std;Node:Node(int iCoef,int iExp) coef = iCoef; exp = iExp;void Node:printNode() if(exp = 0) cout coef x; else cout coef x exp; 链表文件List1.h#includeNode.hclass List public: List();/建立链表 List();/销毁链表 void ClearList();/清空链表 bool ListInsert(int i,Node *
9、pNode);/从指定位置将元素插入链表 bool ListInsertTail(Node *pNode);/从尾部将元素插入链表 List *ListAdd(List *pList1,List *pList2);/多项式相加函数 List *ListMinus(List *pList1,List *pList2);/多项式相减函数 void ListTraverse();/遍历输出函数private: int m_iLength;/链表长度 Node *m_pList;/头指针;List1.cpp#include#includeList1.husingnamespace std;List:L
10、ist() m_pList = new Node; m_pList-coef = 0; m_pList-exp = 0; m_pList-next = NULL; m_iLength = 0;void List:ClearList() Node *CurrentNode = m_pList-next; while(CurrentNode != NULL) Node *temp = CurrentNode-next; delete CurrentNode; CurrentNode = temp; m_pList-next = NULL;List:List() ClearList(); delet
11、e m_pList; m_pList = NULL;bool List:ListInsert(int i,Node *pNode) Node *NewNode = new Node(); if(i m_iLength + 1) cout 插入位置不合法. endl; returnfalse; elseif(NewNode = NULL) cout 申请存失败. endl; returnfalse; else Node *temp = m_pList; for(int k = 0;k next; NewNode-coef = pNode-coef; NewNode-exp = pNode-exp
12、; NewNode-next = temp-next; temp-next = NewNode; m_iLength+; returntrue; bool List:ListInsertTail(Node *pNode) Node *NewNode = new Node(); if(NewNode = NULL) cout 申请存失败.next != NULL) temp = temp-next; NewNode-coef = pNode-coef; NewNode-exp = pNode-exp; temp-next = NewNode; NewNode-next = NULL; m_iLe
13、ngth+; returntrue; List *List:ListAdd(List *pList1,List *pList2) Node *Pa,*Pb; int x; List *pList3 = new List(); Pa = pList1-m_pList-next; Pb = pList2-m_pList-next; while(Pa & Pb) if(Pa-exp = Pb-exp) x = Pa-coef + Pb-coef; if(x != 0) Node *n = new Node(); n-coef = x; n-exp = Pa-exp; pList3-ListInser
14、tTail(n); Pa = Pa-next; Pb = Pb-next; elseif(Pa-exp exp) Node *n = new Node(); n-coef = Pa-coef; n-exp = Pa-exp; pList3-ListInsertTail(n); Pa = Pa-next; elseif(Pa-exp Pb-exp) Node *n = new Node(); n-coef = Pb-coef; n-exp = Pb-exp; pList3-ListInsertTail(n); Pb = Pb-next; while(Pa) Node *n = new Node(
15、); n-coef = Pa-coef; n-exp = Pa-exp; pList3-ListInsertTail(n); Pa = Pa-next; while(Pb) Node *n = new Node(); n-coef = Pb-coef; n-exp = Pb-exp; pList3-ListInsertTail(n); Pb = Pb-next; return pList3; List *List:ListMinus(List *pList1,List *pList2) Node *Pa,*Pb; int x; List *pList3 = new List(); Pa = p
16、List1-m_pList-next; Pb = pList2-m_pList-next; while(Pa & Pb) if(Pa-exp = Pb-exp) x = Pa-coef - Pb-coef; if(x != 0) Node *n = new Node(); n-coef = x; n-exp = Pa-exp; pList3-ListInsertTail(n); Pa = Pa-next; Pb = Pb-next; elseif(Pa-exp exp) Node *n = new Node(); n-coef = Pa-coef; n-exp = Pa-exp; pList3
17、-ListInsertTail(n); Pa = Pa-next; elseif(Pa-exp Pb-exp) Node *n = new Node(); n-coef = Pb-coef; n-exp = Pb-exp; pList3-ListInsertTail(n); Pb = Pb-next; while(Pa) Node *n = new Node(); n-coef = Pa-coef; n-exp = Pa-exp; pList3-ListInsertTail(n); Pa = Pa-next; while(Pb) Node *n = new Node(); n-coef = P
18、b-coef; n-exp = Pb-exp; pList3-ListInsertTail(n); Pb = Pb-next; return pList3; void List:ListTraverse() Node *temp = m_pList-next; cout printNode(); if(temp-next != NULL) if(temp-next-coef 0) cout next-coef = 0) continue; else cout next; cout endl;主文件Demo.cpp#includeList1.h#includeusingnamespace std
19、;int main() Node *n0 = new Node(20,0); Node *n1 = new Node(4,2); Node *n2 = new Node(2,5); Node *n3 = new Node(7,9); Node *n4 = new Node(5,12); Node *n5 = new Node(-11,18); List *pList1 = new List(); pList1-ListInsert(1,n0); pList1-ListInsert(2,n1); pList1-ListInsert(3,n2); pList1-ListInsert(4,n3);
20、pList1-ListInsert(5,n4); pList1-ListInsertTail(n5); pList1-ListTraverse(); Node *m1 = new Node(12,3); Node *m2 = new Node(2,5); Node *m3 = new Node(9,8); Node *m4 = new Node(20,9); Node *m5 = new Node(11,18); List *pList2 = new List(); pList2-ListInsert(1,m1); pList2-ListInsert(2,m2); pList2-ListIns
21、ert(3,m3); pList2-ListInsert(4,m4); pList2-ListInsert(5,m5); pList2-ListTraverse(); List *pList4 = new List(); pList4 = pList4-ListAdd(pList1,pList2); pList4-ListTraverse(); pList4 = pList4-ListMinus(pList1,pList2); pList4-ListTraverse(); return 0;3、节点文件Node.hclass Node public: int data; Node *next;
22、 Node(int iData = 0); void printNode();Node.cpp#includeNode.h#includeusing namespace std;Node:Node(int iData) data = iData;void Node:printNode() cout data ;链表文件List.h#includeNode.hclass List public: List();/建立链表 List();/销毁链表 void ClearList();/清空链表 bool ListInsertTail(Node *pNode);/从尾部插入元素 List *Cont
23、Linklist(List *pList1,List *pList2);/连接链表 void OutputLinklist();/输出链表private: Node *m_pList; int m_iLength;List.cpp#includeList.h#includeusing namespace std;List:List() m_pList = new Node(); m_pList-data = 0; m_pList-next = NULL; m_iLength = 0;List *List:ContLinklist(List *pList1,List *pList2) List
24、*pList3 = pList1; Node *temp = pList3-m_pList; while(temp-next != NULL) temp = temp-next; temp-next = pList2-m_pList-next; return pList3;void List:OutputLinklist() Node *temp = m_pList; while(temp-next != NULL) temp = temp-next; temp-printNode(); bool List:ListInsertTail(Node *pNode) Node *NewNode =
25、 new Node(); if(NewNode = NULL) cout申请存失败.next != NULL) temp = temp-next; NewNode-data = pNode-data; temp-next = NewNode; NewNode-next = NULL; m_iLength+; return true; void List:ClearList() Node *CurrentNode = m_pList-next; while(CurrentNode != NULL) Node *temp = CurrentNode-next; delete CurrentNode; CurrentNode = temp; m_pList-next = NULL;List:List() ClearList(); delete m_pList; m_pList = NULL;主文件Demo.cpp#includeList.h#includeusing namespace std;int main() Node *n1 = new Node(3); Node *n2 = new Node(7); Node *n3 = new Node(5); Node *n4 = new Node(6); Node *n5 =
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1