赞
踩
这是我对于这两者区别的一些思考,欢迎大家交流指正
带头结点实现初始化:
- link * initLinkTou(){
- //声明一个头结点
- link *temp=(link*) malloc(sizeof (link));
- //让头指针指向头结点
- link *p=temp;
- for (int i = 1; i < 5; ++i) {
- link *a=(link*) malloc(sizeof (link));
- a->elem=i;
- a->next=NULL;
- temp->next=a;
- temp=temp->next;
- }
- return p;
- }
不带头结点实现初始化:
- link * initLink(){
- link *p=NULL; //创建头指针
- link *temp=(link*)malloc(sizeof (link)); //创建首元结点
- //首元结点初始化
- temp->elem=1;
- p=temp;
- for (int i = 1; i < 5; ++i) {
- link *a=(link*) malloc(sizeof (link));
- a->elem=i;
- a->next=NULL;
- //将temp结点与新建立的a结点建立逻辑关系
- temp->next=a;
- temp=temp->next;
- }
- return p;
- }
具体实现的区别分析:
需要注意的是,link * p所定义的单纯只是一个link类型的指针变量,就如int * i,float * f一样,没有具体赋值
1.带头结点link * p=temp赋值之后,指向的就是头结点temp地址,使用p->next定义的就是首元节点。
2.不带头结点link * p=temp赋值之后,直接指向的就是首元结点,如果跟上面一样直接用p->next定义下一个结点的话,就会跳过首元节点。所以需要先对首元结点初始化,然后再使用link * p=temp赋值,再使用p->next循环赋值后续结点。
对于带头结点的插入到第一个位置的代码:
- //p = head;
- x->next = head->next;
- head->next = x;
插入其他结点
- x->next = p->next;
- p->next = x;
若令p=head,则带有头结点的链表,可以实现代码复用,减少分支。
对于不带头结点的插入到第一个位置的代码:
- x->next = head;
- head = x;
插入其他结点
- x->next = p->next;
- p->next = x;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。