C++实验设计(二)--单向链表的设计.docVIP

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
这一次是有关链表的总结: 许多人对链表很陌生,链表是数据结构的核心内容,我们学的只是其中的一点,多余的内容我也不太清楚,有兴趣的话可以查看有关数据结构的书。 下面主要谈谈创建简单的链表是怎么实现的。 一、 链表是由节点通过指针连在一块的,所以节点是其基本元素: 、首先创建节点: struct Node { int a; Node *next; }; 链表的节点和一般的结构体有点区别,包含两个部分:1、数据域 2、指针域。 数据域是根据自己的需要所设计的,上例中int a就是数据域的内容,Node *next是指针域的内容,我这个链表是模拟整型数据进栈出栈的过程。书上有个内容:一般情况下,结构体是不含有本身结构体的变量,例如: struct Node { int a; Node next; }; 这样就不正确了,具体原因是因为这个结构体没创建成功,不知道其所占空间,系统无法为之分配空间,但是可以使自身的指针型数据,因为无论是何种类型的指针,其所占空间大小都是4个字节,所占空间大小就很明确了。 下面我们就具体来实现这个创建链表的过程: 、添加节点: void creat(Node *Head) { Node *p=new Node; cinp-a; p-next=Head; Head=p; } 数据结构中成这种添加节点的方法叫头插法,自然有对应的尾插法(这里不说了)。注意几个细节吧:1、void creat(Node *Head)中的Head前加了个“”符号表示引用,这表明从主函数中传递过来的头节点的别名是Head,就是在该函数中改变Head的指向影响到了主函数传递过来的参数的指向,“*”表示的是指针变量。创建链表一定要用堆空间的形式来为节点申请空间,这样做当然有好处,如果不用堆空间,那么在该函数中申请的局部自动变量会随着该函数的结束而被销毁空间,那么所创建的链表也就不复存在了。故用堆空间来申请。 我们在主函数中具体的操作一下: struct Node { int a; Node *next; }; #includeiostream using namespace std; void creat(Node *Head) { Node *p=new Node; cout请输入一个整数:; cinp-a; p-next=Head; Head=p; } int main() { Node *head=NULL; creat(head); couthead-aendl; return 0; } 具体可以体验一下,但是由上面我们可以看到,其实在主函数中创建的链表只有一个节点,算不上链表,那么要想真正的成为一条链,该怎么办? 其实在主函数中用for循环语句控制即可:例如这样: int main() { Node *head=NULL; for(int i=0;i5;i++) { creat(head); } couthead-aendl; return 0; } 这样就可以添加许多数据了,这个创建的是具有5个节点的链表,这样真正实现了链状,好像少了点东西,即遍历链表。 我们要把5个数据表现出来,这时需要另外设计一个遍历链表的函数: 虽然这是个链表,但是你怎么能知道每个数据存放在何处?其实由于是链表,我们只需要知道头节点的位置即可,这就回到结构体的设计:Node *next;的作用就是连接下一个节点,用它来记录下一个节点的地址值,这样我们就清楚了,主函数中head是记录头节点位置的,刚开始时head是指向NULL的,后来进入到creat(head);函数中,其指向就改变了,编程指向链表的头节点的位置,这就是引用传递的效果“void creat(Node *Head)”中Head前是“”,引用的标志,也就是起这个作用,改变主函数中head的指向。 下面就写一个对链表遍历的函数: 、链表的遍历 void show(const Node *Head) { if(Head==NULL){cout链表是空\n;} while(Head!=NULL) { coutHead-a ; Head=Head-next; } } 这样就可以实现你想查看的数据了 在主函数中这样就可以实现: int main() { Node *head=NULL; for(int i=0;i5;i++) { creat(head); } show(head); return 0; } 下面在说如何删除链表: 、删除链表的函数设计: void deletehead(Node *Head) { Node *p=Head; while(p!=NULL) { p=Head-next; dele

文档评论(0)

精华文档888 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档