当前位置: 首页 > news >正文

C语言链表,多一个头结点

C语言链表,多一个头结点,可以方便处理链表的结点增加,删除。

看代码

ExpandedBlockStart.gif 代码
/*  ========================================  */
/*     程式实例: 3_9.c                                                      */
/*     开头节点的链结串列                                             */
/*  ========================================  */
#include 
< stdlib.h >

struct  llist                        /*  串列结构宣告       */
{
   
int  num;                        /*  邮寄编号           */
   
struct  llist  * next;              /*  指向下一标签       */
};
typedef 
struct  llist node;          /*  定义新型态         */
typedef node 
* llink;                /*  定义新型态指标     */

/*  ----------------------------------------  */
/*   链结串列的列印                           */
/*  ----------------------------------------  */
void  printllist(llink head)
{
   llink ptr;

   ptr 
=  head -> next;               /*  指向真正的起始     */
   
while  ( ptr  !=  NULL )           /*  串列走访回路       */
   {
      printf(
" [%d] " ,ptr -> num);     /*  列印节点资料       */
      ptr 
=  ptr -> next;             /*  指向下一节点       */
   }
   printf(
" \n " );                   /*  换行               */
}

/*  ----------------------------------------  */
/*   链结串列的建立                           */
/*  ----------------------------------------  */
llink createllist(
int   * array, int  len)
{
   llink head;                     
/*  串列的开始指标     */
   llink ptr,ptr1;
   
int  i;

   
/*  建立开头节点  */
   head 
=  ( llink ) malloc( sizeof (node));  /*  配置记忆体  */
   
if  (  ! head )                    /*  检查指标           */
      
return  NULL;
   ptr 
=  head;                     /*  将ptr指向串列开始  */
   
for  ( i  =   0 ; i  <  len; i ++  )     /*  建立其它节点回路   */
   {
       ptr1 
=  ( llink ) malloc( sizeof (node));
       
if  (  ! ptr1 )
          
return  NULL;
       ptr1
-> num  =  array[i];       /*  建立节点内容       */
       ptr1
-> next  =  NULL;          /*  设定指标初值       */
       ptr
-> next  =  ptr1;           /*  连结节点           */
       ptr 
=  ptr -> next;            /*  指向下一节点       */
   }
   
return  head;
}

/*  ----------------------------------------  */
/*   链结串列的节点插入                       */
/*  ----------------------------------------  */
llink insertnode(llink head,llink ptr,
int  value)
{
   llink 
new ;                       /*  新节点指标变数     */

   
new   =  ( llink ) malloc( sizeof (node));   /*  建立新节点  */
   
if  (  ! new  )
      
return  NULL;
   
new -> num  =  value;               /*  建立节点内容       */
   
new -> next  =  NULL;               /*  设定指标初值       */
   
/*  如果ptr等於开头节点则是插入第一个节点  */
   
new -> next  =  ptr -> next;         /*  新节点指向下一节点  */
   ptr
-> next  =   new ;                /*  节点ptr指向新节点  */
   
return  head;
}

/*  ----------------------------------------  */
/*   链结串列的节点删除                       */
/*  ----------------------------------------  */
llink deletenode(llink head,llink ptr)
{
   llink previous;

   previous 
=  head;
   
while  ( previous -> next  !=  ptr )  /*  找节点ptr前一节点  */
      previous 
=  previous -> next;
   previous
-> next  =  ptr -> next;     /*  删除中间节点       */
   free(ptr);                     
/*  释回节点记忆体     */
   
return  head;
}

/*  ----------------------------------------  */
/*   主程式: 开头节点插入删除操作.            */
/*  ----------------------------------------  */
void  main()
{
   
int  llist1[ 6 =  {  1 2 3 4 5 6  };   /*  阵列内容    */
   llink head;                     
/*  指向串列开始       */

   head 
=  createllist(llist1, 6 );    /*  建立串列           */
   
if  (  ! head )
   {
      printf(
" 记忆体配置失败! \n " );
      exit(
1 );
   }
   printf(
" 原来的链表:  " );
   printllist(head);              
/*  列印原来串列       */
   head 
=  insertnode(head,head, 0 );  /*  插入新节点       */
   
if  (  ! head )
   {
      printf(
" 记忆体配置失败! \n " );
      exit(
1 );
   }
   
/*  删除串列内节点  */
   head 
=  deletenode(head,head -> next -> next -> next);
   printf(
" 最后的链表:  " );
   printllist(head);              
/*  列印结果串列       */
}

 

不多一个头结点的情况下的删除,要考虑三个情况,一是第一个结点,最后一个结点,中间结点。

 

ExpandedBlockStart.gif 代码
/*  ========================================  */
/*     程式实例: 3_5.c                      */
/*     链结串列的节点删除                     */
/*  ========================================  */
#include 
< stdlib.h >

struct  llist                        /*  串列结构宣告           */
{
   
int  num;                        /*  邮寄编号               */
   
struct  llist  * next;              /*  指向下一标签           */
};
typedef 
struct  llist node;          /*  定义新型态             */
typedef node 
* llink;                /*  定义新型态指标         */

/*  ----------------------------------------  */
/*   链结串列的列印                           */
/*  ----------------------------------------  */
void  printllist(llink ptr)
{
   
while  ( ptr  !=  NULL )           /*  串列走访回路           */
   {
      printf(
" [%d] " ,ptr -> num);     /*  列印节点资料           */
      ptr 
=  ptr -> next;             /*  指向下一节点           */
   }
   printf(
" \n " );                   /*  换行                   */
}

/*  ----------------------------------------  */
/*   键结串列的建立                           */
/*  ----------------------------------------  */
llink createllist(
int   * array, int  len)
{
   llink head;                     
/*  串列的开始指标         */
   llink ptr,ptr1;
   
int  i;

   
/*  建立第一个节点  */
   head 
=  ( llink ) malloc( sizeof (node));  /*  配置记忆体      */
   
if  (  ! head )                    /*  检查指标               */
      
return  NULL;
   head
-> num  =  array[ 0 ];           /*  建立节点内容           */
   head
-> next  =  NULL;              /*  设定指标初值           */
   ptr 
=  head;                     /*  将ptr指向串列开始      */
   
for  ( i  =   1 ; i  <  len; i ++  )     /*  建立其它节点回路       */
   {
       ptr1 
=  ( llink ) malloc( sizeof (node));
       
if  (  ! ptr1 )
          
return  NULL;
       ptr1
-> num  =  array[i];       /*  建立节点内容           */
       ptr1
-> next  =  NULL;          /*  设定指标初值           */
       ptr
-> next  =  ptr1;           /*  连结节点               */
       ptr 
=  ptr -> next;            /*  指向下一节点           */
   }
   
return  head;
}

/*  ----------------------------------------  */
/*   链结串列的节点走访                       */
/*  ----------------------------------------  */
llink findnode(llink head,
int  num)
{
   llink ptr;

   ptr 
=  head;                     /*  指向串列起始           */
   
while  ( ptr  !=  NULL )           /*  走访串列               */
   {
      
if  ( ptr -> num  ==  num )       /*  找寻编号               */
         
return  ptr;
      ptr 
=  ptr -> next;             /*  指向下一节点           */
   }
   
return  ptr;
}

/*  ----------------------------------------  */
/*   键结串列的节点删除                       */
/*  ----------------------------------------  */
llink deletenode(llink head,llink ptr)
{
   llink previous;                 
/*  指向前一节点           */

   
if  ( ptr  ==  head )              /*  是否是串列开始         */
      
/*  第一种情况: 删除第一个节点  */
      
return  head -> next;           /*  传回第二节点指标       */
   
else
   {
      previous 
=  head;
      
while  ( previous -> next  !=  ptr )  /*  找节点ptr的前节点  */
         previous 
=  previous -> next;

      
if  ( ptr -> next  ==  NULL )     /*  是否是串列结束         */
         
/*  第二种情况: 删除最後一个节点  */
         previous
-> next  =  NULL;    /*  最後一个节点           */
      
else
         
/*  第三种情况: 删除中间节点  */
         previous
-> next  =  ptr -> next;   /*  中间节点           */
   }
   
return  head;
}

/*  ----------------------------------------  */
/*   主程式: 找到邮寄编号後, 将之删除.        */
/*  ----------------------------------------  */
void  main()
{
   
int  llist1[ 6 =  {  1 2 3 4 5 6  };  /*  阵列内容         */
   llink head;                     
/*  指向串列开始           */
   llink ptr;
   
int  num;                        /*  邮寄编号变数           */

   head 
=  createllist(llist1, 6 );    /*  建立串列               */
   
if  (  ! head )
   {
      printf(
" 记忆体配置失败! \n " );
      exit(
1 );
   }
   printf(
" 原来的链表:  " );
   printllist(head);              
/*  列印原来串列           */
   
while  (  1  )
   {
      printf(
" 请输入要删除的邮寄编号 ==>  " );
      scanf(
" %d " , & num);            /*  读取邮寄编号           */
      
if  ( num  !=   - 1  )
      {
         ptr 
=  findnode(head,num);  /*  找寻邮寄编号         */
         
if  (  ! ptr )               /*  是否找到               */
            printf(
" 没有找到\n " );
         
else
         {
            head 
=  deletenode(head,ptr);  /*  删除此节点     */
            printf(
" 删除后的链表:  " );
            printllist(head);     
/*  列印删除後串列         */
         }
      }
      
else
         exit(
1 );                  /*  结束离开               */
   }
}


 

所以这里面有个思想,空间能换取时间。多一个内存空间,换取了多出来的代码时间。

转载于:https://www.cnblogs.com/samwu/archive/2011/01/14/1935274.html

相关文章:

  • C#-Home 技术源料库
  • CentOS5.4安装配置dhcp服务器
  • CAN总线总结(5)——位定时,位同步的总结
  • 【百度地图API】情人节求爱大作战——添加标注功能
  • 业绩不是“看”出来的
  • js实现页面跳转的几种方式
  • freebsd下检测adsl线路的脚本
  • 度量分析之报告信息的四个层次:数据,信息,分析,措施
  • 内存操作流
  • 脸上长痘痘的原因
  • [Android实例] 保持屏幕长亮的两种方法 [转]
  • ipcs :显示进程通讯的信息
  • Android学习笔记--广播机制
  • D3DPOOL(资源池)
  • 在IE中打开Excel和Word(2003格式测试通过)
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • conda常用的命令
  • MySQL的数据类型
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Phpstorm怎样批量删除空行?
  • Quartz初级教程
  • TypeScript迭代器
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 汉诺塔算法
  • 回流、重绘及其优化
  • 力扣(LeetCode)22
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 微信小程序设置上一页数据
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • Mac 上flink的安装与启动
  • Prometheus VS InfluxDB
  • #stm32整理(一)flash读写
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (¥1011)-(一千零一拾一元整)输出
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .net 设置默认首页
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .NetCore项目nginx发布
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET简谈设计模式之(单件模式)
  • .net快速开发框架源码分享
  • @Conditional注解详解
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [20140403]查询是否产生日志
  • [20170713] 无法访问SQL Server
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
  • [3D基础]理解计算机3D图形学中的坐标系变换
  • [BZOJ] 2044: 三维导弹拦截
  • [CareerCup] 13.1 Print Last K Lines 打印最后K行