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