C语言 链表

参考博客(写得很不错,我就是看这个看懂了٩(๑>◡<๑)۶ ):
https://blog.csdn.net/Endeavor_G/article/details/80552680?spm=1001.2014.3001.5506

以下为个人理解,如有错误欢迎指出~~~

对链表的理解

链表有一个头结点head、普通带数据的结点node以及指向最后一个结点的结点tail。
head、node和tail是指针,我们用malloc函数申请内存,并返回那个内存的开头地址给这些指针。
大致上是这样:
在这里插入图片描述
每一次创建一个普通结点,指针*node指向新的那个结点的地址,尾指针tail(图片里用的是end)也随着改变指向新的结点(数字1、2、3……n分别为第一次创建结点时、第二次创建结点时……)。

关于类型都为同一个结构体

链表代码里有个tail = head的理解,用指针test01作为指针head,指针test02作为指针tail,代码:

#include <stdio.h>
#include <stdlib.h>
//创建结构体
typedef struct{
    int a;
    char b;
}test;
int main(void)
{
    test *test01,*test02;
    test01 = (test*)malloc(sizeof(test));
    printf("test01=%p,test02=%p\n",test01,test02);
    test02 = test01;
    printf("test01=%p,test02=%p\n",test01,test02);
    return 0;
}

结果:
在这里插入图片描述
可以看到,在还没进行test02=test01的操作时,它们两个指向的地址是不同的;
但当执行了test02=test01的操作后,它们两个指针都是指向了同一个地址。
所以,在下面代码里的tail = head其实就是将这两个指针都指向一个地址(这个地址为头结点的地址)。
然后还有个tail = node,就是在将指针tail指向指针node指向的普通结点的地址。

代码

#include <stdio.h>
#include <stdlib.h>
//创建节点结构
typedef struct  Link{
    int num;
    struct Link *next;
}link;
link *creat_link(void);
void traverse_link(link *link_node);
int main(void)
{
    link *p = creat_link();
    traverse_link(p);
    return 0;
}

//创建链表
link *creat_link(void)
{
    int num;
    //创建头结点指针、尾指针和普通节点指针
    link *head,*tail,*node;
    //给头结点分配地址
    head = (link*)malloc(sizeof(link));
    //让tail和head都指向同一个头结点地址
    tail = head;

    //创建结点
    while (1)
    {
        scanf("%d",&num);
        if(num!=-1){
            //创建普通节点
            node = (link*)malloc(sizeof(link));
            node->num = num;
            //头结点指向node
            tail->next = node;
            tail = node;
        }else{
            break;
        }
    }
    //结束创建,最后的结点指向NULL
    tail->next = NULL;
    return head;
}

//遍历链表
void traverse_link(link *link_node)
{
    link *p = link_node->next;
    while (p!=NULL)
    {
        printf("%d\n",p->num);
        p = p->next;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值