链表:带头结点和不带头结点

这是我对于这两者区别的一些思考,欢迎大家交流指正

带头结点实现初始化:

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;
  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青空式微

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值