博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构C语言>3基本链表>3-5链表的结点删除
阅读量:6690 次
发布时间:2019-06-25

本文共 3132 字,大约阅读时间需要 10 分钟。

又重复了链表创建,链表输出,链表结点遍历,

主角当然是链表结点删除。

链表结点删除,有三种情况:

情况1,删除头结点。只要把链表结构指针,指向第二个结点。

情况2,删除最后结点。只要把倒数第二个结点的next指针指向NULL就行。

情况3,删除中间结点。只要把中间结点的上一个节点next指针指向中间结点的next指针指向的地方就行。

 

链表结点遍历,就是为了找出要删除的结点的上一个节点。

具体代码如下:

 

/*
 ======================================== 
*/
/*
    程式实例: 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/06/21/2086458.html

你可能感兴趣的文章
Hessian HTTP POST访问时,Nginx返回411问题
查看>>
Redux进阶系列2: 如何合理地设计State
查看>>
[译] 部署!=发布(第二部分)
查看>>
数据结构和算法面试题系列—C指针、数组和结构体
查看>>
Android解析ActivityManagerService(一)AMS启动流程和AMS家族
查看>>
大前端开发者需要了解的基础编译原理和语言知识
查看>>
Exif图片方向的一些发现
查看>>
iOS关联对象
查看>>
Javascript如何实现GPU加速?
查看>>
次世代的会话管理项目 Spring Session
查看>>
SQL SERVER 2008安全配置
查看>>
Json hijacking/Json劫持漏洞
查看>>
算法知识梳理(5) 数组第二部分
查看>>
多页应用增量更新静态资源Webpack打包方案
查看>>
ionic V3.3开发踩坑集锦
查看>>
Realm入门指北
查看>>
彻底搞懂Bean加载
查看>>
iOS之传值
查看>>
技术blog 迁移
查看>>
linux 定时器怎么用? crontab 基础
查看>>