看我如何手撕C语言链表

看我如何手撕C语言链表

努力学习C语言链表
新手学习C语言碰到最难的内容大多数是链表,学习链表的开始就是其创建,然后进行一些增、删、插等操作。本篇文章就向从单向链表(最简单的链表)的建立和删除操作开始讲,只要懂了这,那些增、插操作以及循环链表、双向链表都是很简单的。
我们要先了解链表的组成个体是节点,而对于单向链表而言,每个节点包括数据域和指向下一节点的指针域,二者顺序不要记反。即
注意!!! 头指针指向的头结点的data为空,头结点的next指向的首元节点的data才开始有东西,即图中b1不为空。
在这里插入图片描述

这里先介绍 头部开始插入节点(较简单) 的链表建立方法,也有从尾部开始建立链表的方法,但在这不讲。

建议先看一遍 最后一段的文字

#include <stdio.h>
#include <malloc.h>
struct Node
{
    int data;
    struct Node* next;
}

 creatListHead(struct Node* head)
 {
    struct Node* p = NULL;//临时使用
    struct Node* q;//用q来指向前节点,
    q = head;//一开始q指向头结点,另外head的值不能够动,保留下来留作以后查找链表
    int data;

    scanf_s("%d", &data);

    //在程序中用-1作为链表输入的结束符
    while (data != -1)
    {
        //分配空间,赋值
        p = (struct Node*)malloc(sizeof(struct Node));//循环第一次时,p(即为上图中的首元节点)
        p->data = data;//放数据
        p->next = NULL;//因为是个新节点,其next是无指向对象的;
        q->next = p;//循环第一次时,这步就把头结点的next指向了首元节点
        q = p;
        scanf_s("%d", &data);
    }
 }
    


void main()
{
    struct Node* head = NULL;
    struct Node* y = NULL;
    head = (struct Node*)malloc(sizeof(struct Node));//第一步就是建立头指针
    head->next = NULL;//一旦给一个节点分配空间,最好将其next域设为NULL,能防止出错;
    //即上图中的头结点的next一开始为空,因为还没开始存数据,它没有指向的对象;
    //而头结点的data(为空) 不用做什么操作,直接建立从头指针到头结点中的next操作
    //以上三行代码是建立链表的常规操作。
    creatListHead(head);
    for (y = head->next; y != NULL; y = y->next)//用y遍历来检验链表的建立情况
    {
        printf("%d \n", y->data);
    }
}


结果如图
在这里插入图片描述

假设有两个节点,q指向前节点,p指向后节点(q和p都是指针),现在要想把前节点连接后节点,只能利用节点中的next=指向下一个节点的指针 来连接下一个节点,如q-next=p,这就连好了两个节点。连接任意两个节点都是 前一个节点的next=指向后一个节点的指针。由此知道连接任意两个节点 需要两个节点。上面代码就是利用q和p两个指针来连接节点的,p一直指向新节点,但是指向前节点的指针需要不断改变才能不断地利用它的next连接新节点,所以上面的代码要有q=p(没开始循环时q=head,指向头结点,进入第一次循环: 在 q=p之前,已经连接好两个节点了,等到执行q=p后,q就指向了首节点了…第二次,第三次循环结束时q依次指向已经建立当前链表的最后一个节点) 如果在一段已经建立好的链表中 指针变量 q 指向某一个节点, p指向另外一个节点 让 q=p或者q=p-next只是改变了q指向的节点,由于没有涉及到q-next= ,所以链表完好无损。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值