ImageVerifierCode 换一换
格式:DOCX , 页数:40 ,大小:174.20KB ,
资源ID:12015166      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12015166.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构 实验报告.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构 实验报告.docx

1、数据结构 实验报告南京航空航天大学计算机实践实验报告数据结构学生姓名: 班级学号: 专业名称: 电气工程与自动化 2013年5月1.顺序表顺序表是一种线性结构,数据元素之间一个接一个的排列。顺序表的插入运算是指在第i个元素的位置上插入一个值为X的新元素,插入后使原表长增加1.顺序表的删除运算则是将表中的第i个元素从表中删除,删除后表长减1.实现方法:顺序表插入运算步骤:(1)将aian顺序向后移动,为新元素让出位置;(2)将x插入空出的第i个位置;(3)表长增加1顺序表删除运算步骤:(1)将ai+1an顺序向前移动;(2)表长减1程序原代码:#include #include using na

2、mespace std;#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE 0#define OVERFLOW 0#define LIST_INIT_SIZE 10 / 线性表存储空间的初始分配量#define LISTINCREMENT 10 / 线性表存储空间的分配增量#define ElemType int #define Status int typedef struct ElemType * elem; / 存储空间基址 int length; int listsize; SqList;

3、 Status Initlist_Sq(SqList &L) L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType ); if(!L.elem) exit(OVERFLOW); L.length=0; L.listsize=LIST_INIT_SIZE; return OK; /Initlist_SqStatus ListInsert_Sq(SqList &L,int i,ElemType e) if(iL.length+1) return ERROR; if(L.length=L.listsize) ElemType * newba

4、se; newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType); if(!newbase) exit(OVERFLOW); L.elem=newbase; L.listsize+=LISTINCREMENT; ElemType *q=&(L.elemi-1); for(ElemType *p=&(L.elemL.length-1);p=q;-p) *(p+1)=*p; *q=e; +L.length; return OK; /ListInsert_SqStatus ListDelete_Sq(

5、SqList &L,int i) ElemType e; if(iL.length) coutno found!endl; return ERROR; ElemType *p=&(L.elemi-1); e=*p; ElemType *q=L.elem+L.length-1; for(+p;p=q;+p) *(p-1)=*p; -L.length; couteendl; return OK; /ListDelete_SqStatus ListTraverse(SqList &L) int i; for(i=0;iL.length;i+) coutL.elemi ; return OK; /Li

6、stTraverseStatus List_Sort_Input(SqList &L) ElemType a; int i; coutInput the data(if(-1)stop): a; while(-1!=a) for(i=1;i=L.length&L.elemi-1a;i+); ListInsert_Sq(L,i,a);/ ListTraverse(L);/ coutendl; coutInput the data(if(-1)stop): a; return OK; / List_Sort_Input&ListInsert_Sqint main() int i,n; ElemTy

7、pe e; SqList L; Initlist_Sq(L);/ ListInput(L); List_Sort_Input(L); while(1) coutnchecking.n1.ListInsert_Sqn2.ListDelete_Sqn3.ListTraversen; coutn; switch(n) case 1: couti; cine; ListInsert_Sq(L,i,e); break; case 2: couti; ListDelete_Sq(L,i); break; case 3: ListTraverse(L); break; return 0;2.单链表单链表是一

8、种链式存储结构,结点中除数据域外增设一个指针域,指向直接后继结点。通过单链表实现数据的插入、删除不需要移动数据,只需修改指针的指向。实现方法:插入操作:1)找到待插入位置;2)申请、填装新结点;3)将新结点插入 删除操作:1)找到删除结点的位置;2)删除结点 程序源代码:#include #include #include using namespace std;#define Status bool#define ElemType int#define LEN sizeof(LNODE)typedef struct LNODE ElemType data; LNODE *next;LinkL

9、ist; LinkList *Initlist() LinkList *head; head=(LinkList *)malloc(sizeof(LinkList); head-next=NULL; return head; /initlist 初始化 LinkList *Insert(LinkList *head,LinkList *s) LinkList *p; p=head; while(p-next!=NULL&p-next-datadata) p=p-next; s-next=p-next; p-next=s; return head; /insert 插入Status Delete

10、(LinkList *head,LinkList *s) if(!head) exit(OVERFLOW); LinkList *p,*q; p=head; while(p-next&p-next-data!=s-data) p=p-next; q=p-next; p-next=q-next;else free(q);return ERROR; return OK; /Delete 删除LinkList *Create_Sort_LinkList() LinkList *p,*head=NULL; ElemType a; coutCreating a list .nendl; head=Ini

11、tlist(); couta; while(a!=-1) p= (LinkList *)malloc(sizeof(LinkList); p-data=a; Insert(head,p); couta; return head; if(p-next =NULL) /create sort(&insert) 创建有序链表Status Visit(LinkList *head) LinkList *p; p=head-next; if(NULL!=p) coutoutput list:; while(NULL!=p) headA=Create_Sort_LinkList(); Visit(head

12、A); cout请输入你要插入的数:a; p-data=a; Insert(headA, p); Visit(headA); cout请输入你要删除的数:b; s-data=b; Delete(headA,s); Visit(headA); return 0;3.二叉树二叉树的遍历是指按照某种顺序访问二叉树中的每个结点,使每个结点被访问一次且仅被访问一次。遍历是二叉树的常用结构,通常有先序遍历,中序遍历,后序遍历三种。实现方法:用递归的方式实现 程序源代码:#include using namespace std;#include #include #define Status bool#de

13、fine ElemType int /顺序表的数据类型#define TElemType int /树的数据类型#define QElemType BiTree /队列的数据类型#define LISTINITSIZE 100 /顺序表的最大存储数#define MAXQSIZE 100 /队列的最大存储数typedef struct ElemType *elem; / 存储空间基址 int length; / 当前长度 int listsize; / 当前分配的存储容量/ (以sizeof(ElemType)为单位) SqList; / 俗称 顺序表Status Initlist_Sq(Sq

14、List &L) L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType); if(!L.elem) exit(OVERFLOW); L.length=0; L.listsize=LIST_INIT_SIZE; return OK; /Initlist_SqStatus ListTraverse(SqList &L) int i; for(i=0;iL.length;i+) coutL.elemidata=S.elem1; /建立树根 T=ptr1; for(i=2;idata=S.elemi;/ if(i=S.length/2) /注

15、意这里要对叶节点的左右指针做处理 ptri-lchild=NULL; ptri-rchild=NULL; j=i/2; /找到结点i的双亲j if(i=j*2) /左孩子 if(ptrj) /判断双亲是否为空 ptrj-lchild=ptri; /i是j的左孩子 else /右孩子 if(ptrj) /判断双亲是否为空 ptrj-rchild=ptri; /i是j的右孩子 return OK;/CreateBitree_SqList/树的遍历/Status PreOrderTraverse(BiTree T) /先序遍历二叉树 if(T) coutdatalchild); / 遍历左子树 Pr

16、eOrderTraverse(T-rchild); / 遍历右子树 return OK;/PreOrdertypedef structQElemType *base; /指向树节点的指针数组 int front; int rear;SqQueue;Status InitQueue(SqQueue &Q) Q.base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType); if(!Q.base) exit(OVERFLOW); Q.front=Q.rear=0; return OK;/InitQueueStatus DeQueue(SqQueue &Q,

17、BiTree &p)/输出p是指针 if(Q.front=Q.rear) return ERROR; p=Q.baseQ.front; Q.front=(Q.front+1)%MAXQSIZE; return OK;/DeQueueStatus EnQueue(SqQueue &Q,BiTree T)/输入指针 if(Q.rear+1)%MAXQSIZE=Q.front) return ERROR; Q.baseQ.rear=T; Q.rear=(Q.rear+1)%MAXQSIZE; return OK;/EnQueueStatus QueueEmpty(SqQueue &Q) if(Q.f

18、ront=Q.rear) return OK; return ERROR;/QueueEmptyStatus InOrderTraverse(BiTree T) /中序遍历二叉树 if(T) InOrderTraverse(T-lchild); / 遍历左子树 coutdatarchild); / 遍历右子树 return OK;/InOrderStatus NextOrderTraverse(BiTree T) /后序遍历二叉树 if(T) NextOrderTraverse(T-lchild); / 遍历左子树 NextOrderTraverse(T-rchild); / 遍历右coutd

19、ata ; / 访问结点 return OK;/NextOrderint main() int i,j; TElemType data; cout创建一个二叉树endl; BiTree T; /定义树 SqList S; /顺序表 Initlist_Sq(S); /初始化顺序表 int arr100=0; /初始化数组 do couti; if(i!=0) coutdata; while(data=0) /data=0表示节点为空 cout结点位置不为0!; coutdata; if(ji) j=i; /找最大节点位置 arri=data; while(i!=0);S.elem=arr; /用

20、数组初始化顺序表S.length=j+1; /最大节点位置即表长 coutendl; CreateBiTree_SqList(T,S); cout先序遍历: endl; PreOrderTraverse(T); coutendl; cout中序遍历: endl; InOrderTraverse(T); coutendl; cout后序遍历: endl; NextOrderTraverse(T); coutendl; return OK;4.图图结构是一种比树形结构更复杂的非线性结构。通常用邻接矩阵或邻接表存储图结构。所谓邻接矩阵的存储结构就是用一维数组途中结点的信息,用矩阵表示图中各结点的关系

21、。邻接表则是顺序存储与链式存储相结合。 实现方法:邻接矩阵:建立一个一维数组存储图中结点的信息。两个结点之间若存在边关系则在相应的矩阵中存入1,否则存入0。邻接表:对于图中的每个结点vi,将所有的邻接于vi的顶点vj链成一个单链表,这个单链表就成为顶点vi的邻接表,再将所有的顶点的邻接表的表头放入数组中,构成图的邻接表。 算法实现:具体参见源程序代码。程序源代码:#include #include #include #include #include using namespace std;#define Status bool#define MAX_VERTEX_NUM 20#define

22、STR_LENGTH 5typedef char * VertexType;typedef struct ArcNode int adjvex; / 该弧所指向的顶点的位置 struct ArcNode *nextarc; / 指向下一条弧的指针ArcNode;typedef struct VNode VertexType data; / 顶点信息 字符串指针 ArcNode *firstarc;/ 指向第一条依附该顶点的弧VNode, AdjListMAX_VERTEX_NUM;typedef struct AdjList vertices; int vexnum, arcnum; / in

23、t kind; / 图的种类标志ALGraph;Status InitALGraph(ALGraph &G) /图的初始化 int i; for(i=0;iMAX_VERTEX_NUM;i+) /分配空间及指针初始化 G.verticesi.data=(char *)malloc(STR_LENGTH*sizeof(char); G.verticesi.firstarc=NULL;/指针初始化为0 return OK;/InitALGraphint LocateVex(ALGraph G,char *t)/查找顶点在邻接表中下标位置 int i; for(i=0;iG.vexnum;i+) /

24、逐个比较即可 if(strcmp(G.verticesi.data,t)=0) return i; return -1;/LocateVexStatus Build_AdjList(ALGraph &G) /输入有向图的顶点数,边数,顶点信息和边的信息建立邻接表/图的邻接表存储建立 int v,a; int m; int i,j; ArcNode *p,*q;/指针 char tSTR_LENGTH,hSTR_LENGTH;/临时存储顶点信息的字符串 InitALGraph(G);/初始化 coutv; while(v0) cout v cant =0! endl; coutv; /顶点数不能为负 G.vexnum=v; couta; while(a0) cout a cant =0! endl; couta; /边数不能为负G.arcnum=a; cout输入各个顶点的信息(字符或字符串):endl; cin.ignore();/忽略换行符 for(m=0;mv;m+) coutm顶点信息:; cin.getline(G.verticesm.data,STR_LENGTH); /输入各顶点的符号 cout输入各个边的信息(弧头和弧尾):endl; for(m=1;m=a;m+) /输入各个边信息 coutm边信息:endl; cou

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1