数据结构C语言版严蔚敏著数据结构实验指导.doc
《数据结构C语言版严蔚敏著数据结构实验指导.doc》由会员分享,可在线阅读,更多相关《数据结构C语言版严蔚敏著数据结构实验指导.doc(48页珍藏版)》请在咨信网上搜索。
《数据结构》实验指导及报告书 (2012) / 学年 第 学期 姓 名:______________ 学 号:______________ 班 级:______________ 指导教师:______________ 信息科学与工程学院 2012 预备实验 C语言的函数数组指针结构体知识 一、实验目的 1、复习C语言中函数、数组、指针、结构体与共用体等的概念。 2、熟悉利用C语言进行程序设计的一般方法。 二、实验预习 说明以下C语言中的概念 1、 函数: 2、 数组: 3、指针: 4、结构体 5、共用体 三、实验内容和要求 1、调试程序:输出100以内所有的素数(用函数实现)。 #include<stdio.h> int isprime(int n){ /*判断一个数是否为素数*/ int m; for(m=2;m*m<=n;m++) if(n%m==0) return 0; return 1; } int main(){ /*输出100以内所有素数*/ int i; printf("\n"); for(i=2;i<100;i++) if(isprime(i)==1) printf("%4d",i); return 0; } 运行结果: 2、 调试程序:对一维数组中的元素进行逆序排列。 #include<stdio.h> #define N 10 int main(){ int a[N]={0,1,2,3,4,5,6,7,8,9},i,temp; printf("\nthe original Array is:\n "); for(i=0;i<N;i++) printf("%4d",a[i]); for(i=0;i<N/2;i++){ /*交换数组元素使之逆序*/ temp=a[i]; a[i]=a[N-i-1]; a[N-i-1]=temp; } printf("\nthe changed Array is:\n"); for(i=0;i<N;i++) printf("%4d",a[i]); return 0; } 运行结果: 3、 调试程序:在二维数组中,若某一位置上的元素在该行中最大,而在该列中最小,则该元素即为该二维数组的一个鞍点。要求从键盘上输入一个二维数组,当鞍点存在时,把鞍点找出来。 #include<stdio.h> #define M 3 #define N 4 int main(){ int a[M][N],i,j,k; printf("\n请输入二维数组的数据:\n"); for(i=0;i<M;i++) for(j=0;j<N;j++) scanf("%d",&a[i][j]); for(i=0;i<M;i++){ /*输出矩阵*/ for(j=0;j<N;j++) printf("%4d",a[i][j]); printf("\n"); } for(i=0;i<M;i++){ k=0; for(j=1;j<N;j++) /*找出第i行的最大值*/ if(a[i][j]>a[i][k]) k=j; for(j=0;j<M;j++) /*判断第i行的最大值是否为该列的最小值*/ if(a[j][k]<a[i][k]) break; if(j==M) /*在第i行找到鞍点*/ printf("%d,%d,%d\n",a[i][k],i,k); } return 0; } 运行结果: 4、 调试程序:利用指针输出二维数组的元素。 #include<stdio.h> int main(){ int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; int *p; for(p=a[0];p<a[0]+12;p++){ if((p-a[0])%4==0) printf("\n"); printf("%4d",*p); } return 0; } 运行结果: 5、 调试程序:设有一个教师与学生通用的表格,教师的数据有姓名、年龄、职业、教研室四项,学生有姓名、年龄、专业、班级四项,编程输入人员的数据,再以表格输出。 #include <stdio.h> #define N 10 struct student{ char name[8]; /*姓名*/ int age; /*年龄*/ char job; /*职业或专业,用s或t表示学生或教师*/ union { int class; /*班级*/ char office[10]; /*教研室*/ }depa; }stu[N]; int main(){ int i; int n; printf(“\n请输入人员数(<10):\n”); scanf(“%d”,&n); for(i=0;i<n;i++){ /*输入n个人员的信息*/ printf("\n请输入第%d人员的信息:(name age job class/office)\n",i+1); scanf("%s,%d,%c",stu[i].name, &stu[i].age, &stu[i].job); if(stu[i].job==’s’) scanf("%d",&stu[i].depa.class); else scanf("%s",stu[i].depa.office); } printf(“name age job class/office”); for(i=0;i<n;i++){ /*输出*/ if(stu[i].job==’s’) printf("%s %3d %3c %d\n",stu[i].name, stu[i].age, stu[i].job, stu[i].depa.class); else printf("%s %3d %3c %s\n",stu[i].name, stu[i].age, stu[i].job, stu[i].depa.office); } } 输入的数据:2 Wang 19 s 99061 Li 36 t computer 运行结果: 四、实验小结 五、教师评语 实验一 顺序表与链表 一、实验目的 1、掌握线性表中元素的前驱、后续的概念。 2、掌握顺序表与链表的建立、插入元素、删除表中某元素的算法。 3、对线性表相应算法的时间复杂度进行分析。 4、理解顺序表、链表数据结构的特点(优缺点)。 二、实验预习 说明以下概念 1、线性表: 2、顺序表: 3、链表: 三、实验内容和要求 1、阅读下面程序,在横线处填写函数的基本功能。并运行程序,写出结果。 #include<stdio.h> #include<malloc.h> #define ERROR 0 #define OK 1 #define INIT_SIZE 5 /*初始分配的顺序表长度*/ #define INCREM 5 /*溢出时,顺序表长度的增量*/ typedef int ElemType; /*定义表元素的类型*/ typedef struct Sqlist{ ElemType *slist; /*存储空间的基地址*/ int length; /*顺序表的当前长度*/ int listsize; /*当前分配的存储空间*/ }Sqlist; int InitList_sq(Sqlist *L); /* */ int CreateList_sq(Sqlist *L,int n); /* */ int ListInsert_sq(Sqlist *L,int i,ElemType e);/* */ int PrintList_sq(Sqlist *L); /*输出顺序表的元素*/ int ListDelete_sq(Sqlist *L,int i); /*删除第i个元素*/ int ListLocate(Sqlist *L,ElemType e); /*查找值为e的元素*/ int InitList_sq(Sqlist *L){ L->slist=(ElemType*)malloc(INIT_SIZE*sizeof(ElemType)); if(!L->slist) return ERROR; L->length=0; L->listsize=INIT_SIZE; return OK; }/*InitList*/ int CreateList_sq(Sqlist *L,int n){ ElemType e; int i; for(i=0;i<n;i++){ printf("input data %d",i+1); scanf("%d",&e); if(!ListInsert_sq(L,i+1,e)) return ERROR; } return OK; }/*CreateList*/ /*输出顺序表中的元素*/ int PrintList_sq(Sqlist *L){ int i; for(i=1;i<=L->length;i++) printf("%5d",L->slist[i-1]); return OK; }/*PrintList*/ int ListInsert_sq(Sqlist *L,int i,ElemType e){ int k; if(i<1||i>L->length+1) return ERROR; if(L->length>=L->listsize){ L->slist=(ElemType*)realloc(L->slist, (INIT_SIZE+INCREM)*sizeof(ElemType)); if(!L->slist) return ERROR; L->listsize+=INCREM; } for(k=L->length-1;k>=i-1;k--){ L->slist[k+1]= L->slist[k]; } L->slist[i-1]=e; L->length++; return OK; }/*ListInsert*/ /*在顺序表中删除第i个元素*/ int ListDelete_sq(Sqlist *L,int i){ } /*在顺序表中查找指定值元素,返回其序号*/ int ListLocate(Sqlist *L,ElemType e){ } int main(){ Sqlist sl; int n,m,k; printf("please input n:"); /*输入顺序表的元素个数*/ scanf("%d",&n); if(n>0){ printf("\n1-Create Sqlist:\n"); InitList_sq(&sl); CreateList_sq(&sl,n); printf("\n2-Print Sqlist:\n"); PrintList_sq(&sl); printf("\nplease input insert location and data:(location,data)\n"); scanf("%d,%d",&m,&k); ListInsert_sq(&sl,m,k); printf("\n3-Print Sqlist:\n"); PrintList_sq(&sl); printf("\n"); } else printf("ERROR"); return 0; } l 运行结果 l 算法分析 2、为第1题补充删除和查找功能函数,并在主函数中补充代码验证算法的正确性。 删除算法代码: l 运行结果 l 算法分析 查找算法代码: l 运行结果 l 算法分析 3、阅读下面程序,在横线处填写函数的基本功能。并运行程序,写出结果。 #include<stdio.h> #include<malloc.h> #define ERROR 0 #define OK 1 typedef int ElemType; /*定义表元素的类型*/ typedef struct LNode{ /*线性表的单链表存储*/ ElemType data; struct LNode *next; }LNode,*LinkList; LinkList CreateList(int n); /* */ void PrintList(LinkList L); /*输出带头结点单链表的所有元素*/ int GetElem(LinkList L,int i,ElemType *e); /* */ LinkList CreateList(int n){ LNode *p,*q,*head; int i; head=(LinkList)malloc(sizeof(LNode)); head->next=NULL; p=head; for(i=0;i<n;i++){ q=(LinkList)malloc(sizeof(LNode)); printf("input data %i:",i+1); scanf("%d",&q->data); /*输入元素值*/ q->next=NULL; /*结点指针域置空*/ p->next=q; /*新结点连在表末尾*/ p=q; } return head; }/*CreateList*/ void PrintList(LinkList L){ LNode *p; p=L->next; /*p指向单链表的第1个元素*/ while(p!=NULL){ printf("%5d",p->data); p=p->next; } }/*PrintList*/ int GetElem(LinkList L,int i,ElemType *e){ LNode *p;int j=1; p=L->next; while(p&&j<i){ p=p->next;j++; } if(!p||j>i) return ERROR; *e=p->data; return OK; }/*GetElem*/ int main(){ int n,i;ElemType e; LinkList L=NULL; /*定义指向单链表的指针*/ printf("please input n:"); /*输入单链表的元素个数*/ scanf("%d",&n); if(n>0){ printf("\n1-Create LinkList:\n"); L=CreateList(n); printf("\n2-Print LinkList:\n"); PrintList(L); printf("\n3-GetElem from LinkList:\n"); printf("input i="); scanf("%d",&i); if(GetElem(L,i,&e)) printf("No%i is %d",i,e); else printf("not exists"); }else printf("ERROR"); return 0; } l 运行结果 l 算法分析 4、为第3题补充插入功能函数和删除功能函数。并在主函数中补充代码验证算法的正确性。 插入算法代码: l 运行结果 l 算法分析 删除算法代码: l 运行结果 l 算法分析 以下为选做实验: 5、循环链表的应用(约瑟夫回环问题) n个数据元素构成一个环,从环中任意位置开始计数,计到m将该元素从表中取出,重复上述过程,直至表中只剩下一个元素。 提示:用一个无头结点的循环单链表来实现n个元素的存储。 l 算法代码 6、设一带头结点的单链表,设计算法将表中值相同的元素仅保留一个结点。 提示:指针p从链表的第一个元素开始,利用指针q从指针p位置开始向后搜索整个链表,删除与之值相同的元素;指针p继续指向下一个元素,开始下一轮的删除,直至p==null为至,既完成了对整个链表元素的删除相同值。 l 算法代码 四、实验小结 五、教师评语 实验二 栈和队列 一、实验目的 1、掌握栈的结构特性及其入栈,出栈操作; 2、掌握队列的结构特性及其入队、出队的操作,掌握循环队列的特点及其操作。 二、实验预习 说明以下概念 1、顺序栈: 2、链栈: 3、循环队列: 4、链队 三、实验内容和要求 1、阅读下面程序,将函数Push和函数Pop补充完整。要求输入元素序列1 2 3 4 5 e,运行结果如下所示。 #include<stdio.h> #include<malloc.h> #define ERROR 0 #define OK 1 #define STACK_INT_SIZE 10 /*存储空间初始分配量*/ #define STACKINCREMENT 5 /*存储空间分配增量*/ typedef int ElemType; /*定义元素的类型*/ typedef struct{ ElemType *base; ElemType *top; int stacksize; /*当前已分配的存储空间*/ }SqStack; int InitStack(SqStack *S); /*构造空栈*/ int push(SqStack *S,ElemType e); /*入栈*/ int Pop(SqStack *S,ElemType *e); /*出栈*/ int CreateStack(SqStack *S); /*创建栈*/ void PrintStack(SqStack *S); /*出栈并输出栈中元素*/ int InitStack(SqStack *S){ S->base=(ElemType *)malloc(STACK_INT_SIZE *sizeof(ElemType)); if(!S->base) return ERROR; S->top=S->base; S->stacksize=STACK_INT_SIZE; return OK; }/*InitStack*/ int Push(SqStack *S,ElemType e){ }/*Push*/ int Pop(SqStack *S,ElemType *e){ }/*Pop*/ int CreateStack(SqStack *S){ int e; if(InitStack(S)) printf("Init Success!\n"); else{ printf("Init Fail!\n"); return ERROR; } printf("input data:(Terminated by inputing a character)\n"); while(scanf("%d",&e)) Push(S,e); return OK; }/*CreateStack*/ void PrintStack(SqStack *S){ ElemType e; while(Pop(S,&e)) printf("%3d",e); }/*Pop_and_Print*/ int main(){ SqStack ss; printf("\n1-createStack\n"); CreateStack(&ss); printf("\n2-Pop&Print\n"); PrintStack(&ss); return 0; } l 算法分析:输入元素序列1 2 3 4 5,为什么输出序列为5 4 3 2 1?体现了栈的什么特性? 2、在第1题的程序中,编写一个十进制转换为二进制的数制转换算法函数(要求利用栈来实现),并验证其正确性。 l 实现代码 l 验证 3、阅读并运行程序,并分析程序功能。 #include<stdio.h> #include<malloc.h> #include<string.h> #define M 20 #define elemtype char typedef struct { elemtype stack[M]; int top; } stacknode; void init(stacknode *st); void push(stacknode *st,elemtype x); void pop(stacknode *st); void init(stacknode *st) { st->top=0; } void push(stacknode *st,elemtype x) { if(st->top==M) printf("the stack is overflow!\n"); else { st->top=st->top+1; st->stack[st->top]=x; } } void pop(stacknode *st) { if(st->top>0) st->top--; else printf(“Stack is Empty!\n”); } int main() { char s[M]; int i; stacknode *sp; printf("create a empty stack!\n"); sp=malloc(sizeof(stacknode)); init(sp); printf("input a expression:\n"); gets(s); for(i=0;i<strlen(s);i++) { if(s[i]=='(') push(sp,s[i]); if(s[i]==')') pop(sp); } if(sp->top==0) printf("'('match')'!\n"); else printf("'('not match')'!\n"); return 0; } l 输入:2+((c-d)*6-(f-7)*a)/6 l 运行结果: l 输入:a-((c-d)*6-(s/3-x)/2 l 运行结果: l 程序的基本功能: 以下为选做实验: 4、设计算法,将一个表达式转换为后缀表达式,并按照后缀表达式进行计算,得出表达式得结果。 l 实现代码 5、假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾结点(不设队头指针),试编写相应的置空队列、入队列、出队列的算法。 实现代码: 四、实验小结 五、教师评语 实验三 串的模式匹配 一、实验目的 1、了解串的基本概念 2、掌握串的模式匹配算法的实现 二、实验预习 说明以下概念 1、模式匹配: 2、BF算法: 3、KMP算法: 三、实验内容和要求 1、阅读并运行下面程序,根据输入写出运行结果。 #include<stdio.h> #include<string.h> #define MAXSIZE 100 typedef struct{ char data[MAXSIZE]; int length; }SqString; int strCompare(SqString *s1,SqString *s2); /*串的比较*/ void show_strCompare(); void strSub(SqString *s,int start,int sublen,SqString *sub); /*求子串*/ void show_subString(); int strCompare(SqString *s1,SqString *s2){ int i; for(i=0;i<s1->length&&i<s2->length;i++) if(s1->data[i]!=s2->data[i]) return s1->data[i]-s2->data[i]; return s1->length-s2->length; } void show_strCompare(){ SqString s1,s2; int k; printf("\n***show Compare***\n"); printf("input string s1:"); gets(s1.data); s1.length=strlen(s1.data); printf("input string s2:"); gets(s2.data); s2.length=strlen(s2.data); if((k=strCompare(&s1,&s2))==0) printf("s1=s2\n"); else if(k<0) printf("s1<s2\n"); else printf("s1>s2\n"); printf("\n***show over***\n"); } void strSub(SqString *s,int start,int sublen,SqString *sub){ int i; if(start<1||start>s->length||sublen>s->length-start+1){ sub->length=0; } for(i=0;i<sublen;i++) sub->data[i]=s->data[start+i-1]; sub->length=sublen; } void show_subString(){ SqString s,sub; int start,sublen,i; printf("\n***show subString***\n"); printf("input string s:"); gets(s.data); s.length=strlen(s.data); printf("input start:"); scanf("%d",&start); printf("input sublen:"); scanf("%d",&sublen); strSub(&s,start,sublen,&sub); if(sub.length==0) printf("ERROR!\n"); else{ printf("subString is :"); for(i=0;i<sublen;i++) printf("%c",sub.data[i]); } printf("\n***show over***\n"); } int main(){ int n; do { printf("\n---String---\n"); printf("1. strCompare\n"); printf("2. subString\n"); printf("0. EXIT\n"); printf("\ninput choice:"); scanf("%d",&n); getchar(); switch(n){ case 1:show_strCompare();break; case 2:show_subString();break; default:n=0;break; } }while(n); return 0; } l 运行程序 输入: 1 student students 2 Computer Data Stuctures 10 4 运行结果: 2、实现串的模式匹配算法。补充下面程序,实现串的BF和KMP算法。 #include<stdio.h> #include<string.h> #define MAXSIZE 100 typedef struct{ char data[MAXSIZE]; int length; }SqString; int index_bf(SqString *s,SqString *t,int start); void getNext(SqString *t,int next[]); int index_kmp(SqString *s,SqString *t,int start,int next[]); void show_index(); int index_bf(SqString *s,SqString *t,int start){ 补充代码..... } void getNext(SqString *t,int next[]){ int i=0,j=-1; next[0]=-1; while(i<t->length){ if((j==-1)||(t->data[i]==t->data[j])){ i++;j++;next[i]=j; }else j=next[j]; } } int index_kmp(SqString *s,SqString *t,int start,int next[]){ 补充代码..... } void show_index(){ SqString s,t; int k,next[MAXSIZE]={0},i; printf("\n***show index***\n"); printf("input string s:"); gets(s.data); s.length=strlen(s.data); printf("input string t:"); gets(t.dat- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 语言版 严蔚敏著 实验 指导
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【精****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【精****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【精****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【精****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文