单链表的遍历

1.什么是遍历
遍历就是把单链表的各个节点挨个拿出来,一个不能少,也不能重复,追求效率。

2.如何遍历单链表
(1)分析数据结构的本身特点,然后根据根据它本身的特点制定相应的遍历算法。
(2)单链表的特点就是有多个节点组成,头指针+头结点为整个链表的开始,最后一个节点的特点是它内部的pNext指针值为NULL。从起点到结尾中间由各个节点内部的pNext指针来挂接,并且路径只有一条。
(3)遍历方法:从头指针+头节点开始,顺着指针依次访问各个节点,取出各个节点的数据,直到最后一个节点,结束返回。

#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;
}


//单链表遍历函数,pH为单链表的头指针,遍历的节点数据打印出来(无头结点遍历)
void bianli(struct node *pH)
{
        //struct node *p = pH;  头指针后面是头节点这样初始化下面会打印头结点的数据
struct node *p = pH->pNext;

        printf("开始遍历==================\n");

        //pH->data;     //头结点的数据,不算链表的常规数据
        while(NULL != p->pNext)
        {
                printf("node data = %d\n",p->data);
                p = p->pNext;
        }

        printf("node data = %d\n",p->data);     //这种方法解决了最后一个节点内内打印不出来的问题,但效果不好
        printf("遍历完成==================\n");


}

//有头节点遍历
void bianli2(struct node *pH)
{
        struct node *p = pH;  //头指针后面是头节点这样初始化下面会打印头结点的数据

        printf("开始遍历==================\n");

        while(NULL != p->pNext)
        {
                p = p->pNext;
                printf("node data = %d\n",p->data);
        }

        printf("遍历完成==================\n");


}

int main(void)
{
        //定义头指针
        //struct node *pHeader = NULL;  这里如果把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));


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

        bianli(pHeader);
        bianli2(pHeader);

        return 0;
}

  • 7
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值