东北大学秦皇岛分校数据结构实验报告.doc

上传人:飞****2 文档编号:51825403 上传时间:2022-10-20 格式:DOC 页数:61 大小:1.03MB
返回 下载 相关 举报
东北大学秦皇岛分校数据结构实验报告.doc_第1页
第1页 / 共61页
东北大学秦皇岛分校数据结构实验报告.doc_第2页
第2页 / 共61页
点击查看更多>>
资源描述

《东北大学秦皇岛分校数据结构实验报告.doc》由会员分享,可在线阅读,更多相关《东北大学秦皇岛分校数据结构实验报告.doc(61页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、数据结构实验报告(数据结构)班级学号学生姓名提交日期2014年12月9日成 绩 :计算机与通信工程学院2013实验一 线性表的应用【实验目的】:1、掌握线性表的逻辑结构定义2、掌握线性表的两种存储结构(顺序和链式)3、掌握顺序表和链表的定义及基本操作【实验内容】通过编程完成具有一定实际意义的课题,加深对线性表应用的理解和掌握。参考题目如下所示。学生可在完成以下题目之后经指导教师同意自行设计其它选题并将选题源程序与执行结果提交指导教师审阅。1、实验题目:字母链表n 功能要求:生成26个字母的线性表,并实现对特定字母的插入和删除。n 程序说明:使用顺序表或者链表生成字母有序表,并应用相应数据结构实

2、现对单个字母的插入和删除操作。其中,结构体或类的使用,可参考教材、辅导教材或其它应用实例。源程序如下:#include#includetypedef struct listchar data;struct list*link;test;test *p,*q,*r,*head,*d;int L;int m=sizeof(test);void build();void display();int insert_char(char,char);int delet_char(char);void build()int i;head=(test*)malloc(m);p=head;for(i=1;ida

3、ta=i+a-1;p-link=(test*)malloc(m);p=p-link;p-data=i+a-1;p-link=NULL;void display(int l)d=head;while(d-link!=NULL)printf(%c-,d-data);d=d-link;printf(%cn,d-data);printf(the list length is:%dn,l);int insert_char(char X,char Y)p=head;r=(test*)malloc(m);r-data=X;if (Ydata=Y)head=r;r-link=p;elsewhile(p-dat

4、a!=Y)&(p-link!=NULL) q=p;p=p-link;if(p-data=Y)q-link=r;r-link=p;elsep-link=r,r-link=NULL;L+;return L;int delet_char(char X)p=head;if (Xdata=X)head=head-link;free(p);elsewhile(p-data!=X)&(p-link!=NULL)q=p;p=p-link;if(p-data=X)q-link=p-link;free(p);else return(-1);L-;return L;int main(void)int m,x,y,z

5、,l;L=26;build();display(L);printf(n请选择:1.插入字母 2.删除字母n);m=getchar();fflush(stdin);/清除键盘缓冲区switch(m)case 1:printf(you will insert the char X before char Y:n);scanf(%c,%c,&x,&y);display(insert_char(x,y);break;case 2:printf(you will Delete the char X:n);scanf(%c,&z);l=delet_char(z);display(l);break;defa

6、ult:printf(ERROR,please input your choice of: 1 or 2n);break;2、实验题目:链表的创建n 功能要求:使用简单数据类型,利用指针创建一个基本链表。n 程序说明:使用指针,通过在头结点之后插入新节点的操作,逐步生成基本链表。其中,结构体或类的使用,可参考教材、辅导教材或其它应用实例。源程序如下:#include stdlib.h#include stdio.h#includestruct listint data;struct list*next;typedef struct list node;typedef node *link;in

7、t main()link ptr,head;int num,i;head=(link)malloc(sizeof(node);ptr=head;printf(please input 5 numbers=n);for(i=0;idata=num;ptr-next=(link)malloc(sizeof(node);if(i=4)ptr-next=NULL;else ptr=ptr-next;ptr=head;while(ptr!=NULL)printf(The value is =%dn,ptr-data);ptr=ptr-next;3、 实验题目:链表的逆序输出n 功能要求:使用简单数据类型

8、,利用指针创建一个基本链表。n 程序说明:使用指针,通过在尾结点之前插入新节点的操作,逐步逆序生成基本链表,之后,利用头结点实现顺序输出,以达到链表逆序的功能。其中,结构体或类的使用,可参考教材、辅导教材或其它应用实例。#include #include struct list int data; struct list*next;typedef struct list node ;typedef node *link;int main()link ptr,head,tail; int N,num,i,L=0; tail=(link)malloc(sizeof(node); tail-next

9、=NULL; ptr=tail; printf(nplease input the num of the data=n); scanf(%d,&N); printf(nplease input %d data=n,N); for(i=0;idata=num; head=(link)malloc(sizeof(node); head-next=ptr; ptr=head; ptr=ptr-next; /*从尾结点向前插入生成链表*/while(ptr!=NULL)printf(The value is=%dn,ptr-data); /*结点输出*/ ptr=ptr-next;L+;/*计算链表结

10、点个数*/printf(The langth of the link is=%dn,L);4、 连接两个链表n 功能要求:使用简单数据类型,利用指针创建一个基本链表。n 程序说明:使用指针,首先使用程序一生成两个基本链表,之后使用两个链表的头尾指针相连,从而实现两个链表的连接。其中,结构体或类的使用,可参考教材、辅导教材或其它应用实例。源程序如下:#include #include struct listint data;struct list*next;typedef struct list node;typedef node *link;link create_list(int array

11、,int num)link tmp1,tmp2,pointer;int i;pointer=(link)malloc(sizeof(node);pointer-data=array0;tmp1=pointer;for(i=0;inext=NULL;tmp2-data=arrayi;tmp1-next=tmp2;tmp1=tmp1-next;return pointer;int display(link ptr)while(ptr!=NULL)printf(%d-,ptr-data);ptr=ptr-next;printf(n);link concatenate(link pointer1,li

12、nk pointer2)link tmp;tmp=pointer1;while(tmp-next)tmp=tmp-next;tmp-next=pointer2;return pointer1;void main(void)int arr1=3,12,8,9,11; int arr2=55,39,17,21,76; link ptr,ptr1,ptr2,ptr3;ptr1=create_list(arr1,5);display(ptr1);ptr2=create_list(arr2,5);display(ptr2);ptr3=concatenate(ptr1,ptr2);display(ptr3

13、);实验二 栈与队列的应用【实验目的】:1、 掌握栈和队列的结构定义和特性2、 掌握栈和队列的基本操作以及栈和队列在程序设计中的应用。【实验内容】通过编程完成具有一定实际意义的课题,加深对栈与队列应用的理解和掌握。参考题目如下所示。学生可在完成以下题目之后经指导教师同意自行设计其它选题并将选题源程序与执行结果提交指导教师审阅。1、实验题目:利用栈实现数制转换n 功能要求:使用栈完成十进制数到各种不同进制数的数制转换。n 程序说明:利用堆栈工作原理实现对任意十进制数的数值转换操作。其中,实现堆栈功能的各个库函数由自行建立的头文件“stack.h”提供,“stack.h”可参考授课教材相关章节,结

14、构体或类的使用,可参考教材、辅导教材或其它应用实例。#define OVERFLOW -1#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define STACK_INIT_SIZE 100#define STACKINCREMENT 10/定义栈中的常量typedef int Status;/指定栈操作的返回值类型typedef int SElemType;/定义栈元素的数据类型struct STACKSElemType *base;SElemType *top;int stacksize;typedef struct STA

15、CK SqStack;typedef struct STACK *pSqStack;/栈结构的定义Status InitStack(SqStack &S);Status StackEmpty(SqStack S);Status Push(SqStack &S,SElemType e);Status Pop(SqStack &S,SElemType &e);/栈的基本操作函数声明#include #include int e;SqStack S;/全局变量定义void conversion(int n,int f); /数制转换函数声明;int main()int N,F;printf(请输入待

16、转换数制:n);scanf(%d,&F);printf(Input a number to convert to %d:n,F);scanf(%d,&N);conversion(N,F);getchar();printf(nn);return 0;/主程序Status StackEmpty(SqStack S)if(S.top=S.base)return TRUE;elsereturn FALSE;/StackEmpty();Status InitStack(SqStack &S)/*S=(pSqStack)malloc(sizeof(SqStack);S.base=(SElemType *)

17、malloc(STACK_INIT_SIZE *sizeof(SElemType);if(!S.base)exit(OVERFLOW);S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;/initStack();Status Push(SqStack &S,SElemType e)if(S.top - S.base=S.stacksize) if(!S.base)exit(OVERFLOW);S.base=(SElemType *)realloc(S.base,(S.stacksize + STACKINCREMENT)*sizeof(SEl

18、emType);S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;*(S.top+)=e;return OK;/ Push();Status Pop(SqStack &S,SElemType &e)if(S.top=S.base)return ERROR;/*e=*(-(S.top);-S.top;e=*S.top;return OK;/Pop();void conversion(int n,int f)InitStack(S);if (n);return;if(!n) Push(S,0);while(n)Push(S,n%f);n=n/

19、f;printf(the result is: );while(!StackEmpty(S)Pop(S,e);printf(%d,e);2、实验题目:简单四则运算程序n 功能要求:使用堆栈数据结构,完成10以内的四则运算。n 程序说明:按照操作符的优先级,使用堆栈数据结构,由左至右读入字符并判定计算步骤完成操作,并生成结果输出。其中,实现堆栈功能的各个库函数由自行建立的头文件“stack.h”提供,“stack.h”可参考授课教材相关章节,结构体或类的使用,可参考教材、辅导教材或其它应用实例。#include#include#include#include stack.h#define OVE

20、RFLOW -1#define OK 1#define ERROR 0#define STACK_INIT_SIZE 100#define STACKINCREMENT 10typedef char SElemType;typedef int Status;struct STACKSElemType *base;SElemType *top;int stacksize;typedef struct STACK SqStack;typedef struct STACK *pSqStack;/*堆栈的基本数据定义*/Status InitStack(SqStack *S);Status Destr

21、oyStack(SqStack *S);SElemType GetTop(SqStack S);Status Push(SqStack *S,SElemType *e);Status Pop(SqStack *S,SElemType *e);Status StackTraverse(SqStack S,Status(*visit)(SElemType *e);/*堆栈基本操作的函数声明*/Status InitStack(SqStack *S)(*S)=(SqStack*)malloc(sizeof(SqStack);(*S)-base=(SElemType *)malloc(STACK_IN

22、IT_SIZE *sizeof(SElemType);if(!(*S)-base)exit(OVERFLOW);(*S)-top=(*S)-base;(*S)-stacksize=STACK_INIT_SIZE;return OK;/*堆栈的初始化*/Status DestroyStack(SqStack *S)free(S-base);free(S);return OK;/*堆栈的销毁操作*/SElemType GetTop(SqStack S)if(S.top=S.base) return ERROR;return *(S.top-1);/*取得栈顶元素*/Status Push(SqSt

23、ack *S,SElemType e)if(S-top - S-base=S-stacksize)S-base=(SElemType *)realloc(S-base,(S-stacksize + STACKINCREMENT)*sizeof(SElemType);if(!S-base)exit(OVERFLOW);S-top=S-base+S-stacksize;S-stacksize+=STACKINCREMENT;*(S-top+)=e;return OK;/*将数据压栈*/Status Pop(SqStack *S,SElemType *e)if(S-top=S-base)return

24、 ERROR;*e=*(-(S-top);return OK;/*数据从堆栈弹出*/Status StackTraverse(SqStack S,Status (*visit)(SElemType *e)while (S.topS.base)visit(-S.top);return OK;/*堆栈的遍历*/char OP10=+,-,*,/,(,),#;int precede77=1,1,2,2,2,1,1,1,1,2,2,2,1,1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,2,2,2,2,2,3,0,1,1,1,1,0,1,1,2,2,2,2,2,0,3;/*对数据操作符数组

25、OP及优先权矩阵的定义*/int In(char c,char *op)int i=0;while(i7)if(c=opi+)return 1;return 0;/*判断输入字符是否为操作符,否则将其认为是数字*/char Precede(char op,char c)int pos_op;int pos_c;int i;for (i=0;i;case 2: return ;case 3: return =;return OK;/*对判定为操作符的字符根据优先权矩阵判断其优先顺序*/char Operate(int a,char theta,int b)switch(theta)case +:

26、 return a+b-0;case -: return a-b+0;case *: return (a-0)*(b-0)+0;case /: return (a-0)/(b-0)+0;return OK;/*对表达式进行计算,返回计算结果*/char EvaluateExpression()SqStack *OPND,*OPTR;char c,x,theta;char a,b;InitStack(&OPTR); Push(OPTR,#);InitStack(&OPND);c=getchar();while(c!=#|GetTop(*OPTR)!=#)if(!In(c,OP)Push(OPND

27、,c);c=getchar();/*使用OPND栈存放数字*/elseswitch (Precede(GetTop(*OPTR),c)case :Pop(OPTR,&theta);Pop(OPND,&b);Pop(OPND,&a);Push(OPND,Operate(a,theta,b);break;/*使用栈操作进行表达式的计算*/c=GetTop(*OPND); /*取得 OPND栈顶元素为最终结果*/DestroyStack(OPTR);DestroyStack(OPND);return c;int main()char i;printf(nnn表达式只能连续输入0.9单个数字及+-*/

28、四个运算符,以#结束:n);i=EvaluateExpression();printf(nThis expressions result is: );printf(%dnnnn,i-0);3、 实验题目:表达式括号匹配程序n 功能要求:使用堆栈,对整行输入的表达式进行括号匹配操作,并判定匹配与否将结果输出。n 程序说明:使用堆栈与字符比较,判定表达式括号是否匹配。其中,实现堆栈功能的各个库函数由自行建立的头文件“stack.h”提供,“stack.h”可参考授课教材相关章节,结构体或类的使用,可参考教材、辅导教材或其它应用实例。#include#include#include stack.h#

29、define OVERFLOW -1#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define STACK_INIT_SIZE 100#define STACKINCREMENT 10typedef int SElemType;typedef int Status;struct STACKSElemType *base;SElemType *top;int stacksize;typedef struct STACK SqStack;typedef struct STACK *pSqStack;/*堆栈的基本数据定义*/Sta

30、tus InitStack(SqStack *S);Status StackEmpty(SqStack S);Status Push(SqStack *S,SElemType *e);Status Pop(SqStack *S,SElemType *e);/*堆栈基本操作的函数声明*/Status InitStack(SqStack *S)(*S)=(SqStack*)malloc(sizeof(SqStack);(*S)-base=(SElemType *)malloc(STACK_INIT_SIZE *sizeof(SElemType);if(!(*S)-base)exit(OVERFLO

31、W);(*S)-top=(*S)-base;(*S)-stacksize=STACK_INIT_SIZE;return OK;/*堆栈的初始化*/Status StackEmpty(SqStack S)if(S.top=S.base)return TRUE;elsereturn FALSE;/*判断堆栈是否为空栈*/Status Push(SqStack *S,SElemType e)if(S-top - S-base=S-stacksize)S-base=(SElemType *)realloc(S-base,(S-stacksize + STACKINCREMENT)*sizeof(SEl

32、emType);if(!S-base)exit(OVERFLOW);S-top=S-base+S-stacksize;S-stacksize+=STACKINCREMENT;*(S-top+)=e;return OK;/*将数据压栈*/Status Pop(SqStack *S,SElemType *e)if(S-top=S-base)return ERROR;*e=*(-(S-top);return OK;/*数据从堆栈弹出*/Status AllBrackets_Test(SqStack *S,char *str)InitStack(&S); char *p;int c;for(p=str

33、;*p!=#;p+)if(*p=(|*p=|*p=)Push(S,*p);else if(*p=)|*p=|*p=)if(StackEmpty(*S) return ERROR;Pop(S,&c);if(*p=)&c!=()return ERROR;if(*p=&c!=)return ERROR;if(*p=&c!=)return ERROR;/end forif(!StackEmpty(*S)return ERROR;int main()SqStack S;char str50,c; char *s=str;int i=0;printf(请输入算术表达式,以#为结束:n);while(c!=

34、#)scanf(%c,&c);stri=c;i+;int tag=AllBrackets_Test(&S,s);if(tag)printf(nRight!n);elseprintf(nWrong!n);4、 堆栈与队列的遍历操作(可选)n 功能要求:使用简单数据类型,利用指针分别创建一个基本栈和一个基本队列,并使用指针将堆栈与队列元素按顺序输出。n 程序说明:使用指针,首先两个基本数据结构,之后分别使用两个不同数据结构的指针实现对各自元素的输出。其中,实现堆栈功能的各个库函数由自行建立的头文件“stack.h”提供,“stack.h”可参考授课教材相关章节,结构体或类的使用,可参考教材、辅导教

35、材或其它应用实例。#include#includestack.h#includequeue.h#define OVERFLOW -1#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define STACK_INIT_SIZE 100#define STACKINCREMENT 10typedef char SElemType;typedef char QElemType;typedef int Status;struct STACKSElemType *base;SElemType *top;int stacksize;type

36、def struct STACK SqStack;typedef struct STACK *pSqStack;typedef int Status;typedef struct QNodeQElemTypedata;struct QNode *next;QNode,*QueuePtr;typedef structQueuePtr front;QueuePtr rear;LinkQueue;/*堆栈的基本数据定义*/Status InitStack(SqStack *S);Status InitQueue(LinkQueue &Q);Status Push(SqStack *S,SElemTy

37、pe *e);Status EnQueue(LinkQueue &Q,QElemType e);Status QueueTraverse(LinkQueue Q,Status(*visit)();Status StackTraverse(SqStack S,Status(*visit)(SElemType *e);/*堆栈基本操作的函数声明*/Status InitStack(SqStack *S)(*S)=(SqStack*)malloc(sizeof(SqStack);(*S)-base=(SElemType *)malloc(STACK_INIT_SIZE *sizeof(SElemType);if(!(*S)-base)exit(OVERFLOW);(*S)-top=(*S)-base;(*S)-stacksize=STACK_INIT_SIZE;return OK;/*堆栈的初始化*/Status Push(SqStack *S,SElemType e)if(S-top - S-base=S-stacksize)S-base=(SEl

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁