单链表的操作实现.docx
- 文档编号:9960264
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:11
- 大小:44.96KB
单链表的操作实现.docx
《单链表的操作实现.docx》由会员分享,可在线阅读,更多相关《单链表的操作实现.docx(11页珍藏版)》请在冰豆网上搜索。
单链表的操作实现
单链表的操作实现
摘要:
单链表的存储结构的特点是用一组任意的存储单元存储线性表的数据元素,链表的每个节点中只包括一个指针域;在单链表中,任何俩个元素的存储位置之间没有固定的联系。
然而,每个元素的存储位置都包括在其直接前驱结点的信息之中。
假设P是指向线性表中的第i个数据元素的指针,则p->next是指向第i+1个数据元素的指针,所以在单链表中,取得第i个数据元素必须从头指针出发寻找;因此,单链表是非随机存取的存储结构。
那么,在单链表中又如何实现“插入”和“删除”等其他操作呢?
关键字:
单链表存储结构指针域插入删除操作
引言:
单链表不要求逻辑上相邻的元素在物理上也是相邻的,因此它没有顺序表存储结构所具有的弱点,但同时也失去了顺序表可随机存取的优点,在单链表中插入或删除一个结点时,仅需修改指针而不需要移动元素。
需求分析:
当线性表的长度变化较大,难以估计其存储规模,另外对线性表频繁进行插入删除操作时,采用单链表作为存储结构可能会更好一些,在实际问题中应该考虑以下因素;
(1)应有利于运算的实现;
(2)应有利于数据的特征;
(3)应有利于软件的环境。
此外,单链表在报数和多项式求值等问题发挥了很大的作用。
算法设计:
(1)单链表的插入算法:
假设要在线性表的两个数据元素a和b之间插入一个数据元素x,已知p为其单链表存储结构中指向结点a的指针,为插入数据元素x,首先要生成一个数据域为x的结点,然后插入到单链表中去。
根据插入操作的逻辑定义,还需要修改结点a的指针域,令其指向结点x,而结点x中指针域应该指向结点b,从而实现3个元素a,b和x之间的逻辑关系的变化,若设s为指向x的指针,则上述指针修改可用下述语句描述:
s->next=p->next;
p->next=s;
算法为:
voidInsert_Linklist(Linklist&L,inti,doublee)
{
Linklistp,s;
p=L;
intj=0;
cout<<"Pleaseinputthelocationoftheinsertvaluei:
"< cin>>i; cout<<"Pleaseinputtheinsertvaluee: "< cin>>e; while(p&&j { p=p->next; ++j; } if(p==Null||j>i-1) Cout<<"error"< s->data=e; s->next=p->next; p->next=s; } (2)单链表的删除算法设计: 在线性表中删除元素b时,为在单链表中实现元素a,b,c之间逻辑关系的变化,仅仅只需要修改结点a中的指针域即可,假设p为指向结点a的指针,则修改指针的语句为: P->next=p->next->next; 算法为: voidDelete_Linklist(Linklist&L,inti,double&e) { Linklist*p,*q; intj=0; p=L; cout<<"Pleaseinputthelocationofthedeletevaluei: "< cin>>i; while(p->next) { p=p->next; ++j; } if(p->next==Null||j>i-1) Cout<<''error"< e=q->data; p->next=q->next; free(q); } 程序实现: #include #include #include #include #include #definemax100 typedefstructlnode{ doubledata; structlnode*next; }Lnode,*Linklist; voidInit_Linklist(Linklist&L) { L=(lnode*)malloc(sizeof(lnode)); if(! L) { cout<<"error"< exit(0); } L->next=NULL; } voidAdd_Linklist(LinklistL) { Linklistp,s; doublex; inti; cout<<"Pleaseinputtheaddvaluex: (输入10000结束)"< for(i=0;i { p=L; cin>>x; if(x==10000)break; while(p->next) { p=p->next; } s=(Linklist)malloc(sizeof(Lnode)); s->data=x; s->next=NULL; p->next=s; } } voidInsert_Linklist(LinklistL) { doublee; inti; Linklistp,s; p=L; intj=0; cout<<"Pleaseinputthelocationoftheinsertvaluei: "< cin>>i; cout<<"Pleaseinputtheinsertvaluee: "< cin>>e; while(p&&j { p=p->next; ++j; } if(p==NULL||j>i-1) { cout<<"error"< } s=(Linklist)malloc(sizeof(Lnode)); s->data=e; s->next=p->next; p->next=s; } voidDelete_Linklist(LinklistL) { inti; Linklistp,q; intj=0; p=L; cout<<"Pleaseinputthelocationofthedeletevaluei: "< cin>>i; while(p&&j { p=p->next; ++j; } q=p->next; p->next=p->next->next; } voidCout_Linklist(LinklistL) { Linklistp; intn=0; p=L; while(p->next) { n++; p=p->next; } cout<<"n"<<"="< } voidOutput_Linklist(LinklistL) { Linklistp; p=L; while(p->next) { p=p->next; cout< } cout< } voidmain() { LinklistL; Init_Linklist(L); Add_Linklist(L); Cout_Linklist(L); Output_Linklist(L); Insert_Linklist(L); Cout_Linklist(L); Output_Linklist(L); Delete_Linklist(L); Cout_Linklist(L); Output_Linklist(L); } 调试过程: .cpp(14): errorC2059: syntaxerror: ';' e: \users\administrator\desktop\单链表.cpp(21): errorC2440: '=': cannotconvertfrom'structLnode*'to'structLnode**' Typespointedtoareunrelated;conversionrequiresreinterpret_cast,C-stylecastorfunction-stylecast e: \users\administrator\desktop\单链表.cpp(27): errorC2227: leftof'->next'mustpointtoclass/struct/union e: \users\administrator\desktop\单链表.cpp(28): errorC2440: '=': cannotconvertfrom'structLnode*'to'structLnode**' Typespointedtoareunrelated;conversionrequiresreinterpret_cast,C-stylecastorfunction-stylecast e: \users\administrator\desktop\单链表.cpp(29): errorC2227: leftof'->data'mustpointtoclass/struct/union e: \users\administrator\desktop\单链表.cpp(30): errorC2227: leftof'->next'mustpointtoclass/struct/union e: \users\administrator\desktop\单链表.cpp(30): errorC2227: leftof'->next'mustpointtoclass/struct/union e: \users\administrator\desktop\单链表.cpp(31): errorC2227: leftof'->next'mustpointtoclass/struct/union e: \users\administrator\desktop\单链表.cpp(37): errorC2440: '=': cannotconvertfrom'structLnode*'to'structLnode**' Typespointedtoareunrelated;conversionrequiresreinterpret_cast,C-stylecastorfunction-stylecast e: \users\administrator\desktop\单链表.cpp(45): errorC2227: leftof'->next'mustpointtoclass/struct/union e: \users\administrator\desktop\单链表.cpp(48): errorC2059: syntaxerror: '||' e: \users\administrator\desktop\单链表.cpp(50): errorC2440: '=': cannotconvertfrom'structLnode*'to'structLnode**' Typespointedtoareunrelated;conversionrequiresreinterpret_cast,C-stylecastorfunction-stylecast e: \users\administrator\desktop\单链表.cpp(51): errorC2227: leftof'->data'mustpointtoclass/struct/union e: \users\administrator\desktop\单链表.cpp(52): errorC2227: leftof'->next'mustpointtoclass/struct/union e: \users\administrator\desktop\单链表.cpp(52): errorC2227: leftof'->next'mustpointtoclass/struct/union e: \users\administrator\desktop\单链表.cpp(53): errorC2227: leftof'->next'mustpointtoclass/struct/union e: \users\administrator\desktop\单链表.cpp(59): errorC2440: '=': cannotconvertfrom'structLnode*'to'structLnode**' Typespointedtoareunrelated;conversionrequiresreinterpret_cast,C-stylecastorfunction-stylecast e: \users\administrator\desktop\单链表.cpp(62): errorC2227: leftof'->next'mustpointtoclass/struct/union e: \users\administrator\desktop\单链表.cpp(62): fatalerrorC1903: unabletorecoverfrompreviouserror(s);stoppingcompilation 执行cl.exe时出错. 单链表.obj-1error(s),0warning(s) 实验结果: 设计体会: 通过此次课程设计,从中学到了单链表的一些基本操作,比如说单链表的插入,删除,查找单链表中的元素,计算单链表中的结点数等等;加深了本学期数据结构课程中链表的理解,从中学会了使用一些编程过程中所需要掌握的技巧,熟练掌握了链表在日常生活中的作用,也帮助了自己在后来章节中涉及到链表理解,增加了自己的学习爱好,但是对于链表中的结构体定义过程中还是有一些不理解,特别是指针方面的,这让我知道自己还有哪些方面需要努力花时间来查缺补漏 参考文献: (1)清华大学计算机系列教材《数据结构》(c语言版)严蔚敏吴伟民编著 (2)清华大学出版社《C++程序设计》谭浩强编著 (3)清华大学出版社《C程序设计》谭浩强编著
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单链表 操作 实现