链表的节点插入

1.在链表的尾部插入新节点

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

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

};


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

        //创建一个链表节点
        struct node *p = (struct node *)malloc(sizeof(struct node));
        if(NULL == p)
        {
                printf("malloc error\n");
                return NULL;
        }


        //清理申请到的堆内存
        // void bzero(void *s, size_t n);
        bzero(p,sizeof(struct node));

        //填充节点
        p->data = data;
        p->pNext = NULL;       //将来要指向下一个节点的首地址

        return p;
}



//重尾部加入新节点
struct node *insert_tail(struct node *pH,struct node *new)
{
        //第一步:先找到最后一个节点
		struct node *p = pH;

        while(NULL != p->pNext)
        {
                p = p->pNext;   //往后走一个节点

        }
        p->pNext = new;

        return new;
}


int main(void)
{
        //定义头指针
        //struct node *pHeader = NULL;  这里如果把pHeader赋值为NULL在加入节点这个函数内就会出现段错误
        struct node *pHeader = creat_node(1);

        insert_tail(pHeader,creat_node(2));

        insert_tail(pHeader,creat_node(3));

        insert_tail(pHeader,creat_node(4));


        printf("node1 data = %d\n",pHeader->data);

        printf("node2 data = %d\n",pHeader->pNext->data);

        printf("node3 data = %d\n",pHeader->pNext->pNext->data);
        return 0;
}

2.重链表头部插入新节点

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

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

};


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

        //创建一个链表节点
        struct node *p = (struct node *)malloc(sizeof(struct node));
        if(NULL == p)
        {
                printf("malloc error\n");
                return NULL;
        }


        //清理申请到的堆内存
        // void bzero(void *s, size_t n);
        bzero(p,sizeof(struct node));

        //填充节点
        p->data = data;
        p->pNext = NULL;       //将来要指向下一个节点的首地址

        return p;
}

//重头部加入新节点
void insert_head(struct node *pH,struct node *new)
{

/*      方法一:
         
        //第一步:新节点的pNext指向第一个节点
        new->pNext = pH->pNext;
        //第二部:头结点的pNext指向新节点
        pH->pNext = new;
        //第三部:头结点的计数加1
        pH->data += 1;
*/
        方法二:

        //先保存第一个节点
        struct node *p1 = pH->pNext;
        //让头结点的pNext指向新节点
        pH->pNext = new;
        //新节点的pNext指向保存好的第一个节点
        new->pNext = p1;
        //头结点计数加1
        pH->data += 1;
}

int main(void)
{
        //定义头指针为空节点
        struct node *pHeader = creat_node(0);

        insert_head(pHeader,creat_node(1));

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


        printf("header node data = %d\n",pHeader->data);        //打印有多少个节点

        printf("node1 data = %d\n",pHeader->pNext->data);

        printf("node2 data = %d\n",pHeader->pNext->pNext->data);

        printf("node3 data = %d\n",pHeader->pNext->pNext->pNext->data);
        return 0;
}

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值