C语言单链表的算法之遍历节点

一:什么是遍历

(1)遍历就是把单链表中的各个节点挨个拿出来,就叫遍历

(2)便利的要点:一是不能遗漏,二是不能重复追求效率

二:如何遍历单链表

(1)分析一个数据结构如何遍历,关键是分析这个数据结构本身的特点。然后根据本身特点来制定它的遍历算法

(2)单链表的特点就是由很多个节点组成,头指针+头节点为整个链表的起始,最后一个节点的特征是它内部的pnext指针的值为null。从起始到结尾中间由各个节点内部的pnext指针来挂接。由起始到结尾的路劲只有一条,这个特点就决定了它的遍历算法

(3)遍历方法:从头指针+头节点开始,顺着链表挂接指针依次访问链表的各个节点,取出这个节点的数据,然后再往下一个节点,直到最后一个数据结束返回

三:编程实战

cpp 复制代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//构建一个链表节点
struct node
{

    int datas;
    struct node *pNEXT;


};

/****************************************
函数名:create
作用:创建一个链表节点
返回值:p 指针,指针指向本函数创建的一个节点的首地址
参数:
****************************************/
struct node *create(int a)
{


    struct node *p = (struct node *)malloc(sizeof(struct node));

    if(NULL == p)
        {
            printf("malloc error!\n");

            return NULL;

        }

      memset(p,0,sizeof(struct node));  
      //bzero(p,sizeof(struct node));

      p->datas = a;
      p->pNEXT = NULL;


      return p;


}


/****************************************
函数名:insert_tail
作用:从链表尾部插入节点
返回值:无
参数:phead:链表的头指针 new:插入的新节点指针
****************************************/
void insert_tail(struct node *phead,struct node *new)
{

    struct node *p = phead;
    int cat = 0;
    while(NULL !=  p->pNEXT)
        {


            p = p->pNEXT;
            cat++;

        }

        p->pNEXT = new;
        phead->datas = cat +1;


}


/****************************************
函数名:insert_head
作用:从链表头部插入节点
返回值:无
参数:phead:链表的头指针 new:插入的新节点指针
****************************************/
void insert_head(struct node *head,struct node *new)
{

    new->pNEXT =  head->pNEXT;

    head->pNEXT = new;

    head->datas += 1;

}

/****************************************
函数名:ergodic
作用:遍历链表的各个节点
返回值:无
参数:ph:链表的头指针
****************************************/
void ergodic(struct node *ph)
{


        struct node *p = ph;        //创建临时指针变量
        int cat = 0;                //临时计数

        printf("datas number is a: %d\n",p->datas);    //输出打印链表节点个数

        while(NULL !=  p->pNEXT)                       //判断pnext是否指向NULL 
            {
                cat++;                                 //循环一次计数加一
                printf("datas number is :%d\n",cat);   //输出当前是第几个节点
                printf("datas is: %d\n",p->pNEXT->datas);  //输出当前节点数据区数据   
                p = p->pNEXT;                              //临时指针变量指向下一个节点




            }

        


}



int main(void)
{
    struct node *phead = create(0);

    insert_tail(phead,create(1));
    insert_tail(phead,create(2));
    insert_tail(phead,create(3));





        ergodic(phead);        

       

      return 0;


}

运行结果:

相关推荐
星火开发设计4 分钟前
C++ 函数定义与调用:程序模块化的第一步
java·开发语言·c++·学习·函数·知识
cypking8 分钟前
二、前端Java后端对比指南
java·开发语言·前端
钟离墨笺11 分钟前
Go语言--2go基础-->map
开发语言·后端·golang
天赐学c语言30 分钟前
1.20 - x的平方根 && vector的扩容机制以及删除元素是否会释放内存
c++·算法·leecode
lsx20240631 分钟前
DOM CDATA
开发语言
Tony Bai36 分钟前
Go 语言的“魔法”时刻:如何用 -toolexec 实现零侵入式自动插桩?
开发语言·后端·golang
Coding茶水间1 小时前
基于深度学习的交通标志检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
开发语言·人工智能·深度学习·yolo·目标检测·机器学习
a努力。1 小时前
字节Java面试被问:TCP的BBR拥塞控制算法原理
java·开发语言·python·tcp/ip·elasticsearch·面试·职场和发展
jiaguangqingpanda1 小时前
Day24-20260120
java·开发语言·数据结构
m0_502724951 小时前
飞书真机调试
开发语言·前端·javascript