东北大学秦皇岛分校数据结构实验报告.docx
- 文档编号:24398423
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:93
- 大小:906.99KB
东北大学秦皇岛分校数据结构实验报告.docx
《东北大学秦皇岛分校数据结构实验报告.docx》由会员分享,可在线阅读,更多相关《东北大学秦皇岛分校数据结构实验报告.docx(93页珍藏版)》请在冰豆网上搜索。
东北大学秦皇岛分校数据结构实验报告
数据结构实验报告
(数据结构)
班级学号
学生姓名
提交日期
2014年12月9日
成绩
:
计算机与通信工程学院
2013
实验一线性表的应用
【实验目的】:
1、掌握线性表的逻辑结构定义
2、掌握线性表的两种存储结构(顺序和链式)
3、掌握顺序表和链表的定义及基本操作
【实验内容】
通过编程完成具有一定实际意义的课题,加深对线性表应用的理解和掌握。
参考题目如下所示。
学生可在完成以下题目之后经指导教师同意自行设计其它选题并将选题源程序与执行结果提交指导教师审阅。
1、实验题目:
字母链表
⏹功能要求:
生成26个字母的线性表,并实现对特定字母的插入和删除。
⏹程序说明:
使用顺序表或者链表生成字母有序表,并应用相应数据结构实现对单个字母的插入和删除操作。
其中,结构体或类的使用,可参考教材、辅导教材或其它应用实例。
源程序如下:
#include
#include
typedefstructlist{chardata;structlist*link;}test;
test*p,*q,*r,*head,*d;
intL;
intm=sizeof(test);
voidbuild();
voiddisplay();
intinsert_char(char,char);
intdelet_char(char);
voidbuild()
{inti;
head=(test*)malloc(m);
p=head;
for(i=1;i {p->data=i+'a'-1; p->link=(test*)malloc(m); p=p->link;} p->data=i+'a'-1; p->link=NULL; } voiddisplay(intl) {d=head; while(d->link! =NULL) {printf("%c->",d->data); d=d->link;} printf("%c\n",d->data); printf("thelistlengthis: %d\n",l); } intinsert_char(charX,charY) {p=head; r=(test*)malloc(m); r->data=X; if(Y<'a')Y=Y+32; if(head->data==Y) {head=r; r->link=p;} else{while((p->data! =Y)&&(p->link! =NULL)){q=p;p=p->link;} if(p->data==Y){q->link=r;r->link=p;} else{p->link=r,r->link=NULL;} } L++; returnL; } intdelet_char(charX) {p=head; if(X<'a')X=X+32; if(head->data==X){head=head->link;free(p);} else{while((p->data! =X)&&(p->link! =NULL)) {q=p; p=p->link;} if(p->data==X) {q->link=p->link; free(p);} elsereturn(-1); } L--; returnL; } intmain(void) {intm,x,y,z,l; L=26; build(); display(L); printf("\n请选择: 1.插入字母2.删除字母\n"); m=getchar(); fflush(stdin);//清除键盘缓冲区 switch(m) { case'1': printf("youwillinsertthecharXbeforecharY: \n"); scanf("%c,%c",&x,&y); display(insert_char(x,y)); break; case'2': printf("youwillDeletethecharX: \n"); scanf("%c",&z); l=delet_char(z); display(l); break; default: printf("ERROR,pleaseinputyourchoiceof: 1or2\n");break; } } 2、实验题目: 链表的创建 ⏹功能要求: 使用简单数据类型,利用指针创建一个基本链表。 ⏹程序说明: 使用指针,通过在头结点之后插入新节点的操作,逐步生成基本链表。 其中,结构体或类的使用,可参考教材、辅导教材或其它应用实例。 源程序如下: #include"stdlib.h" #include"stdio.h" #include structlist {intdata; structlist*next; }; typedefstructlistnode; typedefnode*link; intmain() {linkptr,head; intnum,i; head=(link)malloc(sizeof(node)); ptr=head; printf("pleaseinput5numbers==>\n"); for(i=0;i<=4;i++) {scanf("%d",&num); ptr->data=num; ptr->next=(link)malloc(sizeof(node)); if(i==4)ptr->next=NULL; elseptr=ptr->next; } ptr=head; while(ptr! =NULL) {printf("Thevalueis==>%d\n",ptr->data); ptr=ptr->next; } } 3、实验题目: 链表的逆序输出 ⏹功能要求: 使用简单数据类型,利用指针创建一个基本链表。 ⏹程序说明: 使用指针,通过在尾结点之前插入新节点的操作,逐步逆序生成基本链表,之后,利用头结点实现顺序输出,以达到链表逆序的功能。 其中,结构体或类的使用,可参考教材、辅导教材或其它应用实例。 #include #include structlist {intdata; structlist*next; }; typedefstructlistnode; typedefnode*link; intmain() {linkptr,head,tail; intN,num,i,L=0; tail=(link)malloc(sizeof(node)); tail->next=NULL; ptr=tail; printf("\npleaseinputthenumofthedata==>\n"); scanf("%d",&N); printf("\npleaseinput%ddata==>\n",N); for(i=0;i {scanf("%d",&num); ptr->data=num; head=(link)malloc(sizeof(node)); head->next=ptr; ptr=head; } ptr=ptr->next;/************************从尾结点向前插入生成链表*********/ while(ptr! =NULL) {printf("Thevalueis==>%d\n",ptr->data);/*****结点输出**********/ ptr=ptr->next; L++;/*******************计算链表结点个数**************/ } printf("Thelangthofthelinkis==>%d\n",L); } 4、连接两个链表 ⏹功能要求: 使用简单数据类型,利用指针创建一个基本链表。 ⏹程序说明: 使用指针,首先使用程序一生成两个基本链表,之后使用两个链表的头尾指针相连,从而实现两个链表的连接。 其中,结构体或类的使用,可参考教材、辅导教材或其它应用实例。 源程序如下: #include #include structlist {intdata; structlist*next; }; typedefstructlistnode; typedefnode*link; linkcreate_list(intarray[],intnum) {linktmp1,tmp2,pointer; inti; pointer=(link)malloc(sizeof(node)); pointer->data=array[0]; tmp1=pointer; for(i=0;i {tmp2=(link)malloc(sizeof(node)); tmp2->next=NULL; tmp2->data=array[i]; tmp1->next=tmp2; tmp1=tmp1->next; } returnpointer; } intdisplay(linkptr) {while(ptr! =NULL) {printf("%d->",ptr->data); ptr=ptr->next;} printf("\n"); } linkconcatenate(linkpointer1,linkpointer2) {linktmp; tmp=pointer1; while(tmp->next) tmp=tmp->next; tmp->next=pointer2; returnpointer1; } voidmain(void) {intarr1[]={3,12,8,9,11}; intarr2[]={55,39,17,21,76}; linkptr,ptr1,ptr2,ptr3; ptr1=create_list(arr1,5);display(ptr1); ptr2=create_list(arr2,5);display(ptr2); ptr3=concatenate(ptr1,ptr2);display(ptr3); } 实验二栈与队列的应用 【实验目的】: 1、掌握栈和队列的结构定义和特性 2、掌握栈和队列的基本操作以及栈和队列在程序设计中的应用。 【实验内容】 通过编程完成具有一定实际意义的课题,加深对栈与队列应用的理解和掌握。 参考题目如下所示。 学生可在完成以下题目之后经指导教师同意自行设计其它选题并将选题源程序与执行结果提交指导教师审阅。 1、实验题目: 利用栈实现数制转换 ⏹功能要求: 使用栈完成十进制数到各种不同进制数的数制转换。 ⏹程序说明: 利用堆栈工作原理实现对任意十进制数的数值转换操作。 其中,实现堆栈功能的各个库函数由自行建立的头文件“stack.h”提供,“stack.h”可参考授课教材相关章节,结构体或类的使用,可参考教材、辅导教材或其它应用实例。 #defineOVERFLOW-1 #defineOK1 #defineERROR0 #defineTRUE1 #defineFALSE0 #defineSTACK_INIT_SIZE100 #defineSTACKINCREMENT10//定义栈中的常量 typedefintStatus;//指定栈操作的返回值类型 typedefintSElemType;//定义栈元素的数据类型 structSTACK {SElemType*base; SElemType*top; intstacksize; }; typedefstructSTACKSqStack; typedefstructSTACK*pSqStack;//栈结构的定义 StatusInitStack(SqStack&S); StatusStackEmpty(SqStackS); StatusPush(SqStack&S,SElemTypee); StatusPop(SqStack&S,SElemType&e);//栈的基本操作函数声明 #include #include inte; SqStackS; //全局变量定义 voidconversion(intn,intf);//数制转换函数声明; intmain() {intN,F; printf("请输入待转换数制: \n"); scanf("%d",&F); printf("Inputanumbertoconvertto%d: \n",F); scanf("%d",&N); conversion(N,F); getchar(); printf("\n\n"); return0; } //主程序 StatusStackEmpty(SqStackS) {if(S.top==S.base)returnTRUE; else returnFALSE; }//StackEmpty(); StatusInitStack(SqStack&S) {//*S=(pSqStack)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; returnOK; }//initStack(); StatusPush(SqStack&S,SElemTypee) {if(S.top-S.base>=S.stacksize) {if(! S.base)exit(OVERFLOW); S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType)); S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; } *(S.top++)=e; returnOK; } //Push(); StatusPop(SqStack&S,SElemType&e) {if(S.top==S.base)returnERROR; //*e=*(--(S.top)); --S.top; e=*S.top; returnOK; } //Pop(); voidconversion(intn,intf) {InitStack(S); if(n<0) {printf("\nThenumbermustbeover0->"); return; } if(! n)Push(S,0); while(n){ Push(S,n%f); n=n/f; } printf("theresultis: "); while(! StackEmpty(S)){ Pop(S,e); printf("%d",e); } 2、实验题目: 简单四则运算程序 ⏹功能要求: 使用堆栈数据结构,完成10以内的四则运算。 ⏹程序说明: 按照操作符的优先级,使用堆栈数据结构,由左至右读入字符并判定计算步骤完成操作,并生成结果输出。 其中,实现堆栈功能的各个库函数由自行建立的头文件“stack.h”提供,“stack.h”可参考授课教材相关章节,结构体或类的使用,可参考教材、辅导教材或其它应用实例。 #include #include #include #include"stack.h" #defineOVERFLOW-1 #defineOK1 #defineERROR0 #defineSTACK_INIT_SIZE100 #defineSTACKINCREMENT10 typedefcharSElemType; typedefintStatus; structSTACK {SElemType*base; SElemType*top; intstacksize; }; typedefstructSTACKSqStack; typedefstructSTACK*pSqStack; /************************************************堆栈的基本数据定义*/ StatusInitStack(SqStack**S); StatusDestroyStack(SqStack*S); SElemTypeGetTop(SqStackS); StatusPush(SqStack*S,SElemType*e); StatusPop(SqStack*S,SElemType*e); StatusStackTraverse(SqStackS,Status(*visit)(SElemType*e)); /************************************************堆栈基本操作的函数声明*/ StatusInitStack(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; returnOK; } /************************************************堆栈的初始化*/ StatusDestroyStack(SqStack*S) { free(S->base); free(S); returnOK; } /************************************************堆栈的销毁操作*/ SElemTypeGetTop(SqStackS) {if(S.top==S.base)returnERROR; return*(S.top-1); } /************************************************取得栈顶元素*/ StatusPush(SqStack*S,SElemTypee) {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; returnOK; } /************************************************将数据压栈*/ StatusPop(SqStack*S,SElemType*e) {if(S->top==S->base)returnERROR; *e=*(--(S->top)); returnOK; } /************************************************数据从堆栈弹出*/ StatusStackTraverse(SqStackS,Status(*visit)(SElemType*e)) {while(S.top>S.base) visit(--S.top); returnOK; } /************************************************堆栈的遍历*/ charOP[10]={'+','-','*','/','(',')','#'}; intprecede[7][7]={ 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}; /*************************对数据操作符数组OP及优先权矩阵的定义*/ intIn(charc,char*op) {inti=0; while(i<7) if(c==op[i++]) return1; return0; } /*************************判断输入字符是否为操作符,否则将其认为是数字*/ charPrecede(charop,charc) {intpos_op; intpos_c; inti; for(i=0;i<7;i++) {if(op==OP[i])pos_op=i; if(c==OP[i])pos_c=i; } switch(precede[pos_op][pos_c]) {case1: return'>'; case2: return'<'; case3: return'='; } returnOK;} /*************************对判定为操作符的字符根据优先权矩阵判断其优先顺序*/ charOperate(inta,chartheta,intb) {switch(theta) {case'+': returna+b-'0'; case'-': returna-b+'0'; case'*': return(a-'0')*(b-'0')+'0'; case'/': return(a-'0')/(b-'0')+'0'; } returnOK;} /*************************对表达式进行计算,返回计算结果*/ charEvaluateExpre
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 东北大学 秦皇岛 分校 数据结构 实验 报告