1、课程设计说明书题 目: 双向循环链表基于邻接表的图的实现课 程: 数据结构课程设计院 (部): 计算机科学与技术专 业: 计算机科学与技术班 级:学生姓名:学 号:指导教师:完成日期:I目 录课程设计任务书 I课程设计任务书 II双向循环链表的实现 3一、问题描述 3二、数据结构 4三、逻辑设计 5四、编码 7五、测试数据 9六、测试情况 11基于邻接表的图的实现 12一、问题描述 12二、数据结构 13三、逻辑设计 13四、编码 15五、测试数据 16六、测试情况 16结 论 17参考文献 18课程设计指导教师评语 19I课程设计任务书 I设计题目 双向循环链表的实现已知技术参数和设计要求1
2、. 建立一个空表。2. 向里插入新的元素。3. 输出双向循环链表的元素以及其 size4. 返回索引为 i 的元素。5. 返回元素 x 第一次出现在双向循环链表中的索引6. 删除索引为 i 的元素。7. 按从左到右或者从右到左的顺序输出元素设计内容与步骤1、 设计存储结构2、 设计算法3、 编写程序,进行调试4、 总结并进行讲解设计工作计划与进度安排2016.7.9-7.12写代码2016.7.13-7.14完成课程设计说明书以及相关 ppt设计考核要求1、 考勤 20%2、 课程设计说明书 40%3、 成果展示 40%II课程设计任务书 II设计题目 基于邻接表的图的实现(insertEdg
3、e)已知技术参数和设计要求1、 建立一棵空表2、 输出图的顶点数3、 输出图的边数4、 判断是否是有向图5、 判断是否是加权图6、 检查边是否存在7、 插入边8、 输出顶点的度,只用于无向图9、 输出顶点的入度和出度设计内容与步骤1、 设计存储结构2、 设计算法3、 编写程序,进行调试4、 总结并进行演示、讲解设计工作计划与进度安排2016.7.9-7.12写代码2016.7.13-7.14完成课程设计说明书以及相关 ppt设计考核要求1、 考勤 20%2、 课程设计说明书 40%3、 成果展示 40%指导教师(签字): 教研室主任(签字):3双向循环链表的实现一、问题描述用图示的方法描述所处
4、理的双向循环链表的建立,以及插入删除操作前后链表的状态1.只有有头节点的双向循环链表2.有头节点的双向循环链表3.双向循环链表的插入headerNodea3 a1 a0 HeaderNode a4ai-1 aiqp44.双向循环链表的删除二、数据结构template structchainNode/ data membersTelement;chainNode *right;chainNode *left;/ methodschainNode() left=NULL;right=NULL;chainNode(constTleft=NULL;right=NULL;chainNode(constT
5、this-left = left;this-right = right;deleteNodep5;三、逻辑设计1、总体思路(1)存储结构基于邻接表,继承 linerlist 类,具体实现双向循环链表的存储(2)基本函数双向循环链表的插入,删除2、模块划分(图示的方法)(1)erase(删除)YesNoYes开始checkIndex(theIndex)p = headerNode;i=0;iright;i+; p-right= deleteNode -right;deleteNode-right-left=p;listSize-;delete deleteNode;结束6(2)insert(插入
6、)NoYesNoYes开始theIndexlistSizep=headerNode;i=0;coutrightq=new chainNode(theElement)q-right=p-right;q-left=p;p-right=q;q-right-left=q;listSize+结束74、函数或类的具体定义和功能boolempty() const returnlistSize = 0;/是否为空intsize() const returnlistSize;TintindexOf(constTvoiderase(int theIndex);voidinsert(int theIndex, co
7、nstTvoidright_output(ostreamvoidleft_output(ostream四、编码templatevoiddoublechain:checkIndex(int theIndex) const/ Verify that theIndex is between 0 and listSize - 1.if (theIndex = listSize)ostringstream s;s Tif(theIndex=listSize)T a=0;return a;/ move to desired nodechainNode* currentNode = headerNode-r
8、ight;for (int i = 0; i right;return currentNode-element;8templateintdoublechain:indexOf(constTint index = -1; / 当前节点的索引while (+index element != theElement)/ move to next nodecurrentNode = currentNode-right;/ make sure we found matching elementif (index = listSize)return -1;elsereturn index;templatev
9、oiddoublechain:erase(int theIndex)/ Delete the element whose index is theIndex./ Throw illegalIndex exception if no such element./checkIndex(theIndex);if (theIndex listSize)cout* deleteNode;chainNode* p = headerNode;for (int i = 0; i right;deleteNode = p-right;p-right=deleteNode-right;deleteNode-rig
10、ht-left=p;listSize-;delete deleteNode;template9voiddoublechain:insert(int theIndex, constTchainNode* p = headerNode;for (int i = 0; i right;q-right=p-right;q-left=p;p-right=q;q-right-left=q;listSize+;templatevoiddoublechain:right_output(ostreamfor (int i = 0;i element right;templatevoiddoublechain:l
11、eft_output(ostreamfor (int i = 0;i element left;五、测试数据1、对每个函数的测试数据(1)新建一个链表y.insert(0, 2);10y.insert(1, 6);y.insert(0, 1);y.insert(2, 4);y.insert(3, 5);y.insert(2, 3);insert 的异常测试 y.insert(7,4);(2)删除元素异常条件测试y.erase(7);正常条件测试y.erase(1);y.erase(0);y.erase(2);边缘条件测试(将剩余的元素删除)y.erase(0);y.erase(0);y.era
12、se(0);2、对程序整体的测试数据(1)判断链表是否为空y.empty();(2)测试链表长度y.size();(3)通过索引查找值y.get(-1);y.get(3);(4)通过值查找索引y.indexOf(7);y.indexOf(4);11六、测试情况1.新建一个链表2.测试 indexOf3.测试 get4 测试 erase5.插入(insert) (theIndexlistSize)12基于邻接表的图的实现(insertEdge)一、 问题描述邻接表的形态aList 112图32 214ListListListListListListelementweighted0elementw
13、eighted0weightedelement0weightedelement0weighted0element0weightedelementweightedelement1 24313插入一条边32 1241二数据结构template structwEdge/ vertex and weight pairintvertex;Tweight;wEdge(int theVertex = 0, T theWeight = 0)vertex = theVertex; weight = theWeight;operator int() const returnvertex;三、逻辑设计1.基本函数图
14、的边插入2.模块划分(1)插入一条边431 2514开NoYes3、函数或类的具体定义和功能intnumberOfVertices() const;/返回图的顶点数intnumberOfEdges() const;/返回图的边数boolexistsEdge(int, int) const;/if 边( ,)存在,返回true,否则返回falsevoidinsertEdge(edge *theEdge);/插入边(i,j)voideraseEdge(int, int);/删除边intdegree(int) const;/返回顶点的度,只用于无向图intinDegree(int) const;/返
15、回顶点的入度intoutDegree(int) const;/返回顶点的出度booldirected() const;/有向图boolweighted() const;/加权图voidcheckVertex(int theVertex) const;voidoutput(ostream开始v1=theEdge-vertex1();v2=theEdge-vertex2();existsEdge(v1,v2)结束aListv1.push_back( wEdge(v2, theEdge-weight() ); aListv2.push_back( wEdge(v1, theEdge-weight()
16、 );e+;154、编码templateint graph:numberOfVertices() constreturn n;templateint graph:numberOfEdges() constreturn e;templatebool graph:directed() constreturn false;templatebool graph:weighted() constreturn true;templatevoidgraph:insertEdge(edge *theEdge)int v1 = theEdge-vertex1();int v2 = theEdge-vertex2
17、();if ( existsEdge(v1,v2) )return;aListv1.push_back( wEdge(v2, theEdge-weight() );/vector里面的一个push函数aListv2.push_back( wEdge(v1, theEdge-weight() );e+;templatevoid graph:output(ostreamfor (int i = 1; i (1, 3, 2);a.insertEdge(newweightedEdge(2, 3, 1);a.insertEdge(newweightedEdge(1, 2, 3);a.insertEdge(newweightedEdge(2, 4, 2);a.insertEdge(newweightedEdge(3, 4, 4);六、测试情况18结 论参考文献1 数据结构算法与应用:c+语言描述/ (美)萨尼(Sahni,S)著;王立柱等译,北京:机械工业出版社 2015.12金远平.数据结构(c+描述). 北京:清华大学出版社,20053张乃孝等.数据结构C+与面向对象的途径.北京:高等教育出版社,20014 胡学刚.算法与数据结构算法设计指导.北京:清华大学出版社, 199919