收藏 分享(赏)

算法与数据结构实验报告.doc

上传人:精品资料 文档编号:10690083 上传时间:2019-12-28 格式:DOC 页数:25 大小:173.50KB
下载 相关 举报
算法与数据结构实验报告.doc_第1页
第1页 / 共25页
算法与数据结构实验报告.doc_第2页
第2页 / 共25页
算法与数据结构实验报告.doc_第3页
第3页 / 共25页
算法与数据结构实验报告.doc_第4页
第4页 / 共25页
算法与数据结构实验报告.doc_第5页
第5页 / 共25页
点击查看更多>>
资源描述

1、2015-2016 学 年 第 二 学 期 算 法 与 数 据 结 构 课 程 实 验 报 告专业 软件工程学生姓名 成晓伟班级 软件 141学号 1410075094实验学时 16实验教师 徐秀芳信息工程学院实验一 单链表的基本操作一、实验目的1.熟悉 C 语言上机环境,进一步掌握 C 语言的基本结构及特点。2.掌握线性表的各种物理存储表示和 C 语言实现。3.掌握单链表的各种主要操作的 C 语言实现。4.通过实验理解线性表中的单链表存储表示与实现。二、主要仪器及耗材普通计算机三、实验内容与要求1、用 C 语言编写一个单链表基本操作测试程序。(1)初始化单链表(2)创建单链表(3)求单链表长

2、度(4)输出单链表中每一个结点元素(5)指定位置插入某个元素(6)查找第 i 个结点元素的值(7)查找值为 e 的结点,并返回该结点指针(8)删除第 i 个结点(9)销毁单链表2、实验要求(1)程序中用户可以选择上述基本操作。程序启动后,在屏幕上可以菜单形式显示不同功能,当按下不同数字后完成指定的功能,按其他键,则显示错误后重新选择。(2)要求用线性表的顺序存储结构,带头结点的单链表存储结构分别实现。(3)主函数实现对基本操作功能的调用。3、主要代码(1)初始化单链表LinkList *InitList() /创建一个空链表,初始化线性表LinkList *L;L=(LinkList *)ma

3、lloc(sizeof(LinkList);L-next=NULL;return L;(2)创建单链表/头插法void CreateListF(LinkList *L)LinkList *s;int i=1,a=0;while(1)printf(“输入第%d 个元素(0 表示终止)“,i+);scanf(“%d“,if(a=0)break;s=(LinkList *)malloc(sizeof(LinkList);s-data=a;s-next=L-next;L-next=s;(3)求链表长度int ListLength(LinkList *L) /求链表长度int n=0;LinkList

4、*p=L;while(p-next!=NULL)p=p-next;n+;return(n);(4)在指定位置插入元素int InsertList(LinkList *L,int i,ElemType e)LinkList *p=L,*s;int j=0;while(p!=NULLj+; /找出要插入的位置的前一个位置if(p=NULL)return 0;elses=(LinkList *)malloc(sizeof(LinkList);s-data=e;s-next=p-next;p-next=s;return 1;(5)输出链表void DispList(LinkList *L) /输出链表

5、LinkList *p=L-next;while(p!=NULL)printf(“%d“,p-data);p=p-next;printf(“n“);(6)查找链表中指定元素int GetElem(LinkList *L,int i) /查找链表中指定元素LinkList *p=L;int j=0;while(jnext;if(p=NULL)return 0;elsereturn p-data;(7)查找值是 e 的结点并返回该指针LinkList *LocateElem(LinkList *L,ElemType e)/查找值是 e 的结点并返回该指针int i=1;LinkList *p=L;

6、while(p!=NULL)if(p-data=e) return p;if(p=NULL)return NULL;(8)删除元素int ListDelete(LinkList *L,int i,ElemType *e) /删除元素LinkList *p=L,*q;int j=0;while(p!=NULLj+; /找到要删除元素地址的前一个地址if(p=NULL) return 0; /不能删除elseq=p-next;*e=q-data;p-next=q-next;free(q); /删除成功return 1;(9)销毁链表void DestroyList(LinkList *L)/销毁链

7、表LinkList *pre=L,*p=L-next;while(p!=NULL)free(pre);pre=p;p=pre-next;free(pre);main 函数:int main()LinkList *L;ElemType e;int i;L=InitList();CreateListF(L);DispList(L);printf(“输入要查找的元素位置:n“);scanf(“%d“,e=GetElem(L,i);printf(“%dn“,e);printf(“单链表长度为:%dn“,ListLength(L);printf(“输入要删除元素的位置:“);scanf(“%d“,if

8、(iListLength(L) printf(“超出范围重新输入“);scanf(“%d“,if(ListDelete(L,i,else DispList(L);printf(“输入插入元素的位置和值:“);scanf(“%d%d“,InsertList(L,i,e);DispList(L);return 0;4、测试数据及测试结果输入:23 56 12 28 45输出:四、注意事项1、存储结构定义和基本操作尽可能用头文件实现。2、采用缩进格式,加足够多的注释。3、注意循环条件、边界条件等。4、善于发现问题、分析问题、解决问题,并总结思考。5、对于算法描述及实现完全理解。五、拓展提高1、若 L

9、 为带头结点的单链表,删除最大值结点2、将两个单链表合并为一个单链表实验二 循环链表的基本操作一、实验目的熟练掌握线性表的基本操作在链式循环存储结构上的实现。二、主要仪器及耗材普通计算机三、实验内容1、在上一次单链表基本操作的基础上,修改程序,将其改为单循环链表,并实现相关操作。(1)初始化单循环链表(2)创建单循环链表(3)求单循环链表长度(4)输出单循环链表中每一个结点元素(5)指定位置插入某个元素(6)查找第 i 个结点元素的值(7)查找值为 e 的结点,并返回该结点指针(8)删除第 i 个结点(9)销毁单循环链表2、实验要求(1)程序中用户可以选择上述基本操作。程序启动后,在屏幕上可以

10、菜单形式显示不同功能,当按下不同数字后完成指定的功能,按其他键,则显示错误后重新选择。(2)要求用不带头结点的循环链表实现。(3)具体功能测试由主函数实现。3、主要代码(1)初始化单循环链表void initLinkList(LinkList L)/初始化循环单链表L=(LinkList)malloc(sizeof(LNode);L-next=L;/创建一个空表(2)创建单循环链表LinkList creat(LinkList L)/给循环链表赋值LinkList p,q,r;int N,i=0;/printf(“请输入第%d 个值:“,+i);while(1)printf(“请输入第%d 个

11、值:“,+i);scanf(“%d“,/输入节点的值if(N=0)/以 0 为结尾break;if(i=1)/当只有一个节点时p=(LinkList)malloc(sizeof(LNode);/给 p 节点分配内存空间p-date =N;p-next =NULL;q=p;else/当节点不为 1 时r=(LinkList)malloc(sizeof(LNode);r-date =N;r-next =NULL;q-next =r;q=r;/if(q!=NULL)q-next =p;/将尾节点指向头节点完成循环L=p;return L;/返回头指针(3)打印循环链表void print(LinkL

12、ist L)/打印循环链表LinkList p;/printf(“*n“);p=L;/printf(“*n“);if(p=NULL)/当链表尾空表时printf(“这是一个空表n“);while(p-next!=L)/只有当 p 节点不为尾节点是打印节点中的数据域/printf(“*n“);printf(“%d “,p-date );p=p-next ;printf(“%dn“,p-date );/打印尾节点中的数据(4)求链表的长度int length(LinkList L)/求链表的长度LinkList p;/printf(“*n“);int n=1;/printf(“*n“);p=L;/

13、printf(“*n“);while(p-next!=L)/当 p 节点不为尾节点时计数n+;/printf(“*n“);p=p-next;return n;/返回链表长度/printf(“%d*n“,n);(5)删除指定位置的节点LinkList del(LinkList L,int flag)/删除指定位置的节点LinkList p,q;int i;p=L;q=L-next ;/int i=1;if(flag=1)/当删除节点为头结点时while(q-next !=L)/让 p 节点为尾节点q=q-next ;L=p-next ;/头结点为 L-NEXT 节点q-next =L;/让尾节点

14、指向新的头结点free(p);/释放 pelsefor(i=1;inext ;q=q-next ;p-next =q-next ;free(q);/删除 q 节点return L;/返回头指针(6)查找第 i 个结点元素的值int search1(LinkList L,int flag)/按照节点的位置返回节点中的数据LinkList p;int i;p=L;for(i=1;inext;return p-date;/返回节点的数据(7)查找值为 e 的结点,并返回该结点指针int search2(LinkList L,int data)/按照数据来查找节点的位置LinkList p;int i

15、=1;p=L;while(1)if(p-date=data)/当查找到数据域与查找的数据相同是跳出循环break;elsei+;p=p-next;return i;(8)删除第 i 个结点LinkList insert(LinkList L,int falg,int data)/指定位置插入元素LinkList p,s;int i;p=L;s=(LinkList)malloc(sizeof(LNode);for(i=1;inext;s-date=data;/将 data 赋值给 s 节点s-next=p-next;p-next=s;return L;(9)销毁单循环链表LinkList des

16、troy(LinkList L)/销毁循环链表LinkList p,q;p=L-next ;while(p!=L)q=p-next ;free(p);p=q;free(L);L=NULL;return L;main 函数:int main()LinkList L=NULL;int m,k,Case,Length,DAT1,flag,P,e;printf(“*1.创建一个循环链表*n“);printf(“*2.打印所创建的循环链表*n“);printf(“*3.插入节点*n“);printf(“*4.删除节点*n“);printf(“*5.求循环的长度*n“);printf(“*6.查找第 i

17、节点*n“);printf(“*7.查找某个值得节点*n“);printf(“*8.销毁链表*n“);printf(“*9.删除最大节点*n“);printf(“*10.退出程序*n“);for(;)printf(“ 请输入操作的序号 n“);scanf(“%d“,switch(Case)case 1: initLinkList(L);L=creat(L);break;case 2: print(L);break;case 3: printf(“请输入需要插入的位置(之后)及其数据n“);scanf(“%d%d“,L=insert(L,m,k);print(L);break;case 4: p

18、rintf(“请输入需要删除的节点n“);scanf(“%d“,L=del(L,Case);print(L);/printf(“%d“,Length);break;case 5: Length=length(L);printf(“循环的长度是%dn“,Length);break;case 6: printf(“请输入需要查找的节点序号: “);scanf(“%d“,DAT1=search1(L,flag);printf(“所查找的节点数据为%dn“,DAT1);break;case 7: printf(“输入需要查找的值n“);scanf(“%d“,P=search2(L,e);printf(

19、“所查找的位置是%dn“,P);break;case 8: L=destroy(L);print(L);break;/case 10: case 9: exit(0);break;return 0;4、测试数据及测试结果输入:1 2 3 4 5输出:四、注意事项1、存储结构定义和基本操作尽可能用头文件实现。2、采用缩进格式,加足够多的注释。3、注意循环条件、边界条件等。五、拓展提高1、双向链表中间结点 P 后插入新结点 S 的算法;2、删除双向链表中间结点 P 后的结点 Q 的算法;实验三 栈的基本操作及应用一、实验目的1、掌握栈的顺序表示和基本操作实现;2、熟练掌握栈的基本操作;3、会用栈解

20、决一些实际应用;4、掌握十进制数转化为 N 进制整数的工作原理。二、主要仪器及耗材普通计算机三、实验内容1、栈的基本运算(1)InitStack(SqStack *s) /初始化栈(2)Push(SqStack *s, SElemType e)/入栈操作(3)pop(SqStack *s, SElemType e)/出栈操作(4)GetTop(SqStack *s, SElemType e)/取栈顶元素(5)IsEmpty(SqStack *s) /判断是否为空(6)GetLength(SqStack *s) /求栈的长度2、创建一个长度为 100 的顺序栈 T,每个数据元素的类型为字符型 c

21、har。编写代码,利用栈的基本运算和顺序栈 T,正序输入并存储 26 个英文字母AZ,然后逆序输出。3、利用栈的基本运算,写出十进制转化为二进制(八进制呢?十六进制呢?N 进制呢?)的具体实现,并输出。4、实验要求(1)程序中用户可以选择上述基本操作。程序启动后,在屏幕上可以菜单形式显示不同功能,当按下不同数字后完成指定的功能,按其他键,则显示错误后重新选择。(2)要求用不带头结点的循环链表实现。(3)具体功能测试由主函数实现。5、主要代码(1)初始化栈void InitStack(sqStack *s)/初始化栈,构造一个空栈s-base=(ElemType*)malloc(STACK_IN

22、IT_SIZE*sizeof(ElemType);/动态分配存储空间if(!s-base)exit(0);/存储分配失败s-top=s-base;/栈空标记s-stacksize=STACK_INIT_SIZE;(2)取栈顶元素int GetTop(sqStack *s, ElemType e)/取栈顶元素*(s-top)=e;return e;(3)元素入栈void push(sqStack *s,ElemType e)/元素入栈if(s-top-s-base=s-stacksize)s-base=(ElemType*)realloc(s-base,(s-stacksize+STACK_IN

23、IT_SIZE)*sizeof(ElemType);/栈满,追加存储空间if(!s-base)exit(0);*(s-top)=e;/输入元素 es-top+;/栈顶指针+(4)元素出栈void pop(sqStack *s,ElemType *e)/出栈if(s-top=s-base)return;/*e=*-(s-top);(5)求栈的长度int stacklen(sqStack s)/栈的长度return(s.top-s.base);(6)判断是否栈空int stackempty(sqStack *s)/判断是否栈空if(s-top=s-base)return 1;elsereturn

24、0;(7)十进制转化为八进制void conversion() /十进制转化为八进制sqStack s;int n,t;ElemType e;InitStack(printf(“请输入正整数:“);scanf(“%d“,t=n;while(n)push(n=n/8;printf(“十进制%d 转化为八进制为:“,t);while(!stackempty(printf(“%d“,e);printf(“n“);(8)二进制转化为十进制void BintoDec()/二进制转化为十进制ElemType ch;sqStack s;int len,i,sum=0;InitStack(printf(“请输

25、入二进制数,输入#表示结束!n“);scanf(“%c“,while(ch!=#)push(scanf(“%c“,getchar(); /清除缓冲区len=stacklen(s);printf(“栈的当前容量是:%dn“,len);for(i=0;ifront=q-rear=0;/*初始化队列,构造一个空队列*/(2)判断队列是否为空int QueueEmpty(sqQueue *q)if(q-rear=q-front)return 0;else return 1;/*判断队列是否为空*/(3)队列长度int QueueLength(sqQueue *q)return (q-rear-q-fr

26、ont+MaxLen)%MaxLen;/*队列长度( 队元素个数)*/(4)进队void enQueue(sqQueue * elseq-rear=(q-rear+1)%MaxLen;q-dataq-rear=e;/*进队*/(5)出队int deQueue(sqQueue *q-front=(q-front+1)%MaxLen;e=q-dataq-front;return 1; /*出队*/main 函数int main()int i,j;Elemtype e,ch; sqQueue *q;printf(“(1)初始化队列 qn“);InitQueue(q);printf(“(2)依次进队

27、MaxLen 个元素n“);/getchar();/scanf(“%c“,/* for(ch=A;chE;ch+)/printf(“输入第%d 元素“,i);if(enQueue(q,ch)=0)printf(“队满n“);*/while(1)scanf(“%c“,if(ch=#)break;enQueue(q,ch);printf(“队元素个数:“);printf(“%dn“, QueueLength(q);printf(“(3)出队n“);/for(j=0;j4;j+)while(QueueEmpty(q)!=0)deQueue(q,e);printf(“%cn“,e);return 0;6、测试数据及测试结果输入:a1 b2 c3 d4 e5 f6 g7 输出:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报