zoukankan      html  css  js  c++  java
  • C语言实现单链表的遍历,逆序,插入,删除

    单链表的遍历,逆序,插入,删除

    
    #include<stdio.h>
    #include<stdlib.h>
    #include <string.h>
    #define bzero(a, b)             memset(a, 0, b)//windows平台下无bzero函数。 增加宏拓展移植性
     struct node
     {
         int data;                //有效数据 
         struct node *pNext;//指向下一个节点的指针 
     };
      struct node * make_node(int data)
      {
          struct node *p=(struct node*)malloc(sizeof(struct node));
        if(NULL==p)
        {
            printf("malloc error
    ");
            return NULL;
        }
        //清理申请到的内存
        bzero(p,sizeof(struct node));
        //填充节点
         p->data=data;
         p->pNext=NULL;//将来要指向下一个节点的首地址 
                        //实际操作时将下一个节点的malloc 返回的指针给他。                    
        return p;
      }
      void in_tail( struct node *pH,struct node *new_node)//节点尾部插入 
      {
          //(1)先找到最后一个节点 
          //(2)插入
          int cnt=0;
          struct node *p=pH;
          while(NULL!=p->pNext)
          {
              p=p->pNext;
            cnt++;
          }
          p->pNext=new_node;
          pH->data=cnt+1;// 头节点数据代表链表个数
      }
      void in_head(struct node *pH,struct node *new_node)
      {
          //头节点next指向新节点地址
        //新结点next指向之前第一个节点地址
        //头节点data++
          new_node->pNext=pH->pNext;
        pH->pNext=new_node;
        pH->data++;
      }
       void ergodic(struct node *pH)//遍历
      {
          int cnt=0;
          struct node *p=pH;    
    /*     printf("------开始遍历------
    ");//这样包含头结点
         while(NULL!=p->pNext)
          {    
            printf("第%d节点数据为为%d
    ",cnt,p->data);    
            p=p->pNext;
            cnt++;    
          }
          printf("第%d节点数据为为%d
    ",cnt,p->data);    
        printf("------结束遍历------
    ");
        } */
        printf("------开始遍历------
    ");
         while(NULL!=p->pNext)
          {    
            cnt++;
            p=p->pNext;
            printf("第%d节点数据为为%d
    ",cnt,p->data);        
          }
        printf("------结束遍历------
    ");
      }
    void del_1(struct node *pH,int num)//根据节点数删除 不能删除0(头节点)
      {
          
          //1找到
          //2删除
          //删除(释放内存。指向下一个)
          int cnt=0;
          struct node *p=pH;    
          struct node *p_sb;;//临时变量释放内存用
         while(NULL!=p->pNext)
          {        
            cnt++;
            if(num==cnt)
            {    p_sb=p->pNext;//p为预删除点的上一个节点
                p->pNext=p->pNext->pNext;//跳过欲删除节点指向下下个节点。
                free(p_sb);//释放内存
                break;
            }
            p=p->pNext;//不满足上述条件时 寻找下一个节点
            
          }
      }
      void del_2(struct node *pH,int data)//删除指定数据
      {
          
          //1找到
          //2删除
          //删除(释放内存。指向下一个)
          struct node *p=pH;    
          struct node *p_sb;;//临时变量释放内存用
         while(NULL!=p->pNext)
          {        
            if(data==p->pNext->data)//p为预删除点的上一个节点
            {    p_sb=p->pNext;
                p->pNext=p->pNext->pNext;    
                free(p_sb);
                continue;
            }
            p=p->pNext;
            
          }
      }
      void Nixu(struct node *pH)//逆序
      {
          struct node *p=pH->pNext;    
          struct node *p_sb;//临时变量释放内存用
          if((NULL==pH->pNext)||(NULL==p)) return;//无节点直接退出
         while(NULL!=p->pNext)
          {    
            p_sb=p->pNext;
            if(p==pH->pNext)//第一个节点,放最后面
            {
                p->pNext=NULL;            
            }
            else
            {
                p->pNext=pH->pNext;//当前节点插入第一个节点前。
                                   //或者说将当前节点作为第一个节点。
            }
            pH->pNext=p;           //更新第一节点地址。
            
            p=p_sb;                   //指向下一个节点        
            //p=p->pNext;                //指向下一个节点
          }
          in_head(pH,p);
      }
      
      
      
    int main()
    {
        int n;
        //定义头指针
        //    struct node *pHead= NULL;
        struct node *pHead=make_node(0);//初始化头节点;
        
    //    in_tail(pHead,make_node(2223));
        in_head(pHead,make_node(1));    
        in_head(pHead,make_node(2));    
        in_head(pHead,make_node(3));    
        in_head(pHead,make_node(4));
        in_head(pHead,make_node(5));
        in_head(pHead,make_node(6));    
        ergodic(pHead);
        Nixu(pHead);
        /* printf("输入要删除的节点数:");
        scanf("%d",&n);
        del_1(pHead,n);  */
        //del_2(pHead,3);
        ergodic(pHead);
         return 0;
    } 
  • 相关阅读:
    1877. 数组中最大数对和的最小值 力扣(中等) 简单题,sort+贪心
    1838. 最高频元素的频数 力扣(中等) 尺取法 是我做不出来的题
    面试题 08.09. 括号 力扣(中等) 是我想不出来的回溯
    js删除数组里的某个元素
    Yiwen with Sqc 题解(dp)
    Link with EQ 题解(dp)
    Robots 题解(暴力bitset)
    P3232 [HNOI2013]游走 题解(图上随机游走问题 高斯消元
    怀旧游戏 题解(逆向bfs打表博弈)
    F. The Number of Subpermutations 题解(异或hash维护全排列)
  • 原文地址:https://www.cnblogs.com/PengfeiSong/p/6280424.html
Copyright © 2011-2022 走看看