C语言学习之:关于链表创建的时候为什么要设置指向头结点的指针的分析;指向头结点的指针为什么很重要

文章目录

代码

//
// Created by qpn on 2022/3/25.
//

#include <malloc.h>
#include "stdio.h"
/*
 * 构建一个链表的结构体
 */
typedef struct Link {
    int ele;
    struct Link *next;
} link;

link *initLink(){
    /*
     * 创建一个头结点
     */
    link *p = (link*)malloc(sizeof(link));
    /*
     * 初始化一个指向头结点的指针
     */
    link *temp = p;

    for (int i = 0; i < 5; ++i) {
        /*
         * 每次都创建一个新的节点,给节点
         */
        link *a = (link*) malloc(sizeof(link));
        a ->ele=i;
        a->next=NULL;
        temp->next=a;
        temp=temp->next;
    }
    return p;
}

void traverse_link(link *p){
    link *head = p;
    while (head->next!=NULL){
        head=head->next;
        printf("value:%d\n",head->ele);
    }
    printf("finished");
}

int main(){
    link *p = initLink();
    traverse_link(p);
    return 0;
}

分析

首先我们要知道头指针 temp 的存在是为了标定头结点的位置,因为最后你要返回一个链表(return p)其实是返回链表的头结点的地址,所以我们必须要保留头结点的位置。

  • 这个时候你可能会有疑问?不保留头结点的位置他还能丢了?他不就在内存里面么。

  • 话虽这么说,但是假设没有指向头结点的指针,那么在产生新结点并链接起来的过程就会不断发生 p=p->next 这样到最后,p 的地址将会是链表最后一个结点的地址,如果这时候返回 p 那返回的就不是一个完整的链表了,而是最后一个指向 NULL 的空结点。

  • 因此,聪明的前辈们选择用一个指向头结点的指针 temp,刚创建头结点的时候,temp 指向的是头结点,相当于一个头结点 p 的分身,然后创建后面的结点的时候,temp 不断进行 temp=temp->next 从而保持头结点不需要进行 p=p->next 也能把后面的链表链接起来。

  • 这样当链表构建完成,temp 指向了链表的最后一个结点,但头结点 p 依然在原来的位置,相当于 temp 完成了这个只有去路没有归路的活!真是个勇士!

  • 如果依然感觉不够直观,可以把 for 循环中的代码改成这样,看看最后会打印出什么样的输出:

 for (int i = 0; i < 5; ++i) {
        /*
         * 每次都创建一个新的节点,给节点
         */
        link *a = (link*) malloc(sizeof(link));
        a ->ele=i;
        a->next=NULL;
        p->next=a;
        p=p->next;
    }
    return p;
  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

暖仔会飞

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

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

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

打赏作者

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

抵扣说明:

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

余额充值