付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实现单链表的各种基本运算一、实验目的了解单链表表的结构特点及有关概念,掌握单链表的各种基本操作算法思想及其实现。二、实验内容编写一个程序,实现顺序表的各种基本运算:1、初始化单链表;2、单链表的插入;3、单链表的输出;4、求单链表的长度5、判断单链表是否为空;6、输出单链表的第i位置的元素;7、在单链表中查找一个给定元素在表中的位置;8、单链表的删除;9、释放单链表三、算法思想与算法描述简图四、实验步骤与算法实现#include<stdio.h>#include<malloc.h>typedefcharElemType;typedefstructLNode/定义单链表E
2、lemTypedata;structLNode*next;LinkList;创建头结点voidInitList(LinkList*&L)L=(LinkList*)malloc(sizeof(LinkList);/L->next=NULL;/头结点赋值为空销毁单链表(释放单链表L占用的内存空间voidDestroyList(LinkList*&L)/即逐一释放全部结点的空间)LinkList*p=L,*q=p->next;while(q!=NULL)free(p);p=q;q=p->next;free(p);intListEmpty(LinkList*L)/判线
3、性表是否为空表ListEmpty(L)return(L->next=NULL);/若单链表L没有数据结点,则返回真,否则返回假。intListLength(LinkList*L)/求线性表的长度ListLength(L)LinkList*p=L;inti=0;while(p->next!=NULL)i+;p=p->next;)return(i);/|返回单链表L中数据结点的个数)voidDispList(LinkList*L)/输出线性表DispList(L)LinkList*p=L->next;while(p!=NULL)/逐一扫描单链表L的每个数据结点,并显示各结点
4、的data域值。printf("%c”,p->data);p=p->next;)printf("n");)intGetELem(LinkList*L,inti,ElemType&e)/|求线性表L中指定位置的某个数据元素GetElem(L,i,&e)intj=0;LinkList*p=L;while(j<i&&p!=NULL)/1在单链表L中从头开始找到第i个结点,若存在第i个数据结点,则将其data域值赋2&变量e。j+;p=p->next;)if(p=NULL)return0;/不存在第i个数据结
5、点elsee=p->data;/存在第i个数据结点return1;)intLocateElem(LinkList*L,ElemTypee)/按元素值查找LocateElem(L,e)LinkList*p=L->next;intn=1;while(p!=NULL&&p->data!=e)|在单链表L中从头开始找第1个值域与e相等的结点,若存在这样的结点,则返回位置,否则返回00p=p->next;n+;)if(p=NULL)return(0);elsereturn(n);)intListInsert(LinkList*&L,inti,ElemTyp
6、ee)*插入数据元素ListInsert(&L,i,e)intj=0;LinkList*p=L,*s;while(j<i-1&&p!=NULL)/先在单链表L中找到第i-1个结点*p,若存在这样的结点,将值为e的结点*s插入到其后。j+;p=p->next;)if(p=NULL)return0;/|未找到位序为i-1的结点elses=(LinkList*)malloczeof(LinkList);s->data=e;s->next=p->next;/*将*s插入到之后p->next=s;return1;)intListDelete(L
7、inkList*&L,inti,ElemType&e)/|删除数据元素ListDelete(&L,i,&e)intj=0;LinkList*p=L,*q;while(j<i-1&&p!=NULL)查找第i-1个结点j+;p=p->next;if(p=NULL)d未找到位序为i-1的结点return0;else/1找到位序为i-1的结点*pq=p->next;/q|指向要删除的结点if(q=NULL)return0;/|若不存在第i个结点,返回e=q->data;p->next=q->next;/|从单链表中删除
8、*q结点free(q);/|释放*q结点return1;voidmain()LinkList*h;ElemTypee;printf("(1)初始化单链表hn");InitList(h);printf("(2)依次采用尾插入abcd,efgh,jilk,nnnn,kkkk元素n");ListInsert(h,1,'abcd');ListInsert(h,2,'efgh');ListInsert(h,3,'jilk');ListInsert(h,4,'nnnn');ListInsert(h,5,
9、'kkkk');printf("(3)输出单链表h:");DispList(h);printf("(4)单链表h长度=%dn",ListLength(h);printf("(5)单链表h为sn",(ListEmpty(h)?"空":"非空");GetELem(h,3,e);printf("(6)单链表h的第三个元素=%cn",e);printf("(7)元素a的位置=%dn",LocateElem(h,'a');printf
10、("(8)在第四个元素的位置上插入9元素n");ListInsert(h,4,'9');printf("(9)输出单链表h:");DispList(h);printf("(10)删除h的第三个元素n");ListDelete(h,3,e);printf("(11)输出单链表h:");DispList(h);printf("(12)释放单链表hn");DestroyList(h);五、实验测试及结果六、思考题1、单链表有带头结点和不带头结点两种形式,则相应的操作实现有何区别?答:在
11、带头节点的单链表中,头指针(head)只有一个域,即链指针,它指向头结点,头结点有两个域,一个是数据域,值为0(NULL,还有一个域,链指针,这个链指针指向单链表的第一个数据元素。而在不带头结点的单链表中,头指针也只有一个链指针,但它指向单链表的第一个数据元素。2、单向循环链表、双向链表、双向循环链表基本操作的实现。答:(1)单向循环链表循环链表的基本运算实现算法与非循环链表的算法基本相同,只是对表尾的判断作了改变。因此单向循环链表与单链表基本上操作相同,只不过表尾的条件将发生变化。(2)双向链表基本操作实现双链表中有两个指针域,一个指向其直接后继结点,另一个指向其直接前驱结点。建立双链表有头
12、插法和尾插法。【1】头插法:VoidCreateListF(DLinkList*&L,ElemTypea,intn)/由含有n个元素的数组a创建带头结点的双链表LDLinkList*s;inti;L=(DLinkList*)malloc(sizeof(DLinkList);L->prior=L->next=NULL;for(i=0;i<n;i+)s=(DLinkList*)malloc(sizeof(DLinkList);s->data=ai;s->next=L->next;if(L->next!=NULL)L->next=L->p
13、rior=s;L->next=s;s->prior=L;【2】尾插法VoidCreateListF(DLinkList*&L,ElemTypea,intn)/由含有n个元素的数组a创建带头结点的双链表LDLinkList*s,*r;intI;L=(DLinkList*)malloc(sizeof(DLinkList);L->prior=L->next=NULL;r=L;/r始终指向尾结点,开始时指向头结点for(i=0;i<n;i+)s=(DLinkList*)malloc(sizeof(DLinkList);s->data=ai;r->nex
14、t=s;s->prior=r;r=s;r->next=NULL;在双链表中,大部分基本操作运算与单链表相同,除插入与删除有所区别。【插入】intListInsert(DLinkList*&L,intI,ElemTypee)intj=0;DLinkList*p=L,*s;/p(指向头结点While(j<i-1&&p!=NULL)/查找第i-1个结点j+;p=p->next;if(p=NULL)/|未找到逻辑位序位i-1的结点return0;else/|找到逻辑位序为i-1的结点*ps=(DLinkList*)malloczeof(DLinkList
15、)/创建结点*s;s->data=e;s->next=p->next;/|将*s插入到*p之后if(p->next!=NULL)p->next->prior=s;s->prior=p;p->next=s;return1;【删除】intListDelete(DLinkList*&L,intI,ElemType&e)DLinkList*p=L,*q;/p指向头结点intj=0;while(j<i-1&&p!=NULL)查找第i-1个结点j+;p=p->next;if(p=NULL)return0;elseq
16、=p->next;if(q=NULL)return0;e=q->data;p->next=q->next;/从单链表中删除*q结点if(p->next!=NULL)p->next->prior=p;free(q);/|释放*p结点return1;(2)双向循环链表实现:插入操作(在p所指结点之前插入q结点的过程)StatusListInsert_Dl(DLinkList&L,inti,ElemTypex)/在带头结点的向循环链表L中第i个位置之前插入元素x,i的合法值为1&i0表长+1if(!(p=GetElemP_Dul(L,i)/在L中确定第i个元素的位置指针preturnERROR;if(!(q=(DuLNode)malloc(sizeof(DuLNode)returnERROR;q->data=x;q->prior=p->prior;p->prior->next=q;q->next=p;p->prior=q;returnOK;)删除操作算法(删
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年鄂尔多斯市东胜区住房和城乡建设局人员招聘笔试备考题库及答案详解
- 2026延安志丹县事业单位本科及以上学历自主就业退役士兵招聘(7人)考试备考试题及答案详解
- 2026年淮南师范学院科研助理招聘1名考试模拟试题及答案详解
- 2026年长治市郊区住房和城乡建设局人员招聘笔试备考题库及答案详解
- 2026重庆鈊渝金融租赁股份有限公司招聘7人考试参考题库及答案详解
- 2026年北海市铁山港区住房和城乡建设局人员招聘考试备考题库及答案详解
- 六年级阅读试题及答案
- 2026年山东省枣庄市住房和城乡建设局人员招聘考试备考题库及答案详解
- 2026年北海市海城区住房和城乡建设局人员招聘笔试备考题库及答案详解
- 人工智能赋能保险客户服务升级
- 2026江西九江市大学生乡村医生专项计划招聘17人参考题库附答案详解(基础题)
- 2026云南地矿工程勘察集团有限公司第一次招聘13人笔试题库及参考答案详解【研优卷】
- 2026年四川省内江市专业技术人员继续教育公需科目试卷及答案
- 《新能源发电建模与并网仿真技术》全套教学课件
- DB44∕T 2835-2026 城镇给水管道非开挖修复工程技术标准
- GB/T 32733-2026香荚兰
- 畜禽粪便纳米膜好氧发酵堆肥技术规范
- 农业局内部监督制度
- 医疗器械生产企业自查报告模板
- 增量配电网运营制度
- 血脂管理健康科普
评论
0/150
提交评论