ImageVerifierCode 换一换
格式:DOC , 页数:36 ,大小:565.04KB ,
资源ID:4509520      下载积分:5 金币
验证码下载
登录下载
邮箱/手机:
验证码: 获取验证码
温馨提示:
支付成功后,系统会自动生成账号(用户名为邮箱或者手机号,密码是验证码),方便下次登录下载和查询订单;
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/4509520.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  
声明  |  会员权益     获赠5币     写作写作

1、填表:    下载求助     留言反馈    退款申请
2、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
3、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
4、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
5、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【二***】。
6、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
7、本文档遇到问题,请及时私信或留言给本站上传会员【二***】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。

注意事项

本文(数据结构C语言版-线性表的单链表存储结构表示和实现优质资料.doc)为本站上传会员【二***】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4008-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

数据结构C语言版-线性表的单链表存储结构表示和实现优质资料.doc

1、数据结构C语言版 线性表的单链表存储结构表示和实现优质资料(可以直接使用,可编辑 优质资料,欢迎下载)#include #include #include /*数据结构C语言版 线性表的单链表存储结构表示和实现P28-31 日期:2021年2月10日 */typedef int ElemType;/ 线性表的单链表存储结构 typedef struct LNodeElemType data;/数据域struct LNode *next;/指针域LNode, *LinkList;/ typedef struct LNode *LinkList; / 另一种定义LinkList的方法 / 构造一个

2、空的线性表L int InitList(LinkList *L)/*产生头结点L,并使L指向此头结点,头节点的数据域为空,不放数据的。void * malloc(size_t)这里对返回值进行强制类型转换了,返回值是指向空类型的指针类型。*/(*L) = (LinkList)malloc( sizeof(struct LNode) );if( !(*L) )exit(0);/ 存储分配失败(*L)-next = NULL;/ 指针域为空return 1;/ 销毁线性表L,将包括头结点在内的所有元素释放其存储空间。int DestroyList(LinkList *L) LinkList q;/

3、 由于单链表的每一个元素是单独分配的,所以要一个一个的进行释放while( *L )q = (*L)-next;free( *L );/释放*L = q;return 1;/*将L重置为空表,即将链表中除头结点外的所有元素释放其存储空间,但是将头结点指针域置空,这和销毁有区别哦。不改变L,所以不需要用指针。*/int ClearList( LinkList L ) LinkList p, q;p = L-next;/ p指向第一个结点 while( p )/ 没到表尾则继续循环 q = p-next;free( p );/释放空间p = q;L-next = NULL; / 头结点指针域为空,

4、链表成了一个空表 return 1;/ 若L为空表(根据头结点L-next来判断,为空则是空表),则返回1,/ 否则返回0。int ListEmpty(LinkList L) if( L-next )/ 非空 return 0;elsereturn 1;/ 返回L中数据元素个数。int ListLength(LinkList L) int i = 0;LinkList p = L-next; / p指向第一个结点 while(p) / 没到表尾,则继续循环 i+;p=p-next;return i;/ 算法2.8 P29/ L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并/ 返回

5、1,否则返回0。int GetElem(LinkList L,int i,ElemType *e)int j = 1;/ j为计数器 LinkList p=L-next;/ p指向第一个结点 while(p&jnext;j+; if(!p|ji) / 第i个元素不存在 return 0;*e = p-data; / 取第i个元素 return 1;/ 返回L中第1个与e满足关系compare()的数据元素的位序。/ 若这样的数据元素不存在,则返回值为0int LocateElem(LinkList L,ElemType e,int(*compare)(ElemType,ElemType) in

6、t i=0;LinkList p=L-next;while(p)/将链表的每一个元素进行对比i+;if(compare(p-data,e) / 找到这样的数据元素 return i;p=p-next;return 0;/ 若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,/ 返回1;否则操作失败,pre_e无定义,返回-1int PriorElem(LinkList L,ElemType cur_e,ElemType *pre_e) LinkList q, p=L-next;/ p指向第一个结点 while(p-next)/ p所指结点有后继 q=p-next; / q为p

7、的后继 if(q-data=cur_e)*pre_e=p-data;return 1;p=q; / p向后移 return -1;/ 若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继, / 返回1;否则操作失败,next_e无定义,返回-1 int NextElem(LinkList L,ElemType cur_e,ElemType *next_e)LinkList p=L-next; / p指向第一个结点 while(p-next) / p所指结点有后继 if(p-data=cur_e)*next_e=p-next-data;return 1;p=p-next;re

8、turn -1;/算法2.9 P30/在带头结点的单链线性表L中第i个位置之前插入元素eint ListInsert(LinkList *L,int i,ElemType e) int j=0;LinkList p=*L,s;while(p & jnext;j+;if(!p | ji-1) / i小于1或者大于表长 return 0;s=(LinkList)malloc(sizeof(struct LNode); / 生成新结点 s-data=e; / 插入L中 s-next=p-next;p-next=s;return 1;/ 算法2.10 P30/ 在带头结点的单链线性表L中,删除第i个元

9、素,并由e返回其值int ListDelete(LinkList *L, int i,ElemType *e)int j = 0;LinkList p=*L,q;while(p-next&jnext;j+;if(!p-next|ji-1) / 删除位置不合理 return 0;q=p-next; / 删除并释放结点 p-next=q-next;*e=q-data;free(q);return 1;/ 依次对L的每个数据元素调用函数vi()int ListTraverse(LinkList L,void(*vi)(ElemType)LinkList p=L-next;/对所有元素调用函数viwh

10、ile(p)vi(p-data);p=p-next;printf(n);return 1;/ 在按非降序排列的线性表L中按非降序插入新的数据元素e void InsertAscend(LinkList L,ElemType e) LinkList q=L, p=L-next;while(p&ep-data)q=p;p=p-next;q-next=(LinkList)malloc(sizeof(struct LNode); / e插在q后 q-next-data=e;q-next-next=p;/ 按非升序排列的线性表L中按非升序插入新的数据元素e void InsertDescend(Link

11、List L,ElemType e) LinkList q=L,p=L-next;while(p&edata)q=p;p=p-next;q-next=(LinkList)malloc(sizeof(struct LNode); / e插在q后 q-next-data=e;q-next-next=p;/ L的头部插入新的数据元素e,作为链表的第一个元素 int HeadInsert(LinkList L,ElemType e)LinkList s;s=(LinkList)malloc(sizeof(struct LNode); / 生成新结点 s-data=e; / 给结点赋值 s-next=L

12、-next; / 插在表头 L-next=s;return 1;/ 在L的尾部插入新的数据元素e,作为链表的最后一个元素 int EndInsert(LinkList L,ElemType e) LinkList p=L;while(p-next) / 使p指向表尾元素 p=p-next;p-next=(LinkList)malloc(sizeof(struct LNode); / 在表尾生成新结点 p-next-data=e; / 给新结点赋值 p-next-next=NULL; / 表尾 return 1;/ 删除L的第一个数据元素,并由e返回其值 int DeleteFirst(Link

13、List L,ElemType *e)LinkList p=L-next;if(p)*e=p-data;L-next=p-next;free(p);return 1;elsereturn 0;/ 删除L的最后一个数据元素,并用e返回其值int DeleteTail(LinkList L,ElemType *e)LinkList p=L,q;if(!p-next) / 链表为空 return 0;while(p-next)q=p;p=p-next;q-next=NULL; / 新尾结点的next域设为NULL *e=p-data;free(p);return 1;/ 删除表中值为e的元素,并返回

14、1;如无此元素,则返回0 int DeleteElem(LinkList L,ElemType e)LinkList p=L,q;while(p)q=p-next;if(q&q-data=e)p-next=q-next;free(q);return 1;p=q;return 0;/ 用e取代表L中第i个元素的值 int ReplaceElem(LinkList L,int i,ElemType e)LinkList p=L;int j=0;/找到第i个元素的位置给pwhile(p-next & jnext;if(j=i)p-data=e;return 1;else / 表中不存在第i个元素 r

15、eturn 0;/ 按非降序建立n个元素的线性表int CreatAscend(LinkList *L,int n) int j;LinkList p,q,s;if(ndata);s-next=NULL;(*L)-next=s;for(j=1;jdata);q=*L;p=(*L)-next;while(p&p-datadata) / p没到表尾,且所指元素值小于新值 q=p;p=p-next; / 指针后移 s-next=q-next; / 元素插在q的后面 q-next=s;return 1;/ 按非升序建立n个元素的线性表int CreatDescend(LinkList *L,int n

16、) int j;LinkList p,q,s;if(ndata);s-next=NULL;(*L)-next=s;for(j=1;jdata);q=*L;p=(*L)-next;while(p&p-datas-data) / p没到表尾,且所指元素值大于新值 q=p;p=p-next; / 指针后移 s-next=q-next; / 元素插在q的后面 q-next=s;return 1;/ 返回表头元素的值int GetFirstElem(LinkList L,ElemType *e) LinkList p=L-next;/第一个结点给pif(!p)/ 空表 return 0;else/ 非空

17、表*e=p-data;return 1;/ 算法2.11 P30 / 逆位序(插在表头)输入n个元素的值,建立带表头结构的单链线性表Lvoid CreateList(LinkList *L,int n)int i;LinkList p;/ 先建立一个带头结点的空单链表,相当于初始化单链表 *L=(LinkList)malloc(sizeof(struct LNode);(*L)-next=NULL; printf(请输入%d个数据n,n);for(i=n;i0;-i)p=(LinkList)malloc(sizeof(struct LNode); / 生成新结点 scanf(%d,&p-dat

18、a); / 输入元素值 p-next=(*L)-next; / 插入到表头 (*L)-next=p;/ 正位序(插在表尾)输入n个元素的值,建立带表头结构的单链线性表void CreateList2(LinkList *L,int n) int i;LinkList p,q;/ 先建立一个带头结点的空单链表,相当于初始化单链表 *L=(LinkList)malloc(sizeof(struct LNode); / 生成头结点 (*L)-next=NULL;q=*L;printf(请输入%d个数据n,n);for(i=1;idata);q-next=p;q=q-next;p-next=NULL;

19、/*用单链表重写 算法2.2 供参考 已知线性表La和Lb中的数据元素按值非递减排列。归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列void MergeList(LinkList La,LinkList Lb,LinkList *Lc)int i=1,j=1,k=0;int La_len,Lb_len;ElemType ai,bj;InitList(Lc);La_len=ListLength(La);Lb_len=ListLength(Lb);while(i=La_len&j=Lb_len) / 表La和表Lb均非空GetElem(La,i,&ai);GetElem(Lb,j

20、,&bj);if(ai=bj)ListInsert(Lc,+k,ai);+i;elseListInsert(Lc,+k,bj);+j;while(i=La_len) / 表La非空且表Lb空GetElem(La,i+,&ai);ListInsert(Lc,+k,ai);while(jnext,pb=(*Lb)-next,pc;*Lc=pc=La; / 用La的头结点作为Lc的头结点 while(pa&pb)if(pa-data data)pc-next=pa;*Lc=pa;pa=pa-next;elsepc-next=pb;pc=pb;pb=pb-next;pc-next=pa ? pa :

21、pb; / 插入剩余段 free(*Lb); / 释放Lb的头结点 Lb=NULL;/ 判断是否相等的函数,Union()用到int equal(ElemType c1,ElemType c2) if(c1=c2)return 1;elsereturn 0;/ 算法2.1/ 将所有在线性表Lb中但不在La中的数据元素插入到La中 void Union(LinkList La,LinkList Lb) ElemType e;int La_len,Lb_len;int i;La_len=ListLength(La); / 求线性表的长度 Lb_len=ListLength(Lb);for(i=1;

22、i=Lb_len;i+)GetElem(Lb,i,&e); / 取Lb中第i个数据元素赋给e if(!LocateElem(La,e,equal) / La中不存在和e相同的元素,则插入之 ListInsert(&La,+La_len,e);/ 数据元素判定函数(相等为1,否则为0) int comp(ElemType c1,ElemType c2)if(c1=c2)return 1;elsereturn 0;void visit(ElemType c)printf(%d ,c);int main()LinkList L, La, Lb, Lc;ElemType e, e0, d;int i,

23、 j, n, k;/初始化一个单链表i=InitList(&L);/通过插入操作创建一个单链表for(j=1;j=5;j+)i=ListInsert(&L,1,j);/调用visit函数,对单链表进行遍历printf(在L的表头依次插入15后:L=);ListTraverse(L,visit); / 依次对元素调用visit(),输出元素的值 /判断单链表是否为空i=ListEmpty(L);printf(L是否空:i=%d(1:是 0:否)n,i);/清空单链表i=ClearList(L);printf(清空L后:L=);ListTraverse(L,visit);/判断单链表是否为空i=L

24、istEmpty(L);printf(L是否空:i=%d(1:是 0:否)n,i);/再次通过插入操作创建一个单链表for(j=1;j=10;j+)ListInsert(&L,j,j);printf(在L的表尾依次插入110后:L=);ListTraverse(L,visit);/取得单链表的第5个元素GetElem(L,5,&e);printf(第5个元素的值为:%dn,e);/在单链表中找到和j满足comp函数关系的元素for(j=0;j=1;j+)k=LocateElem(L,j,comp);if(k)printf(第%d个元素的值为%dn,k,j);elseprintf(没有值为%d的

25、元素n,j);/找到某个元素的前驱for(j=1;j=2;j+) / 测试头两个数据 GetElem(L,j,&e0); / 把第j个数据赋给e0 i=PriorElem(L,e0,&e); / 求e0的前驱 if(i=-1)printf(元素%d无前驱n,e0);elseprintf(元素%d的前驱为:%dn,e0,e);/找到某个元素的后继for(j=ListLength(L)-1;j=k;j-)i=ListDelete(&L,j,&e); / 删除第j个数据 if(i=0)printf(删除第%d个数据失败n,j);elseprintf(删除的元素为:%dn,e);printf(依次输出

26、L的元素:);ListTraverse(L,visit);/销毁单链表DestroyList(&L);printf(销毁L后:L=%unn,L);printf(按非降序建立n个元素的线性表L,请输入元素个数n: );scanf(%d,&n);CreatAscend(&L,n);printf(依次输出L的元素:);ListTraverse(L,visit);/ 按非降序插入元素10InsertAscend(L,10); printf(按非降序插入元素10后,线性表L为:);ListTraverse(L,visit);/ 在L的头部插入12HeadInsert(L,12);/ 在L的尾部插入9 E

27、ndInsert(L,9); printf(在L的头部插入12,尾部插入9后,线性表L为:);ListTraverse(L,visit);i=GetFirstElem(L,&e); printf(第1个元素是: %dn,e); printf(请输入要删除的元素的值: );scanf(%d,&e);i=DeleteElem(L,e);if(i)printf(成功删除%d!n,e);elseprintf(不存在元素%d!n,e);printf(线性表L为:);ListTraverse(L,visit);printf(请输入要取代的元素的序号 元素的新值: );scanf(%d%d,&n,&e);R

28、eplaceElem(L,n,e);printf(线性表L为:);ListTraverse(L,visit);DestroyList(&L);printf(销毁L后,按非升序重新建立n个元素的线性表L,请输入元素个数n(2): );scanf(%d,&n);CreatDescend(&L,n);printf(依次输出L的元素:);ListTraverse(L,visit);/ 按非升序插入元素10InsertDescend(L,10);printf(按非升序插入元素10后,线性表L为:);ListTraverse(L,visit);printf(请输入要删除的元素的值: );scanf(%d,

29、&e);i=DeleteElem(L,e);if(i)printf(成功删除%d!n,e);elseprintf(不存在元素%d!n,e);printf(线性表L为:);ListTraverse(L,visit);DeleteFirst(L,&e);DeleteTail(L,&d);printf(删除表头元素%d和表尾元素%d后,线性表L为:,e,d);ListTraverse(L,visit);printf(n);/ 测试算法2.11 n = 3;CreateList2(&La,n);/ 正位序输入n个元素的值 printf(正位创建后La=);/ 输出链表La的内容 ListTravers

30、e(La,visit);CreateList(&Lb,n);/ 逆位序输入n个元素的值 printf(逆位创建后Lb=);/ 输出链表Lb的内容 ListTraverse(Lb,visit);DestroyList(&La);DestroyList(&Lb);/ 测试算法2.12/初始化一个单链表Lai=InitList(&La);/通过插入操作创建一个单链表for(j=2;j=10;j+=2)i=ListInsert(&La,1,j);printf(La=); / 输出链表La的内容 ListTraverse(La,visit);/初始化一个单链表i=InitList(&Lb);/通过插入操

31、作创建一个单链表for(j=1;j=10;j+=2)i=ListInsert(&Lb,1,j);printf(Lb=); / 输出链表Lb的内容 ListTraverse(Lb,visit);/ 按非递减顺序归并La和Lb,得到新表LcMergeList(La,&Lb,&Lc); printf(合并La和Lb后,Lc = ); / 输出链表Lc的内容 ListTraverse(Lc,visit);/ 测试算法2.1i=InitList(&La);if(i=1) / 创建空表La成功 for(j=1;j=5;j+) / 在表La中插入5个元素 i=ListInsert(&La,j,j);prin

32、tf(La= ); / 输出表La的内容 ListTraverse(La,visit);InitList(&Lb); / 也可不判断是否创建成功 for(j=1;j2): 3请输入3个元素:(空格)1 3 2依次输出L的元素:3 2 1按非升序插入元素10后,线性表L为:10 3 2 1请输入要删除的元素的值: 3成功删除3!线性表L为:10 2 1删除表头元素10和表尾元素1后,线性表L为:2请输入3个数据1 3 2正位创建后La=1 3 2请输入3个数据1 3 2逆位创建后Lb=2 3 1La=10 8 6 4 2Lb=9 7 5 3 1合并La和Lb后,Lc = 9 7 5 3 1 10

33、 8 6 4 2La= 1 2 3 4 5Lb= 2 4 6 8 10new La= 1 2 3 4 5 6 8 10请按任意键继续. . .*/ HUNANUNIVERSITY课程实习报告 题 目: 哈希表 学生姓名 唐鹏学生学号202108080216 专业班级 物联2班 指导老师吴帆完 成 日 期2021年4月2日一、 需 求 分 析:1. 本程序来自于图书馆靠书名来检索想要查找的书问题。2. 本程序要求:(1)根据输入建立图书名称表,采用创建散列表实现。(2)建散列表后,如果想要查找的数据在散列表中输出yes否则输出no。二、 哈希表简介结构中存在关键字和K相等的记录,则必定存储在f(K)的位置上。由此,不需比较便可直接取得所查记录。这个对应关系f称为散列函数(Hash function),按这个思想建立的表为散列表。* 对不同的关键字可能得到同一散列地址,即key1key2,而f(key1)=f(key2),这种现象称冲突。具有相同函数值的关键字对该散列函数来说称做同义词。* 综上所述,根据散列函数H(key)和处理冲突的方法将一组关键字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象”

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服