数据结构上机参考程序

合集下载

数据结构教程上机实验指导第六版

数据结构教程上机实验指导第六版

数据结构教程上机实验指导第六版数据结构是计算机科学中非常重要的一门课程,它研究的是数据在计算机中的存储和组织方式。

通过学习数据结构,可以更好地理解和利用计算机系统中的数据,提高程序的效率和性能。

在数据结构教程的第六版上,为了帮助学生更好地理解和应用所学知识,设计了一系列的实验指导。

这些实验涵盖了数据结构的各个方面,旨在通过实践来加深对理论知识的理解,并培养学生的问题解决能力和实践能力。

在第六版的实验指导中,首先介绍了数据结构的基本概念和常用的数据结构类型,如数组、链表、栈、队列、树、图等。

然后,通过实验来演示和应用这些数据结构,让学生能够真正地理解它们的特点和用途。

第一章的实验指导是关于数组和链表的,学生需要实现一个简单的数组和链表,并比较它们在插入、删除和查找等操作上的性能差异。

通过这个实验,学生可以明确了解到数组和链表的优缺点,并能够根据实际情况选择合适的数据结构。

第二章的实验指导是关于栈和队列的,学生需要实现一个栈和一个队列,并利用它们解决一些实际问题,如括号匹配、表达式求值等。

通过这个实验,学生可以掌握栈和队列的基本操作和应用场景。

第三章的实验指导是关于树的,学生需要实现一个二叉树和一个二叉查找树,并利用它们实现一些常用的操作,如插入、删除、查找、遍历等。

通过这个实验,学生可以了解到树的基本结构和算法,并掌握二叉查找树的原理和应用。

第四章的实验指导是关于图的,学生需要实现一个图和一个图的遍历算法,并利用它们解决一些实际问题,如最短路径问题、拓扑排序等。

通过这个实验,学生可以了解到图的基本概念和算法,培养解决复杂问题的能力。

除了以上的实验指导,第六版的数据结构教程还包括了一些扩展实验,如动态存储分配、排序算法、查找算法等。

这些实验可以帮助学生进一步巩固和拓展所学知识,并提供更多的实践机会。

第六版的数据结构教程上机实验指导是一份很有价值的学习资料。

通过实验指导,学生可以通过实践来巩固和应用所学的数据结构知识,提高问题解决能力和实践能力。

数据结构《数据结构》上机实验

数据结构《数据结构》上机实验
数据结构
上机实验
主讲教师:袁凌
数据结构
实验目的
1.加深对数据结构和算法的理解,进一步 提高学生编程能力; 2.培养和提高学生分析问题与解决问题的 综合能力; 3.整理资料,撰写规范的实验报告。
华中科技大学计算机学院
2
数据结构
实验要求
1. 独立完成,完全雷同者记0分;
2. 撰写实验报告,每个实验报告如下内容: 一、问题描述 二、算法和数据结构设计 三、C语言程序实现 四、程序测试 五、复杂度分析
华中科技大学计算机学院 8
实验题目
第二次上机试验
实验(三) 基于二叉链表,实现二叉树的下列运算。 ① 二叉树生成; ② 前序、中序和后序遍历; ③ 计算叶子数目; ④ 按层次遍历; ⑤ 求二叉树高度; 提示: ⑴ 提供一个实现功能的演示系统 ⑵ 具体物理结构和数据元素类型自行选定 ⑶ ②、③和⑤运算分别采用递归和非递归算法实现
⑶ 线性表数据可以使用磁盘文件永久保存
华中科技大学计算机学院
6
数据结构
实验题目
第一次上机试验
实验(二) 基于链式存储结构,实现线性表的基本的、常见 的运算。
提示:
⑴ 提供一个实现功能的演示系统 ⑵ 具体物理结构和数据元素类型自行选定
⑶ 线性表数据可以使用磁盘文件永久保存
华中科技大学计算机学院
7Байду номын сангаас
数据结构
3. 《实验报告》和《源程序》,以班为单位提交光盘。
华中科技大学计算机学院
3
数据结构
报告格式
华中科技大学计算机学院
4
数据结构
报告格式
华中科技大学计算机学院
5
数据结构
实验题目

〈数据结构〉上机实验指导

〈数据结构〉上机实验指导

〈数据结构〉上机实验指导数据结构是计算机科学中的一门重要课程,它研究的是数据的组织、存储和管理方式,以及对数据进行操作和处理的算法。

上机实验是数据结构课程的重要组成部分,通过实践操作,能够更好地理解和掌握数据结构的基本概念、算法和应用。

在进行〈数据结构〉上机实验之前,首先需要准备实验环境。

通常情况下,我们会使用一种编程语言来实现数据结构的相关操作,比如C++、Java等。

根据自己的实际情况和实验要求,选择一种合适的编程语言,并确保在实验环境中已经正确安装了相应的编译器或解释器。

接下来,我们可以开始进行具体的上机实验了。

下面以链表为例,介绍一下〈数据结构〉上机实验的指导步骤和要求:1. 实验目的:掌握链表的基本概念、操作和应用,理解链表与数组的区别和联系。

2. 实验原理:链表是一种动态数据结构,它由一系列的节点组成,每个节点包含数据和指向下一个节点的指针。

链表的特点是插入和删除操作的时间复杂度为O(1),但是查找操作的时间复杂度为O(n)。

3. 实验步骤:3.1 创建链表:首先,我们需要定义一个链表的结构体,包含数据和指针两个成员变量。

然后,通过动态内存分配来创建链表的节点,并将节点之间通过指针连接起来,形成一个完整的链表。

3.2 插入节点:可以在链表的任意位置插入一个新的节点。

插入节点的操作包括:创建一个新的节点,将新节点的指针指向插入位置的下一个节点,将插入位置的前一个节点的指针指向新节点。

3.3 删除节点:可以删除链表中的任意一个节点。

删除节点的操作包括:将要删除的节点的前一个节点的指针指向要删除的节点的下一个节点,然后释放要删除的节点的内存空间。

3.4 遍历链表:可以通过遍历链表来访问链表中的每一个节点,并对节点进行相应的操作。

遍历链表的操作包括:从链表的头节点开始,依次访问每个节点,直到链表的尾节点。

3.5 查找节点:可以根据节点的值来查找链表中的某一个节点。

查找节点的操作包括:从链表的头节点开始,依次比较每个节点的值,直到找到目标节点或者链表结束。

【免费下载】数据结构上机作业顺序表

【免费下载】数据结构上机作业顺序表
数据结构上机作业——顺序表
一、实验目的 理解线性表的逻辑结构、顺序存储结构和数据操作,熟练运用 Java 语言实
现线性表的基本操作,分析各种操作算法特点和时间复杂度。 熟悉 JCreator 调试程序的方法。
二、主要内容 1、按照教材 P37 编写顺序表类,在 SeqList 中增加 main 方法或者编写一个测 试类测试各方法的正确性。 说明:注意 package 路径,导入 LList,过程参考如下: 1)创建工程:File->New->Project,选择 Empty Project,输入工程名称及路径, 点击完成。
} 修改 main 方法,完成相应测试。
7)运行:执行 Run->Run File,若没有错误,系统将运行结果显示在 General Output 区域。
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,系电,力根通保据过护生管高产线中工敷资艺设料高技试中术卷资,配料不置试仅技卷可术要以是求解指,决机对吊组电顶在气层进设配行备置继进不电行规保空范护载高与中带资负料荷试下卷高问总中题体资,配料而置试且时卷可,调保需控障要试各在验类最;管大对路限设习度备题内进到来行位确调。保整在机使管组其路高在敷中正设资常过料工程试况中卷下,安与要全过加,度强并工看且作护尽下关可都于能可管地以路缩正高小常中故工资障作料高;试中对卷资于连料继接试电管卷保口破护处坏进理范行高围整中,核资或对料者定试对值卷某,弯些审扁异核度常与固高校定中对盒资图位料纸置试,.卷保编工护写况层复进防杂行腐设自跨备动接与处地装理线置,弯高尤曲中其半资要径料避标试免高卷错等调误,试高要方中求案资技,料术编试交写5、卷底重电保。要气护管设设装线备备置敷4高、调动设中电试作技资气高,术料课中并3中试、件资且包卷管中料拒含试路调试绝线验敷试卷动槽方设技作、案技术,管以术来架及避等系免多统不项启必方动要式方高,案中为;资解对料决整试高套卷中启突语动然文过停电程机气中。课高因件中此中资,管料电壁试力薄卷高、电中接气资口设料不备试严进卷等行保问调护题试装,工置合作调理并试利且技用进术管行,线过要敷关求设运电技行力术高保。中护线资装缆料置敷试做设卷到原技准则术确:指灵在导活分。。线对对盒于于处调差,试动当过保不程护同中装电高置压中高回资中路料资交试料叉卷试时技卷,术调应问试采题技用,术金作是属为指隔调发板试电进人机行员一隔,变开需压处要器理在组;事在同前发一掌生线握内槽图部内 纸故,资障强料时电、,回设需路备要须制进同造行时厂外切家部断出电习具源题高高电中中源资资,料料线试试缆卷卷敷试切设验除完报从毕告而,与采要相用进关高行技中检术资查资料和料试检,卷测并主处且要理了保。解护现装场置设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。

数据结构教程上机

数据结构教程上机

数据结构教程上机概述数据结构是计算机科学中非常重要的一个概念,它涉及到如何有效地组织和存储数据,以便在计算机程序中进行高效的操作。

数据结构可以是各种各样的,比如数组、链表、栈、队列、树、图等等。

在数据结构的学习过程中,除了理论知识的掌握外,实践上机也是非常关键的一部分。

在本教程中,我们将介绍一些常见的数据结构,并结合具体的上机实例,帮助读者更好地理解和应用数据结构。

实验环境在进行数据结构的上机实验之前,我们需要准备一些必要的工具和环境。

以下是我们推荐的实验环境:•操作系统:Windows、Mac OS、Linux等•编程语言:C、C++、Java等•开发环境:Visual Studio、Eclipse、IntelliJ IDEA等在本教程中,我们将以C语言为例,并使用Visual Studio作为开发环境。

读者可以根据自己的需求选择适合自己的环境和语言。

实验内容本教程的实验内容包括以下几个部分:1.数组操作:包括数组的创建、读取和修改元素、数组的遍历等。

2.链表操作:包括链表的创建、插入和删除节点、链表的遍历等。

3.栈和队列操作:包括栈和队列的创建、入栈和出栈、入队和出队等。

4.树操作:包括二叉树的创建、遍历和查找节点等。

5.图操作:包括图的创建、遍历和搜索算法等。

在每个实验内容中,我们将提供具体的上机实例,并提供相应的代码和实验步骤。

读者可以按照我们给出的步骤进行实验,并通过调试和运行代码来加深对数据结构的理解。

实验步骤下面以数组操作为例介绍实验步骤:1.打开Visual Studio,创建一个新的C语言项目。

2.在项目中创建一个新的源文件,命名为array.c。

3.在array.c中编写代码,实现以下功能:–创建一个整型数组并初始化。

–读取和修改数组中的元素。

–遍历数组并输出每个元素的值。

示例代码如下:```c #include <stdio.h>int main() { int arr[5] = {1, 2, 3, 4, 5};// 读取和修改元素printf(\。

《数据结构》上机实验报告—常用排序算法的实现

《数据结构》上机实验报告—常用排序算法的实现
return OK;
}
int InsertSort(Form &F)
{//对顺序表F作直接插入排序
int i,j;
int comp=0;//比较次数
int move=0;//移动次数
for(i=2;i<=F.length;i++)
{
comp++;
if(F.r[i].key<F.r[i-1].key)
{
high--;
move++;
}
F.r[low]=F.r[high];
if(low<high&&F.r[low].key<=p)
{
low++;
move++;
}
F.r[high]=F.r[low];
}
F.r[low]=F.r[0];
return low;
}
void main()
{
Form F;
Init_Form(F);
{
F.r[0]=F.r[i]; //F.r[0]是监视哨
F.r[i]=F.r[i-1];
j=i-2;
comp++;
if(F.r[0].key<F.r[j].key)
{//进行元素移动,以腾出位置插入F.r[i]
F.r[j+1]=F.r[j];// 记录后移
j--;
move++;
}
F.r[j+1]=F.r[0]; //在j+1处插入F.r[i]
2.实现快速排序算法。
3.实现折半插入排序。
4.采用几组不同数据测试各个排序算法的性能(比较次数和移动次数)。

数据结构与算法上机实验报告参考模板

数据结构与算法上机实验报告参考模板

数据结构与算法B上机实验报告第1次2011-10-02 顺序表的实现和基本操作第2次2011-10-29 二叉树的实现和递归遍历第3次2011-11-23 内部排序第4次2011-12-dd 实现图从邻接矩阵到邻接表存储转化第一次线性表数据结构一、上机实习题目线性链表操作——插入、删除、合并、排序、查找二数据结构设计(算法设计)源程序(#include <iostream>#define MaxSize 100using namespace std;typedef int ElemType;class SeqList{ElemType list[MaxSize];int length;public:SeqList() {length=0;}void SeqListSort(int i,ElemType x);void SeqListCreat(int n);void SeqListInset(int i,ElemType x);void SeqListDelete(int i);void SeqListMerge();int GetLength(){return length;}int SeqListFind(ElemType x);int SeqListIsEmpty();void SeqListPrint();}Mylist1,Mylist2;//创建顺序表void SeqList::SeqListCreat(int n){ElemType x;cout<<"请输入数据元素:";for (int i=0;i<n;i++){cin>>x;list[i]=x;length++;}}//对顺序表进行排序void SeqList::SeqListSort(int i,ElemType x) {for(int k=0;k<length;k++){for(i=k+1;i<=length;i++){if(list[k]>list[i]){x=list[k];list[k]=list[i];list[i]=x;}}}}//在顺序表L中的第i个位置插入新元素x void SeqList::SeqListInset(int i,ElemType x) {int k;if(length>=MaxSize)cout<<"表已满,无法插入!"<<endl;else if(i<0||i>length)cout<<"参数i不合理!"<<endl;else{for (k=length;k>=i;k--){list[k]=list[k-1];}list[i-1]=x;length++;}}//删除第i个位置的数据元素void SeqList::SeqListDelete(int i){int k;if(!SeqListIsEmpty())cout<<"表已空,无法删除!"<<endl;else if(i<0||i>length)cout<<"参数i不合理!"<<endl;elsefor(k=i-1;k<length;k++)list[k]=list[k+1];length--;}//查找元素x在表中的位置int SeqList::SeqListFind(ElemType x) {int i=0;while(i<length&&list[i]!=x)i++;if(i>length)return -1;elsereturn i+1;}//判断顺序表是否为空int SeqList::SeqListIsEmpty(){if(length<=0)return 0;else return 1;}//将顺序表显示在屏幕上void SeqList::SeqListPrint(){if(!SeqListIsEmpty())cout<<"空表!"<<endl;elsefor(int i=0;i<length;i++)cout<<list[i]<<" ";cout<<endl;}int main(){SeqList Mylist1,Mylist2;int i,n,flag=1,select;ElemType x;cout<<"1. 建立顺序表\n";cout<<"2. 对顺序表进行排序\n";cout<<"3. 求x数值的位置\n";cout<<"4. 在第i个位置插入新元素x\n"; cout<<"5. 删除第i个位置上的数值\n"; cout<<"6. 将两个顺序表合并\n";cout<<"7. 退出\n";cout<<endl;while (flag){cout<<"请选择操作:";cin>>select;switch(select){case 1:cout<<"请输入顺序表1的长度:";cin>>n;Mylist1.SeqListCreat(n);cout<<"你所输入的顺序表1为:";Mylist1.SeqListPrint();cout<<"请输入顺序表2的长度:";cin>>n;Mylist2.SeqListCreat(n);cout<<"你所输入的顺序表2为:";break;case 2:cout<<"请选择所要排序的顺序表1或2:"; cin>>n;if(n==1){Mylist1.SeqListSort(i,x);cout<<"排序后的顺序表1为:";Mylist1.SeqListPrint();}else{Mylist2.SeqListSort(i,x);cout<<"排序后的顺序表2为:";Mylist2.SeqListPrint();}break;case 3:cout<<"请输入x的值:";cin>>x;i=Mylist1.SeqListFind(x);if(i!=-1) cout<<"x的位置为:"<<i<<endl;else cout<<"没有找到!";break;case 4:cout<<"请输入要插入的元素的位置和数值x:"; cin>>i>>x;cout<<"插入后的顺序表为:";Mylist1.SeqListPrint();break;case 5:cout<<"请输入要删除的元素的位置:";cin>>i;Mylist1.SeqListDelete(i);cout<<"删除后的顺序表为:";Mylist1.SeqListPrint();break;case 6:cout<<"合并后的顺序表为:\n";Mylist1.SeqListPrint();Mylist2.SeqListPrint();break;case 7:flag=0;break;}}}三运行结果为:四、上机环境和使用语言(计算机程序实现)Visual C++。

数据结构上机实验报告

数据结构上机实验报告

数据结构上机实验报告数据结构上机实验报告1. 实验目的数据结构是计算机科学中非常重要的一门课程,通过本次上机实验,旨在帮助学生巩固和应用所学的数据结构知识,培养学生分析和解决实际问题的能力。

2. 实验背景本次实验涉及到两个常用的数据结构:栈和队列。

栈是一种后进先出(Last In First Out,LIFO)的数据结构,而队列是一种先进先出(First In First Out,FIFO)的数据结构。

通过实验,我们将学习如何使用这两种数据结构来解决实际问题。

3. 实验内容本次实验分为两个部分:栈的应用和队列的应用。

3.1 栈的应用在栈的应用部分,我们将实现一个简单的括号匹配算法。

该算法可以判断一个字符串中的括号是否匹配。

具体实现步骤如下:3.1.1 创建一个栈来存储括号字符;3.1.2 遍历字符串中的每个字符;3.1.3 如果遇到左括号,则将其入栈;3.1.4 如果遇到右括号,则判断栈顶元素是否是对应的左括号;3.1.5 如果栈为空或栈顶元素不是对应的左括号,则括号不匹配;3.1.6 如果栈顶元素是对应的左括号,则将其出栈;3.1.7 遍历完字符串后,如果栈为空,则括号匹配,否则括号不匹配。

通过实现这个算法,我们可以学习到如何使用栈来解决实际问题,并且理解栈的后进先出的特性。

3.2 队列的应用在队列的应用部分,我们将实现一个简单的任务调度算法。

该算法可以模拟多个任务按照一定的优先级进行调度的过程。

具体实现步骤如下:3.2.1 创建一个队列来存储任务;3.2.2 每个任务包含两个属性:任务名称和优先级;3.2.3 向队列中添加任务,并按照优先级进行排序;3.2.4 从队列中取出优先级最高的任务,并执行;3.2.5 执行完任务后,继续从队列中取出下一个优先级最高的任务,并执行,直到队列为空。

通过实现这个算法,我们可以学习到如何使用队列来实现任务调度,并且理解队列的先进先出的特性。

4. 实验结果与分析通过实验,我们成功实现了括号匹配算法和任务调度算法,并得到了正确的结果。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构上机参考程序一元多项式表示及相加程序如下://Add Polynomial Pa and Pb#include<stdlib.h>#include<malloc.h>#include<conio.h>#include<stdio.h>Stuct Term{ float coef;int expn;struct Term *next;}LinkList;LinkList *CreateList_L(int n){int i;LinkList *p,*L;L=(LinkList *)malloc(sizeof(LinkList));L->next=NULL;for(i=n;i>0;--i){p=(LinkList *)malloc(sizeof(LinkList));printf(“input coef=”);scanf(“%d”,&p->coef);printf(“\n”);printf(“input expn=”);scanf(“%d”,&p->expn);printf(“\n”);p->next=L->next;L->next=p;}//end of forReturn L;}//end of function CreateListChar cmp(int qa_expn,int qb->expn){if(qa_expn==qb_expn)return‟=…;elseif(qa_expn>qb_expn)return‟>‟;else return‟<…;}//end of cmp() functionLinkList *Addpolyn(LinkList *pa, LinkList *pb) {LinkList *qa,*qb,*pre,*u;float sum;qa=pa->next;qb=pb->next;pre=pa;while(qa&&qb)switch(cmp(qa->expn,qb->expn)){case …<…:pre=qa;qa=qa->next;break;case‟=…:sum=qa->coef+qb->coef;if(sum!=0.0){qa->coef=sum;pre=qa;}else{pre->next=qa->next;free(qa);}qa=pre->next;u=qb;qb=qb->next;free(u);break;case‟>‟:u=qb->next;qb->next=qa;pre->next=qb;pre=qb;qb=u;break;}//end of switchif(!qa)pre->next=qb;free(qb);return pa;}end of Addpolyn() functionVoid main(){LinkList *pa,*pb,*pc,*p;int NodeNum_pa,NodeNum_pb;Printf(“input NodeNum_pa:”);Scanf(“%d”,& NodeNum_pa);printf(“Please input the pa.coef and pa.expn”);pa=CreateList_L(NodeNum_pa);Printf(“input NodeNum_pb:”);Scanf(“%d”,& NodeNum_pb);printf(“Please input the pb.coef and pb.expn”);pb= CreateList_L( NodeNum_pb);Pc=Addpolyn(pa,pb);P=pc;printf(“result:\n”);while(p->next){p=p->next;printf(“pc.coef=%d, pc.expn=%d\n”, p->coef, p- >expn );}//end of whilegetch();}end of main() function行编辑程序。

例如:输入:whli##ile(s#*s)outcha@putchar(*s=#++);输出:while(*s)putchar(*s++);程序如下:#include<stdio.h>#include<conio.h>#define SIZE 100#define char SElemTypetypedef struct{SElemType sq[SIZE]int top;}SqStack;void push(SqStack *s,SElemType e){if(s->top= =SIZE)printf(“overflow!\n”);else{s->top=s->top+1 ;s->sq[s->top]=e;}}//Pushvoid pop(SqStack *s){if(s->top==-1)printf(“error!\n”);else s->top--;}//Popmain(){ int i; SqStack S; SElemType ch;S.top=-1;printf(“Input:\n”);ch=getchar();while(ch!=…$‟){while(ch!=…$‟&&ch!=…\n‟){switch(ch){case‟#‟:Pop(&S);break;case‟@‟:s.top=-1;break;default:Push(&S,ch);break;}ch=getchar();}printf(“Output:\n”);for(i=0;i<=s.top;i++) printf(“c%”,s.sq[i]);s.top=-1`;if(ch!=…$‟) {printf(“Input:”); ch=getchar();}}}快速转置程序#include<stdio.h>#define SIZE 100typedef struct{int i,j;int e;}Triple;typedef struct{Triple data[SIZE];int mu,nu,tu;}TSMatrix;Main(){TSMatrix T,M;int t,p,q,col ,num[SIZE],cpot[SIZE];printf(“Input M.mu,M.nu,M.tu:”);scanf(“%d,%d,%d”,&M.mu,&M.nu,&M.tu);printf(“\n”);printf(“Input Matrix M:\n”);for(t=1;t<=M.tu;t++){ scanf(“%d,%d,%d”,&M.data[t].i,&M.data[t].j,&M.data[t].e);printf(“\n”);}…书中代码建立排序的二叉树和遍历二叉树#include<stdio.h>typedef struct bnode{int data;struct bnode *left,*right;}BiTree;BiTree *insert(BiTree *b, BiTree *s){if(b==NULL) b=s;else if(s->data==b->data) ;else if(s->data<b->data) b=insert(b->left,s);else if(s->data>b->data) b=insert(b->right,s);return b;}BiTree * createbitree(BiTree* bt){int x;BiTree *s;printf(“Input;”);do{scanf(“%d”,&x);s=(bnode *)malloc(sizeof(bnode));s->data=x;s->left=NULL;s->right=NULL;bt=insert(bt,s);}while(x!=-1);return bt;}void inorder(BiTree * bt){if(bt != NULL){ inorder(bt->lchild);printf(″%d ″,bt->data);inorder(bt->rchild); }}void main(){BiTree*root;root=NULL;root=createbitree(BiTree* root);inorder(BiTree * root);}图的遍历(深度优先)#include<stdio.h>#define MAX_VERTEX_NUM 20typedef int VertexType;typedef struct ArcNode{Struct ArcNode *nextarc;}ArcNode;typedef struct Vnode{VerterType data;ArcNode *firstarc;}VNode,AdjList[MAX_VERTEX_NUM ];int n;boll visited[MAX_VERTEX_NUM ];V oid create(AdjList *g){ArcNode *p,*q;int m,s,d,i;Printf(“请输入顶点数和边数:”);Scanf(“%d,%d”,&n,&m);for(i=1;i<=n;i++){g[i].data=i;g[i].firstarc=NULL;}for(i=1;i<=m;i++){Printf(“第%d条边的起始顶点编号和终止顶点编号:”,i); Scanf(“%d,%d”,&s,&d);While(s<1||s>n||d<1||d>n){Printf(“编号超出范围,重新输入:”);Scanf(“%d,%d”,&s,&d);}P= malloc(sizeof(ArcNode));P->adjvex=d;P->nextarc=NULL;if(!g[s].firstarc) g[s].firstarc=p;else {q=g[s].firstarc;while(q->nextarc) q=q->nextarc;q->nextarc=p;}}}V oid dfs(AdjList *g,int m){int w;if(!visited[m]) printf(“%d”,g[m].data); Visited[m]=true;P=g[m].firstarc;While(p){W=p->adjvex;if(!visited[w]) dfs(g,w);P=p->nextarc;}}V oid main(){int i;AdjList g;Create(&g);for(i=1;i<=n;i++) visited[i]=false;for(i=1;i<=n;i++) dfs(&g,i);}参见书168页图输入:8,181,21,32,12,42,53,13,63,74,24,85,25,86,36,77,37,68,48,5输出:12485367广度搜索void bfs(AdjList g,int n){int i,j,w;arcnode *p;int pri[max];i=1;j=1;//分别指示队头和队尾if(!visited[n]){printf(“%f”,g[n].data); visited[n]=1;pri[j]=n;j++;}while(i<j){p=g[i].firstarc;i++;while(!p){w=p->adjvex;if(!visited[w]){visited[w]=1;printf(“%f”,g[w].data);pri[j]=w;j++;}p=p->nextarc;}}}。

相关文档
最新文档