单链表的算法之头部插入节点

1.从头部添加新节点
(1)注意写代码过程中的箭头符号,和说话过程中的指针指向。这是两码事,容易搞混。箭头符号实际上是用指针方式来访问结构体,所以箭头符号的实质是访问结构体中的成员。更清楚一点说程序中的箭头和链表的连接没有任何关系;链表中的节点通过指针指向来连接,编程中表现为一个赋值语句(用=来进行连接),实质是把后一个节点的首地址,赋值给前一个节点中的pNext元素做为值。

#include <stdio.h>

//构建一个链表的节点
struct node
{
    int data;        //有效数据
    struct node* pNext;  //指向下一个节点的指针
};

//创建一个链表的节点
//返回值:指针,指针指向我们本函数新创建的节点的首地址
struct node* creat_node(int data)
{
    struct node* pHeader = NULL;

    //每创建一个新的节点,把这个新的节点和它前一个节点关联起来
    //创建一个链表节点
    struct node* p = (struct node*)malloc(sizeof(struct node));
    if(NULL == p)
    {
        printf("malloc failure\n");
        return NULL;
    }
    memset(p, 0, sizeof(struct node));
    //bzero(p, sizeof(struct node));
    p->data = data;
    p->pNext = NULL;  //将来要指向下一个节点的首地址,实际操作时将下一个节点malloc返回的指针赋值给它

    return p;
}

//尾部插入
//计算添加了新的节点后总共有多少个节点,然后把这个数写进节点中
void insert_tail(struct node* pH, struct node* new)
{
    int count = 0;
    //分两步完成插入
    //第一步,先找到链表中最后一个节点
    struct node* p = pH;
    while(NULL != p->pNext)  //由头指针向后便利,走到最后一个节点
    {
        p = p->pNext;
        count++;
    }

    //第二部,将新节点插入到最后一个节点尾部
    p->pNext = new;  //新节点成为最后一个节点
    pH->data = count + 1;
}

//从头部添加新节点
void insert_head(struct node* pH, struct node* new)
{
    //新节点的next指向原来的第一个节点
    new->pNext = pH->pNext; //pH->pNext是第一个节点的地址
    //头结点的next指向新节点的地址
    pH->pNext = new;
    //头结点中的计数加1
    pH->data += 1;
}

int main()
{
    //头指针
    //struct node* pHeader = NULL;
    struct node* pHeader = creat_node(0);

    insert_head(pHeader, creat_node(1));
    insert_head(pHeader, creat_node(2));
    insert_head(pHeader, creat_node(3));

    /*pHeader = creat_node(1);

    pHeader->pNext = creat_node(2);

    pHeader->pNext->pNext = creat_node(3);*/

    //访问链表中的各个节点的有效数据,这个访问必须注意不能使用p,p2,p3,只能使用pHeader
    //访问链表的头结点有效数据
    printf("beader data: %d\n", pHeader->data); //pHeader->data == p->data

    //访问链表的第1个有效数据
    printf("node2 data: %d\n", pHeader->pNext->data); //pHeader->data == p->data

    //访问链表的第2个有效数据
    printf("node3 data: %d\n", pHeader->pNext->pNext->data); //pHeader->data == p->data

    //访问链表的第3个有效数据
    printf("node3 data: %d\n", pHeader->pNext->pNext->pNext->data); //pHeader->data == p->data

    return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值