欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    实验1链表地操作实验.docx

    • 资源ID:6082016       资源大小:30KB        全文页数:15页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    实验1链表地操作实验.docx

    1、实验1链表地操作实验实验B01: 链表的操作实验一、实验名称和性质所属课程数据结构实验名称链表的操作实验学时2实验性质验证 综合 设计必做/选做必做 选做二、实验目的1掌握线性表的链式存储结构的表示和实现方法。2掌握链表基本操作的算法实现。三、实验内容1建立单链表,并在单链表上实现插入、删除和查找操作(验证性内容)。2建立双向链表,并在双向链表上实现插入、删除和查找操作(设计性内容)。3计算已知一个单链表中数据域值为一个指定值x的结点个数(应用性设计内容)。四、实验的软硬件环境要求硬件环境要求: PC机(单机)使用的软件名称、版本号以及模块: Windows环境下的TurboC2.0以上或VC

    2、+ 等。五、知识准备前期要求熟练掌握了C语言的编程规则、方法和单链表和双向链表的基本操作算法。六、验证性实验1实验要求编程实现如下功能:(1)根据输入的一系列整数,以0标志结束,用头插法建立单链表,并输出单链表中各元素值,观察输入的内容与输出的内容是否一致。(2)在单链表的第i个元素之前插入一个值为x的元素,并输出插入后的单链表中各元素值。(3)删除单链表中第i个元素,并输出删除后的单链表中各元素值。(4)在单链表中查找第i个元素,如果查找成功,则显示该元素的值,否则显示该元素不存在。2. 实验相关原理:线性表的链式储结构是用一组任意的存储单元依次存放线性表中的元素,这组存储单元可以是连续的,

    3、也可以是不连续的。为反映出各元素在线性表中的前后逻辑关系,对每个数据元素来说,除了存储其本身数据值之外,还需增加一个或多个指针域,每个指针域的值称为指针,又称作链,它用来指示它在线性表中的前驱或后继的存储地址。这两个部分的的一起组成一个数据元素的存储映像,称为结点,若干个结点链接成链表。如果一个结点中只含一个指针的链表,则称单链表。单链表的存储结构描述如下:typedef struct Lnode Elemtype data;/*数据域*/ struct Lnode *next;/*指针域*/LNODE,*Linklist; /*其中LNODE为结点类型名,Linklist为指向结点的指针类型

    4、名*/【核心算法提示】1 链表建立操作的基本步骤:链表是一个动态的结构,它不需要予分配空间,因此建立链表的过程是一个结点“逐个插入” 的过程。先建立一个只含头结点的空单链表,然后依次生成新结点,再不断地将其插入到链表的头部或尾部,分别称其为“头插法”和“尾插法”。2 链表查找操作的基本步骤:因链表是一种顺序存取的结构,则要在带头结点的链表中查找到第 i个 元素,必须从头结点开始沿着后继指针依次点数,直到点到第 i 个结点为止,如果查找成功,则用e返回第i个元素值。头结点可看成是第0个结点。3 链表插入操作的基本步骤:先确定要插入的位置,如果插入位置合法,则再生成新的结点,最后通过修改链将新结点

    5、插入到指定的位置上。4 链表删除操作的基本步骤:先确定要删除的结点位置,如果位置合法,则再通过修改链使被删结点从链表中“卸下”,最后释放被删结点的空间。 【核心算法描述】void creat1(Linklist &L) /*输入一系列整数,以0标志结束,将这些整数作为data域并用头插法建立一个带头结点的单链表的函数*/ L=(Linklist)malloc(sizeof(LNODE);/*生成头结点*/ L-next=NULL;/*头结点的指针域初始为空*/ scanf(%d,&node);while(node!=0) p=(Linklist)malloc(sizeof(LNODE);/*为

    6、一个新结点的分配空间*/ p-data=node; /*为新结点数据域赋值*/ p-next=L-next;/*新结点指针域指向开始结点*/ L-next=p; /*头结点指针域指向新结点,即新结点成为开始结点*/scanf(%d,&node); void creat2(Linklist &L) /*输入一系列整数,以0标志结束,将这些整数作为data域并用尾插法建立一个带头结点的单链表的函数*/ L=(Linklist)malloc(sizeof(LNODE);/*为头结点分配空间*/ L-next=NULL; /*头结点的指针域初始为空*/ r=L; /*尾指针初始指向头结点*/scanf

    7、(%d,&node);while(node!=0) p=(Linklist)malloc(sizeof(LNODE);/*为一个新结点分配空间*/ p-data=node; /*新结点数据域赋值*/ p-next=NULL; /*新结点指针域为空*/ r-next=p;/*尾结点指针域指向新结点*/ r=p; /*尾指针指向新结点,即新结点成为尾结点*/scanf(%d,&node); status list_search(Linklist L, int i;Elemtype &e) /*在带头结点的单链表L中查找第i个元素,如果查找成功则用e返回其值*/ p=L-next; /*使指针p指向

    8、第1个元素结点*/j=1; /*计数器赋初值为1*/while (p& jnext; j+;if (!p& ji) return ERROR; /*如果i值不合法,即i值小于1或大于表长,则出错*/e=p-data; /*如果第i个元素存在,则将该元素值赋给e*/return OK; status list_insert(Linklist &L,int i;Elemtype x) /*在带头结点的单链表L中第i个位置之前插入新元素x*/ p=L; j=0; while(p!=NULL&jnext; +j; if(p=NULL|ji-1) return ERROR; /*若位置不正确,即i小于1

    9、或大于表的长度加1,则出错*/ s=(Linklist)malloc(sizeof(LNODE); /*分配一个新结点的空间*/ s-data=x; /*为新结点数据域赋值*/ /*下面两条语句就是完成修改链,将新结点s插入到p结点之后*/ s-next=p-next; /*新结点指针域指向p的后继结点*/ p-next=s; /*新结点成为p的后继结点*/ return OK;status list_delete(Linklist &L,int i,Elemtype &x)/*在带头结点的单链表L中,删除第i个元素结点,并用x返回其值*/ p=L;j=0; while(p-next!=NUL

    10、L&jnext; +j; if (p-next=NULL|ji-1) return ERROR; /*若位置不正确,即i小于1或大于表长,则出错*/ q=p-next; /* q指向p的后继结点*/ p-next=q-next; /*q的后继结点成为p的后继结点*/ x=q-data; /*用x返回第i个位置的元素*/free(q); /*释放q所指的被删结点的空间*/return OK;3源程序代码参考#include #include typedef struct Lnode int data; struct Lnode *next; LNODE,*Linklist;Linklist cr

    11、eat(Linklist L) /*单链表建立函数 */int node; Linklist p; L=(Linklist)malloc(sizeof(LNODE); L-next=NULL; printf(nplease input the node(end with 0):n ); /*请求输入线性表中各个元素,以0结束*/ scanf(%d,&node); while(node!=0) p=(Linklist)malloc(sizeof(LNODE); if (!p) exit(); p-data=node; p-next=L-next; L-next=p; scanf(%d,&node

    12、); return L;Linklist insert(Linklist L,int i,int x) /*单链表插入函数*/ int j;Linklist p,s; p=L; j=0; while (p!=NULL&jnext; +j; if (p=NULL|ji-1) printf(n ERROR position!n); else s=(Linklist)malloc(sizeof(LNODE); s-data=x; s-next=p-next; p-next=s; return L;Linklist delete(Linklist L,int i) /*单链表删除函数*/ int j,

    13、x; Linklist p,q; p=L; j=0; while(p-next!=NULL&jnext; +j; if(p-next=NULL|ji-1) printf(n ERROE position!n); else q=p-next; p-next=q-next; x=q-data; printf(the delete data is:%dn,x); free(q); return L;int search(Linklist L, int i) /*单链上的查找函数*/ Linklist p; int j; p=L-next; j=1; while (p& jnext; j+; if (

    14、!p& ji) return 0; /*如果i值不合法,即i值小于1或大于表长,则函数返回0值*/ else return(p-data); /*否则函数返回第i个元素的值*/void display(Linklist L) /*单链表元素输出函数*/ Linklist p; p=L-next; while(p!=NULL) printf(%4d,p-data); p=p-next; printf(n);main()/*主函数*/ Linklist L=NULL; int i,x; L=creat(L);/*调用单链表建立函数*/ printf(the Linklist is:n); disp

    15、lay(L); /*调用单链表元素输出(遍历)函数*/ printf(please input the position you want to insert:);/*请求输入插入操作位置*/ scanf(%d,&i); printf(please input the node you want to insert:);/*请求输入需要插入的元素*/ scanf(%d,&x); L=insert(L,i,x);/*调用单链表插入函数*/ printf(the Linklist after inserted is:n); display(L);/*调用单链表元素输出(遍历)函数*/ printf

    16、(please input the node position you want to delete:); /*请求输入删除操作位置*/ scanf(%d,&i); L=delete(L,i); /*调用单链表删除函数*/ printf(the Linklist after deleted is:n); display(L); /*调用单链表元素输出(遍历)函数*/ printf(please input the position you want to search:); /*请求输入待查找元素的位置*/ scanf(%d,&i); x=search(L,i); /*调用单链表查找函数*/

    17、if (x) /*如果查找成功,则显示第i个元素的值,否则显示第i个元素不存在*/ printf( the %dth elem is %dn,i,x); else printf( the %dth elem is not exsitn);4运行结果参考如图2-1所示: 图2-1: 验证性实验运行结果七、设计性实验1. 编程实现在双向循环链表上的插入、删除和查找操作1 实验要求(1)输入链表的长度和各元素的值,用尾插法建立双向循环链表,并输出链表中各元素值,观察输入的内容与输出的内容是否一致。(2)在双向循环链表的第i个元素之前插入一个值为x的元素,并输出插入后的链表中各元素值。(3)删除双向循

    18、环链表中第i个元素,并输出删除后的链表中各元素值。(4)在双向循环链表中查找值为x元素,如果查找成功,则显示该元素在链表中的位置,否则显示该元素不存在。 核心算法提示 双向循环链表采用的存储结构描述如下: typedef struct DULNODE Elemtype data; /*数据域*/ struct DULNODE *prior; /*指向前驱结点的指针域*/ struct DULNODE *next;/*指向后继结点的指针域*/ DULNODE,*DuLinklist; typedef int Elemtype;不论是建立双向循环链表还是在双向循环链表中进行插入、删除和查找操作,其

    19、操作方法和步骤都跟单链表类似。只不过要注意两点:(1)凡是在操作中遇到有修改链的地方,都要进行前驱和后继两个指针的修改。(2)单链表操作算法中的判断条件:p= =NULL 或p!=NULL ,在循环链表的操作算法中则需改为:p!= L,其中L为链表的头指针。 核心算法描述void DuList_creat (DuLinklist &L,int n) /*输入n个整数(其中n为表长),将这些整数作为data域并用尾插法建立一个带头结点的双向循环链表的函数*/ L=( DuLinklist)malloc(sizeof(DULNODE);/*为头结点分配空间*/ L-next=L-prior=L;/

    20、*使头结点的后继指针和前驱指针都指向自身,形成空的双向循环链表*/ r=L; /*尾指针初始指向头结点*/for (i=0;idata); /*从键盘输入值,并保存在新结点数据域中*/ p-next=r-next; /*新结点后继指针指向尾结点r的后继结点*/ p-prior=r; /*新结点的前驱指针指向尾结点r*/ r-next=p; /*尾结点的后继指针指向新结点*/ r=p; /*尾指针指向新结点,即新结点成为尾结点*/L-prior=r; /*使尾结点成为头结点的前驱结点*/status DuList_search(DuLinklist L, int i;Elemtype &e) /

    21、*在带头结点的双向循环链表L中查找第i个元素,如果查找成功则用e返回其值*/ p=L-next; /*使指针p指向第1个元素结点*/j=1; /*计数器赋初值为1*/ while (p!=L & jnext; j+;if (j!=i) return ERROR; /*如果i值不合法,即i值小于1或大于表长,则出错*/e=p-data; /*如果第i个元素存在,则将该元素值赋给e*/return OK; status DuList_insert(DuLinklist &L,int i;Elemtype x) /*在带头结点的双向循环链表L中第i个位置之前插入新元素x*/ p=L-next; j=

    22、1;while(p!=L &jnext; +j; if(j!=i) return ERROR; /*若位置不正确,即i小于1或大于表的长度加1,则出错*/ s=(DuLinklist)malloc(sizeof(DULNODE); /*为一个新结点s分配空间*/ s-data=x; /*为新结点数据域赋值*/ /*下面四条语句就是完成修改链,将新结点s插入到p结点之前*/ s-next=p;p-prior-next=s; s-prior=p-prior;p-prior=s; return OK;status DuList_delete(DuLinklist &L,int i,Elemtype

    23、&x)/*在带头结点的双向循环链表L中,删除第i个元素结点,并用x返回其值*/ p=L-next;j=1; while(p!=L&jnext; +j; if (j!=i) return ERROR; /*若位置不正确,即i小于1或大于表长,则出错*/ q=p; /*记下被删结点*/ p-prior-next=p-next; /*修改链使得p结点从链中脱离*/ p-next-prior=p-prior; x=q-data; printf(the delete data is:%dn,x); free(q); /释放被删结点空间return OK;提醒: 请将上述算法与单链表上相应操作的算法对照学习,特别注意它们不相同的地方。八、应用性设计实验编写一个程序,计算出一个单链表中数据域值为一个指定值x的结点个数。实验要求: 从键盘输入若干个整数,以此序列为顺序建立一个不带头结点的单链表; 输出此单链表中的各个数据元素值;2 给定一个x的具体整数值,计算并返回此单链表中数据域值为x的结点个数值。


    注意事项

    本文(实验1链表地操作实验.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开