1.《数据结构 课程设计》表达式求值 实验报告

2.求一份数据结构课程设计报告

3.数据结构课程设计

旅游路线规划数据结构程序设计报告_旅游线路设计的结论

《数据结构与程序设计》比较系统地介绍了线性表、栈和队列、串、数组和广义表、树、图、查找、排序等内容,共分为9章,最后有一套实验题目。每章都配置了本章要点、本章小结和习题,便于读者理解、消化书中的内容。《数据结构与程序设计》的最后,有一套实验题目,共有六个实验,每个实验又包含多道实验题目,每道实验题都从问题描述、基本要求、测试数据、实验提示、选作内容等几个环节给予解析,通过实验进一步提高读者运用数据结构知识解决实际问题的能力。全书融入了作者长期的教学经验,在编排上注意体现教学思路的完整性,力求做到深入浅出、通俗易懂,同时也考虑了自学者的学习方便,适于教学和自学。

《数据结构与程序设计》的读者对象是学习数据结构课程的本、专科及高职类学生,也可作为信息类各专业考试、高校教师以及其他专业技术人员的参考用书。

《数据结构 课程设计》表达式求值 实验报告

一 需求分析:

在该部分中根据设计题目的要求,充分地分析和理解问题,叙述系统的功能要求,明确问题要求做什么?以及限制条件是什么?

1.1问题描述

1.2基本要求

(1) 输入的形式和输入值的范围;

(2) 输出的形式;

(3) 程序所能达到的功能;

二 概要设计

说明本程序中用到的所有抽象数据类型的定义。主程序的流程以及各程序模块之间的层次(调用)关系。

1、 数据结构

2、 程序模块

3、各模块之间的调用关系以及算法设计

三 详细设计

实现概要设计中定义的所有数据类型,对每个操作写出伪码算法;对主程序和其他模块也都需要写出伪码算法(伪码算法达到的详细程度建议为:按照伪码算法可以在计算机键盘直接输入高级程序设计语言程序);写出出函数和过程的调用关系.

四 测试与分析

测试数据,输出测试的结果,这里的测试数据应该完整和严格。并对结果进行分析。

五 总结

总结可以包括 : 课程设计过程的收获、遇到问题、遇到问题解决问题过程的思考、程序调试能力的思考、对数据结构这门课程的思考、在课程设计过程中对《数据结构》课程的认识等内容。

求一份数据结构课程设计报告

算术表达式求值演示

一、概述

数据结构课程设计,要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。

在这次的课程设计中我选择的题目是算术表达式求值演示。表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。设计一个程序,演示用算符优先法对算术表达式求值的过程。深入了解栈和队列的特性,以便在解决实际问题中灵活运用它们,同时加深对这种结构的理解和认识。

二、 系统分析

1. 以字符列的形式从终端输入语法正确的、不含变量的整数表达式。利用已知的算符优先关系,实现对算术四则混合运算表达式的求值,并仿照教科书的例子在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。

2. 一般来说,计算机解决一个具体问题时,需要经过几个步骤:首先要从具体问题抽象出一个适当的数学模型,然后设计一个解决此数学模型的算法,最后编出程序,进行测试,调试直至得到想要的答案。对于算术表达式这个程序,主要利用栈,把运算的先后步骤进行分析并实现简单的运算!为实现算符优先算法,可以使用两个栈,一个用以寄存运算符,另一个用以寄存操作数和运算结果。

3. 演示程序是以用户于计算机的对话方式执行,这需要一个模块来完成使用者与计算机语言的转化。 4. 程序执行时的命令:

本程序为了使用具体,用菜单式的方式来完成程序的演示,几乎不用输入什么特殊的命令,只需按提示输入表达式即可。(要注意输入时格式,否者可能会引起一些错误) 5. 测试数据。

2

算术表达式求值演示

一、概述

数据结构课程设计,要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。

在这次的课程设计中我选择的题目是算术表达式求值演示。表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。设计一个程序,演示用算符优先法对算术表达式求值的过程。深入了解栈和队列的特性,以便在解决实际问题中灵活运用它们,同时加深对这种结构的理解和认识。

二、 系统分析

1. 以字符列的形式从终端输入语法正确的、不含变量的整数表达式。利用已知的算符优先关系,实现对算术四则混合运算表达式的求值,并仿照教科书的例子在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。

2. 一般来说,计算机解决一个具体问题时,需要经过几个步骤:首先要从具体问题抽象出一个适当的数学模型,然后设计一个解决此数学模型的算法,最后编出程序,进行测试,调试直至得到想要的答案。对于算术表达式这个程序,主要利用栈,把运算的先后步骤进行分析并实现简单的运算!为实现算符优先算法,可以使用两个栈,一个用以寄存运算符,另一个用以寄存操作数和运算结果。

3. 演示程序是以用户于计算机的对话方式执行,这需要一个模块来完成使用者与计算机语言的转化。 4. 程序执行时的命令:

本程序为了使用具体,用菜单式的方式来完成程序的演示,几乎不用输入什么特殊的命令,只需按提示输入表达式即可。(要注意输入时格式,否者可能会引起一些错误) 5. 测试数据。

操作集合:

(1)void InitStack1(SqStack1 &S1);//声明栈建立函数 (2)void InitStack2(SqStack2 &S2);//声明栈建立函数

(3)void evaluate(SqStack1 &S1,SqStack2 &S2);//确定如何入栈函数 (4)void Push1(SqStack1 &S1,char e);//声明入栈函数 (5)void Push2(SqStack2 &S2,float e);//声明入压栈函数 (6)char GetTop1(SqStack1 &S1);//声明取栈顶元素函数 (7)float GetTop2(SqStack2 &S2);//声明取栈顶元素函数 (8)char Pop1(SqStack1 &S1);//声明出栈函数 (9)float Pop2(SqStack2 &S2);//声明出栈函数 (10)char Compare(char m,char n);//声明比较函数

(11)float Operate(float a,char rheta,float b);//声明运算函数 (12)void DispStack1(SqStack1 &S1);//从栈底到栈顶依次输出各元素 (13)void DispStack2(SqStack2 &S2);//从栈底到栈顶依次输出各元素 }ADT SqStack

结构分析:

栈中的数据节点是通过数组来存储的。因为在C语言中数组是用下标从零开始的,因此我

们在调用他们的数据是要特别注意。指针变量的值要么为空(NULL),不指向任何结点;要么其值为非空,即它的值是一个结点的存储地址。注意,当P为空值时,则它不指向任何结点,此时不能通过P来访问结点,否则会引起程序错误。如果输入的数字不符合题目要求,则会产生错误结果。

算法的时空分析:

时间和空间性能分析:时间上,对于含n个字符的表达式,无论是对其进行合法性检测还是对其进行入栈出栈操作n次,因此其时间复杂度为O(n)。空间上,由于是用数组来存储输入的表达式,用栈来存储运算中的数据和运算符,而栈的本质也用到的数组,数组在定义时必须确定其大小。在不知表达式长度的情况下确定数组的长度确非易事,此时极易造成空间的浪费,因此空间性能不是很好。

数据结构课程设计

//class CNode.h

#ifndef __CNODE_H__

#define __CNODE_H__

#include <iostream>

using namespace std;

struct stData //出生年月结构

{

int m_nYear;

int m_nMonth;

int m_nDay;

};

struct stResult //五门课成绩结构

{

double m_dSubject_1; //自己改成绩的名称

double m_dSubject_2;

double m_dSubject_3;

double m_dSubject_4;

double m_dSubject_5;

};

struct stStudent //声明学生信息的结构

{

string m_strNumber; //学生学号

string m_strName; //姓名

char m_chSex; //性别

struct stData m_stData; //出生年月

string m_strAppearance; //政治面貌

struct stResult m_stResult; //五门课成绩

};

typedef class CNode

{

private:

struct stStudent m_stStudent;

CNode* m_Next;

public:

CNode(); //构造函数

~CNode(); //析构函数

void SetNodeData(); //设置结点内容的函数成员

stStudent GetNodeData(); //获取结点内容的函数成员

void SetNodeNext(CNode* _Next); //设置结点Next指针的函数成员

void ShowNodeData(); //输出结点内容的函数成员

CNode* GetNodeNext(); //获取结点Next指针的函数成员

}LinkNode;

#endif

//class CLinkList

#ifndef __CLINKLIST_H__

#define __CLINKLIST_H__

#include "CNode.h"

typedef class CLinkList

{

private:

LinkNode* m_Head; //链表的头指针

LinkNode m_Node; //链表的头结点

public:

CLinkList(); //构造函数

~CLinkList(); //析构函数

void CreateList(); //初始化链表的函数成员

LinkNode* GetListNode(int _nIndex); //按位置查找指定位结点的成员函数

void InsertList(int _nIndex); //插入结点的成员函数

void DeleteList(int _nIndex); //删除某一结点的成员函数

LinkNode* GetHeadList(); //获取头指针的成员函数

void SetListData(int _nIndex); //设置链表中某一结点的值的成员函数

void ShowListData(int _nIndex); //这个是现实链表中某一结点值的函数成员

void DestroyList(int _nIndex); //销毁某一位置以后链表的成员函数

void ShowList(); //显示链表的成员函数

}LinkList;

#endif

//class CLinkList

#include "CLinkList.h"

#include "CNode.h"

CLinkList::CLinkList()

{

cout << "这个是构造函数"<< endl;

m_Head = &m_Node; //链表的头指针指向头结点

m_Node.SetNodeNext(NULL); //将头结点的Next指针设置为NULL;

}

CLinkList::~CLinkList()

{

cout << "这个是析构函数" << endl;

}

void CLinkList::CreateList() //以向后追加的方式创建一个链表,输入0退出

{

int nTemp = 0; //定义一个临时变量用于标志程序结束

cout << "欢迎来创建链表 !" << endl;

CNode * pTemp = NULL; //定义一个临时结点指针,用来增加新结点用

CNode * pNode = m_Head; //定义一个标记指针,首先叫其指向头结点

while(1)

{

pTemp = new LinkNode;

cout << "请输入下一个结点的内容!" << endl;

pTemp->SetNodeData(); //设置链表中结点的内容

cout << "如果想继续输入下一个学生的信息请输入 1,否则输入 0" << endl;

cin >> nTemp;

if ('0' == nTemp)

{

break;

}

pNode->SetNodeNext(pTemp); //让链尾的Next指向新建的结点

pNode = pTemp; //将结尾元素向后移

}

cout << "创建链表结束" << endl;

}

LinkNode* CLinkList::GetListNode(int _nIndex)

{

cout << "这个是按位置查找指定位结点的成员函数" << endl;

LinkNode* pNode = m_Head->GetNodeNext(); //定义一个临时的结点指针,初始化指向头结点

int Temp = 0; //定义一个临时的变量,用来标记已检查结点的个数的

if(-1 == _nIndex) //返回头结点(即头指针)

{

return m_Head;

}

if(_nIndex < -1) //_nIndex控制条件

{

cout << "您输入的是错误的位置!" << endl;

return 0;

}

while(pNode != NULL)

{

if(_nIndex == Temp)

{

return pNode;

}

pNode = pNode->GetNodeNext(); //临时结点向后移动

++Temp;

}

return pNode; //没找到结点就返回NULL

}

void CLinkList::ShowListData(int _nIndex);

void CLinkList::InsertList(int _nIndex) //插入结点的函数成员

{

cout << "这个是插入结点的成员函数" << endl;

LinkNode* pNode = GetListNode(_nIndex - 1); //定义一个结点类的指针,指向的是要插入位置的前一指针

LinkNode* pTemp = new CNode; //定义一个临时结点指针,用来增加新结点用

pTemp->SetNodeData(); //设置插入结点的内容

pTemp->SetNodeNext(pNode->GetNodeNext());

pNode->SetNodeNext(pTemp);

}

void CLinkList::DeleteList(int _nIndex)

{

cout << "这个是删除某一结点的成员函数" << endl;

LinkNode* pNode = GetListNode(_nIndex - 1); //定义一个结点类的指针,指向的是要删除位置的前一指针

LinkNode* pTemp = NULL; //定义一个临时结点指针,用来指向要删除的结点

pTemp =pNode->GetNodeNext(); //把pTemp指向要删除的结点

pNode->SetNodeNext(pTemp->GetNodeNext()); //把pNode指向要删除的结点的后一个结点

delete pTemp; //删除结点

pTemp = NULL;

}

LinkNode* CLinkList::GetHeadList()

{

cout << "这个是获取头指针的成员函数" << endl;

return m_Head;

}

void CLinkList::SetListData(int _nIndex)

{

cout << "这个是设置链表中某一结点的值的成员函数" << endl;

CNode *pNode = GetListNode(_nIndex); //定义一个结点类的指针,指向的是要修改内容位置的结点

pNode->SetNodeData(); //修改内容

}

void CLinkList::ShowListData(int _nIndex)

{

cout << "这个是显示链表中某一结点值的成员函数" << endl;

CNode *pNode = GetListNode(_nIndex); //定义一个结点类的指针,指向的是要获取内容位置的结点

pNode->ShowNodeData(); //返回想要得到位置的结点内容

}

void CLinkList::DestroyList(int _nIndex)

{

cout << "这个是销毁某一位置以后链表的成员函数" << endl;

LinkNode* pTemp = GetListNode(_nIndex - 1); //定义一个结点指针,指向要销毁位置的前一结点

LinkNode* pNode = pTemp->GetNodeNext(); //定义一个结点指针,指向要销毁位置的结点

while(pTemp->GetNodeNext() != NULL) //销毁动作的结束条件或初始条件

{

pTemp->SetNodeNext(pNode->GetNodeNext()); //把需要销毁的位置的前结点的Next指向销毁位置的下一个结点

delete pNode; //销毁结点

pNode = pTemp->GetNodeNext(); //把pNode重新指向要销毁位置的结点

}

}

void CLinkList::ShowList()

{

cout << "这个是显示链表的成员函数" << endl;

int nTemp = 0; //定义一个临时的整形变量用来控制输入的个数

LinkNode* pTemp = m_Head->GetNodeNext(); //定义一个结点类指针,指向第0位的结点

if(NULL == pTemp)

{

cout << "这是个空链" << endl;

}

while(pTemp != NULL)

{

pTemp->ShowNodeData();

++nTemp;

if(0 == nTemp % 5 && nTemp != 0) //控制每行只能输出5个结点的内容

{

cout << endl;

}

pTemp = pTemp->GetNodeNext();

}

}

//class CNode

#include "CNode.h"

CNode::CNode() //构造函数

{

//m_stStudent = {0};

m_Next = NULL;

}

CNode::~CNode() //析构函数

{

}

void CNode::SetNodeData()

{

char* pNumber = new char[30]; //用来接收字符串的临时变量

char* pName = new char[30];

char* pAppearance = new char[30];

cout << "学生学号: " << endl;

cin >> pNumber;

m_stStudent.m_strNumber = pNumber;

cout << "姓名: " << endl;

cin >> pName;

m_stStudent.m_strName = pName;

cout << "性别: " << endl;

cin >> m_stStudent.m_chSex;

cout << "出生年月: " << endl;

cout << "m_stData.m_nYear" << endl;

cin >> m_stStudent.m_stData.m_nYear;

cout << "m_stData.m_nMonth" << endl;

cin >> m_stStudent.m_stData.m_nMonth;

cout << "m_stData.m_nDay" << endl;

cin >> m_stStudent.m_stData.m_nDay;

cout << "政治面貌: " << endl;

cin >> pAppearance;

m_stStudent.m_strAppearance = pAppearance;

cout << "五门课成绩: " << endl;

cout << "m_dSubject_1: " << endl;

cin >> m_stStudent.m_stResult.m_dSubject_1;

cout << "m_dSubject_2: " << endl;

cin >> m_stStudent.m_stResult.m_dSubject_2;

cout << "m_dSubject_3: " << endl;

cin >> m_stStudent.m_stResult.m_dSubject_3;

cout << "m_dSubject_4: " << endl;

cin >> m_stStudent.m_stResult.m_dSubject_4;

cout << "m_dSubject_5: " << endl;

cin >> m_stStudent.m_stResult.m_dSubject_5;

delete []pNumber; //释放内存

pNumber = NULL; //指针置空

delete []pName; //释放内存

pName = NULL;

delete []pAppearance; //释放内存

pAppearance = NULL;

}

stStudent CNode::GetNodeData() //返回结点内容(即学生信息)

{

return m_stStudent;

}

void CNode::SetNodeNext(CNode* _Next)

{

m_Next = _Next;

}

void CNode::ShowNodeData()

{

const char* pNumber = m_stStudent.m_strNumber.c_str(); //用来接收字符串的临时变量

const char* pName = m_stStudent.m_strNumber.c_str();

const char* pAppearance = m_stStudent.m_strAppearance.c_str();

cout << "学生学号: " << pNumber << '\t' << "姓名: " << pName << '\t' << "性别: " << m_stStudent.m_chSex;

cout << "出生年月: " << m_stStudent.m_stData.m_nYear << ',' << m_stStudent.m_stData.m_nMonth << ',' << m_stStudent.m_stData.m_nDay;

cout << "政治面貌: " << pAppearance << "五门课成绩: " << endl;

cout << "m_dSubject_1: "<< m_stStudent.m_stResult.m_dSubject_1<< endl;

cout << "m_dSubject_2: "<< m_stStudent.m_stResult.m_dSubject_2<< endl;

cout << "m_dSubject_3: "<< m_stStudent.m_stResult.m_dSubject_3<< endl;

cout << "m_dSubject_4: "<< m_stStudent.m_stResult.m_dSubject_4<< endl;

cout << "m_dSubject_5: "<< m_stStudent.m_stResult.m_dSubject_5<< endl;

}

CNode* CNode::GetNodeNext()

{

return m_Next;

}

#include "CLinkList.h"

#include "CNode.h"

void Text(); //测试函数声明

int main()

{

cout << "这是mian函数" << endl;

Text();

return 0;

}

void Text()

{

cout << "这个是测试函数" << endl;

LinkList* pList = new LinkList; //创建一个内存链表对象

cout << "------------------CreateList-----------------------------" << endl;

pList->CreateList(); //初始化链表的函数成员

pList->ShowList();

cout << endl;

cout << "------------------GetListNode-----------------------------" << endl;

LinkNode* pNode = NULL; //定义一个临时的结点类指针用于检测查找函数成员

pNode = pList->GetListNode(3); //按位置查找指定位结点的成员函数的测试

if(pNode)

{

cout << "用按位置查找的方法找到了指定位结点" << endl;

}

else

{

cout << "对不起,用按位置查找的方没有找到指定位结点" << endl;

}

cout << endl;

cout << "------------------InsertList-----------------------------" << endl;

pList->InsertList(0); //插入结点的成员函数的测试

pList->ShowList();

cout << endl;

cout << "------------------DeleteList-----------------------------" << endl;

pList->DeleteList(0); //删除某一结点的成员函数的测试

pList->ShowList();

cout << endl;

cout << "------------------GetHeadList-----------------------------" << endl;

pNode = NULL;

pNode = pList->GetHeadList(); //获取头指针的成员函数的测试

if(pNode)

{

cout << "已经返回了头指针" << endl;

}

else

{

cout << "对不起,头指针为空" << endl;

}

cout << endl;

cout << "------------------GetHeadList-----------------------------" << endl;

pList->SetListData(3); //设置链表中某一结点的值的成员函数的测试

pList->ShowList();

cout << endl;

cout << "------------------GetListData-----------------------------" << endl;

cout << "pList->ShowListData(3) =";

pList->ShowListData(3); //获取链中某一结点值的成员函数的测试

cout << endl;

cout << "------------------DestroyList(3)-----------------------------" << endl;

pList->DestroyList(3); //销毁第3位置以后链表的成员函数的测试

pList->ShowList();

cout << endl;

cout << "------------------DestroyList(0)-----------------------------" << endl;

pList->DestroyList(0); //销毁第0位置以后链表的成员函数的测试

pList->ShowList();

cout << endl;

delete pList; //释放内存

pList = NULL; //指针置空

}

你的要求太多 , 没仔细看, 我把我给别人写的赋值给你吧 , 我已经写的很全了,程序有问题可以给我留言

这个自己看下 不过是用C实现的

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#define MAXSIZE 1000

typedef char datatype;

typedef struct {

datatype a[MAXSIZE];

int size;

}e_list;

e_list s;

e_list t;

void ptint_slt(e_list slt); /*输出文本*/

void letter_number(e_list slt); /*全部字母个数*/

void space_number(e_list slt); /*全部空格个数*/

void digit_number(e_list slt); /*全部数字总数*/

void size_number(e_list slt); /*文章总字数*/

void dele_print(e_list p,e_list slt); /*输出删除某一字符串后的文章*/

void ptint_slt(e_list slt) /*输出文本*/

{

int i,j=0;

if(!slt.size) {printf("\n错误!");exit(1);}

else

for(i=0;i<slt.size;i++)

{

printf("%c",slt.a[i]);

j++;

if(j%20==0) printf("\n");

}

}

void letter_number(e_list slt) /*全部字母个数*/

{

int i,j=0;

if(!slt.size) {printf("\n错误!");exit(1);}

else

for(i=0;i<slt.size;i++)

{

if((slt.a[i]>='a'&&slt.a[i]<='z')||(slt.a[i]>='A'&&slt.a[i]<='Z'))

j++;

}

printf("%d",j);

}

void space_number(e_list slt) /*全部空格个数*/

{

int i,j=0;

if(!slt.size) {printf("\n错误!");exit(1);}

else

for(i=0;i<slt.size;i++)

{

if(slt.a[i]==' ')

j++;

}

printf("%d",j);

}

void digit_number(e_list slt) /*全部数字总数*/

{

int i,j=0;

if(!slt.size) {printf("\n错误!");exit(1);}

else

for(i=0;i<slt.size;i++)

{

if(slt.a[i]>='0'&&slt.a[i]<='9')

j++;

}

printf("%d",j);

}

void size_number(e_list slt) /*文章总字数*/

{

printf("%d",slt.size);

}

void dele_print(e_list p,e_list slt) /*输出删除某一字符串后的文章*/

{

int i,j,succ;

i=0;succ=0; /*用i扫描正文t,succ为匹配成功标志*/

while((i<=slt.size-p.size+1)&&(!succ))

{

j=0;succ=1; /*用j扫描模式p*/

while((j<=p.size-1)&&succ)

if(p.a[j]==slt.a[i+j]) j++;

else succ=0;

i++;

}

if(succ)

{

for(j=0;j<(slt.size-p.size-1);j++)

{

slt.a[i-1]=slt.a[i+p.size-1];

i++;

}

slt.size=slt.size-p.size;

for(i=0;i<slt.size;i++)

{

printf("%c",slt.a[i]);

}

printf("\n");

}

else printf("\n错误!没有与字符串相配的子串!");

}

void main()

{

int i;

int right;

s.size=0;

for(i=0;i<MAXSIZE;i++)

{

s.a[i]=getchar();

s.size++;

if(s.a[i]=='\n') {s.size--; break;}

}

printf("\n文本录入完毕!输出的文本为..\n");

ptint_slt(s);

printf("\n全部字母个数为:");

letter_number(s);

printf("\n全部空格个数为:");

space_number(s);

printf("\n全部数字个数为:");

digit_number(s);

printf("\n文章总字数为:");

size_number(s);

printf("\n要删除的字符串为:");

for(i=0;i<MAXSIZE;i++)

{

t.a[i]=getchar();

t.size++;

if(t.a[i]=='\n') {t.size--; break;}

}

printf("\n删除字符串后的结果为:");

dele_print(t,s);

}