当前位置:文档之家› 数据结构(C语言版) 实验报告 (2)

数据结构(C语言版) 实验报告 (2)

数据结构(C语言版) 实验报告专业:计算机科学与技术学号:_______________________班级:_______________________姓名:_______________________指导教师:___________________青岛大学信息工程学院2014年10月实验1实验题目:顺序存储结构线性表的插入和删除实验目的:了解和掌握线性表的逻辑结构和顺序存储结构,掌握线性表的基本算法及相关的时间性能分析。

实验要求:建立一个数据域定义为整数类型的线性表,在表中允许有重复的数据;根据输入的数据,先找到相应的存储单元,后删除之。

实验主要步骤:1、分析、理解给出的示例程序。

2、调试程序,并设计输入一组数据(3,-5,6,8,2,-5,4,7,-9),测试程序的如下功能:根据输入的数据,找到相应的存储单元并删除,显示表中所有的数据。

程序代码:#include<stdio.h>#include<malloc.h>#include<stdlib.h>#define OK 1#define ERROR 0#define OVERFLOW -2#define LIST_INIT_SIZE 100typedef int status;typedef int ElemType;typedef struct{ElemType *elem;int length;int listsize;}sqlist;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 getelem_sq(sqlist &L){int i=0,e,d;printf("please input how many number you want to init\n");scanf("%d",&d);printf("please input the number you want to init\n");while(1){scanf("%d",&e);L.elem[i]=e;L.length++;i++;if(i>=d)break;}return OK;}status listdelet_sq(sqlist &L){int i=0,e;int *p;int *q;printf("please input the number you want to delete\n");scanf("%d",&e);for(i=0;i<L.length;i++){if(L.elem[i]==e){p=&L.elem[i];q=L.elem+L.length-1;for(++p;p<=q;++p)*(p-1)=*p;--L.length;break;}}return OK;}main(){int i=0;sqlist L;initlist_sq(L);getelem_sq(L);listdelet_sq(L);while(i<L.length){printf("%4d",L.elem[i]);i++;}}实验结果:心得体会:经过这次了解和掌握了线性表的逻辑结构和顺序存储结构,明白了线性表的基本算法。

实验2实验题目:单链表的插入和删除实验目的:了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。

实验要求:建立一个数据域定义为字符类型的单链表,在链表中不允许有重复的字符;根据输入的字符,先找到相应的结点,后删除之。

实验主要步骤:3、分析、理解给出的示例程序。

4、调试程序,并设计输入数据(如:A,C,E,F,H,J,Q,M),测试程序的如下功能:不允许重复字符的插入;根据输入的字符,找到相应的结点并删除。

5、修改程序:(1)增加插入结点的功能。

(2)建立链表的方法有“前插”、“后插”法。

程序代码:实验结果:心得体会:实验3实验题目:栈操作设计和实现实验目的:1、掌握栈的顺序存储结构和链式存储结构,以便在实际中灵活应用。

2、掌握栈的特点,即后进先出和先进先出的原则。

3、掌握栈的基本运算,如:入栈与出栈等运算在顺序存储结构和链式存储结构上的实现。

实验要求:回文判断:对于一个从键盘输入的字符串,判断其是否为回文。

回文即正反序相同。

如“abba”是回文,而“abab”不是回文。

实验主要步骤(1)数据从键盘读入;(2)输出要判断的字符串;(3)利用栈的基本操作对给定的字符串判断其是否是回文,若是则输出“Yes”,否则输出“No”。

程序代码:实验结果:心得体会:实验4实验题目:二叉树操作设计和实现实验目的:掌握二叉树的定义、性质及存储方式,各种遍历算法。

实验要求:采用二叉树链表作为存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历的操作,求所有叶子及结点总数的操作。

实验主要步骤:1、分析、理解程序。

2、调试程序,设计一棵二叉树,输入完全二叉树的先序序列,用#代表虚结点(空指针),如ABD###CE##F##,建立二叉树,求出先序、中序和后序以及按层次遍历序列,求所有叶子及结点总数。

程序代码:实验结果:心得体会:实验5实验题目:图的遍历操作实验目的:掌握有向图和无向图的概念;掌握邻接矩阵和邻接链表建立图的存储结构;掌握DFS及BFS对图的遍历操作;了解图结构在人工智能、工程等领域的广泛应用。

实验要求:采用邻接矩阵和邻接链表作为图的存储结构,完成有向图和无向图的DFS和BFS操作。

实验主要步骤:设计一个有向图和一个无向图,任选一种存储结构,完成有向图和无向图的DFS(深度优先遍历)和BFS(广度优先遍历)的操作。

1.邻接矩阵作为存储结构#include"stdio.h"#include"stdlib.h"#define MaxVertexNum 100 //定义最大顶点数typedef struct{char vexs[MaxVertexNum]; //顶点表int edges[MaxV ertexNum][MaxVertexNum]; //邻接矩阵,可看作边表int n,e; //图中的顶点数n和边数e}MGraph; //用邻接矩阵表示的图的类型//=========建立邻接矩阵=======void CreatMGraph(MGraph *G){int i,j,k;char a;printf("Input VertexNum(n) and EdgesNum(e): ");scanf("%d,%d",&G->n,&G->e); //输入顶点数和边数scanf("%c",&a);printf("Input Vertex string:");for(i=0;i<G->n;i++){scanf("%c",&a);G->vexs[i]=a; //读入顶点信息,建立顶点表}for(i=0;i<G->n;i++)for(j=0;j<G->n;j++)G->edges[i][j]=0; //初始化邻接矩阵printf("Input edges,Creat Adjacency Matrix\n");for(k=0;k<G->e;k++) { //读入e条边,建立邻接矩阵scanf("%d%d",&i,&j); //输入边(Vi,Vj)的顶点序号G->edges[i][j]=1;G->edges[j][i]=1; //若为无向图,矩阵为对称矩阵;若建立有向图,去掉该条语句}}//=========定义标志向量,为全局变量=======typedef enum{FALSE,TRUE} Boolean;Boolean visited[MaxVertexNum];//========DFS:深度优先遍历的递归算法======void DFSM(MGraph *G,int i){ //以Vi为出发点对邻接矩阵表示的图G进行DFS搜索,邻接矩阵是0,1矩阵给出你的编码//===========BFS:广度优先遍历=======void BFS(MGraph *G,int k){ //以Vk为源点对用邻接矩阵表示的图G进行广度优先搜索给出你的编码//==========主程序main=====void main(){int i;MGraph *G;G=(MGraph *)malloc(sizeof(MGraph)); //为图G申请内存空间CreatMGraph(G); //建立邻接矩阵printf("Print Graph DFS: ");DFS(G); //深度优先遍历printf("\n");printf("Print Graph BFS: ");BFS(G,3); //以序号为3的顶点开始广度优先遍历printf("\n");}2.邻接链表作为存储结构#include"stdio.h"#include"stdlib.h"#define MaxVertexNum 50 //定义最大顶点数typedef struct node{ //边表结点int adjvex; //邻接点域struct node *next; //链域}EdgeNode;typedef struct vnode{ //顶点表结点char vertex; //顶点域EdgeNode *firstedge; //边表头指针}VertexNode;typedef VertexNode AdjList[MaxVertexNum]; //AdjList是邻接表类型typedef struct {AdjList adjlist; //邻接表int n,e; //图中当前顶点数和边数} ALGraph; //图类型//=========建立图的邻接表=======void CreatALGraph(ALGraph *G){int i,j,k;char a;EdgeNode *s; //定义边表结点printf("Input VertexNum(n) and EdgesNum(e): ");scanf("%d,%d",&G->n,&G->e); //读入顶点数和边数scanf("%c",&a);printf("Input Vertex string:");for(i=0;i<G->n;i++) //建立边表{scanf("%c",&a);G->adjlist[i].vertex=a; //读入顶点信息G->adjlist[i].firstedge=NULL; //边表置为空表}printf("Input edges,Creat Adjacency List\n");for(k=0;k<G->e;k++) { //建立边表scanf("%d%d",&i,&j); //读入边(Vi,Vj)的顶点对序号s=(EdgeNode *)malloc(sizeof(EdgeNode)); //生成边表结点s->adjvex=j; //邻接点序号为js->next=G->adjlist[i].firstedge;G->adjlist[i].firstedge=s; //将新结点*S插入顶点Vi的边表头部s=(EdgeNode *)malloc(sizeof(EdgeNode));s->adjvex=i; //邻接点序号为is->next=G->adjlist[j].firstedge;G->adjlist[j].firstedge=s; //将新结点*S插入顶点Vj的边表头部}}//=========定义标志向量,为全局变量=======typedef enum{FALSE,TRUE} Boolean;Boolean visited[MaxVertexNum];//========DFS:深度优先遍历的递归算法======void DFSM(ALGraph *G,int i){ //以Vi为出发点对邻接链表表示的图G进行DFS搜索给出你的编码//==========BFS:广度优先遍历=========void BFS(ALGraph *G,int k){ //以Vk为源点对用邻接链表表示的图G进行广度优先搜索给出你的编码//==========主函数===========void main(){int i;ALGraph *G;G=(ALGraph *)malloc(sizeof(ALGraph));CreatALGraph(G);printf("Print Graph DFS: ");DFS(G);printf("\n");printf("Print Graph BFS: ");BFS(G,3);printf("\n");}实验结果:1.邻接矩阵作为存储结构2.邻接链表作为存储结构心得体会:实验6实验题目:二分查找算法的实现实验目的:掌握二分查找法的工作原理及应用过程,利用其工作原理完成实验题目中的内容。

相关主题