zoukankan      html  css  js  c++  java
  • 尾插法建表后递归算法删除表中元素

     1 #include<stdio.h>
     2 #include<stdlib.h> 
     3 typedef struct LNode{
     4      int data;
     5      struct LNode *next;
     6      
     7 }LNode,*Linklist;
     8 //尾插法创建单链表  
     9 Linklist CreatList(Linklist &L){
    10     LNode *s,*r=L;//r为指向表尾的指针 
    11     int x;
    12     //L=(Linklist)malloc(sizeof(LNode));(此句王道书籍上代码位置有错,屏蔽) 
    13     scanf("%d",&x);
    14     while(x!=9999){//输入9999退出
    15         s=(LNode *)malloc(sizeof(LNode));
    16         s->data=x;//创建的新的结点s的data赋x值 
    17         r->next=s;//r作为指针它的下个结点指向了新创建的结点s 
    18         r=s; //可以理解成将r继续作为尾指针(假装代替了上一个s)继续指向新的表尾结点 
    19         scanf("%d",&x);
    20     }
    21     r->next=NULL;//尾结点指针置空 
    22     return L;
    23 }
    24 //遍历输出链表中的值 
    25 void Travel(Linklist &L){
    26     struct LNode *p=L->next;
    27     if(p==NULL){
    28         printf("链表为空");
    29     }else{
    30         while(p!=NULL){
    31             printf("
    p->data %d",p->data);
    32             /*输出删除的结点的值,
    33             由于下面调用了delete的固定值为5
    34             (主函数里调用Delete_one(L,5);) 
    35             所以运行结果是删除所有结点值为5的结点 
    36             */ 
    37             p=p->next;
    38         }
    39     }
    40 
    41 }
    42 void Delete_one(Linklist &L,int x){
    43     LNode *p; //定义一个p结点指向删除结点 
    44     if(L==NULL)//递归出口 
    45         return;
    46     if(L->data==x){//如果L所指结点的值为x 
    47         p=L;       //删除*L结点,并让L指向下一结点 
    48         L=L->next; 
    49         free(p);
    50         Delete_one(L,x);//递归调用 
    51         printf("
    被删除的结点是:%d",x);
    52         return;
    53     }else{        //如果L所指结点的值不是x  
    54         Delete_one(L->next,x);//进行下个结点的判断 
    55     }
    56 } 
    57 int main(){
    58     Linklist L;
    59     L=(Linklist)malloc(sizeof(LNode));   
    60     CreatList(L);
    61     Delete_one(L,5);//删除值为5的结点 
    62     Travel(L);
    63 } 

       总结:对于王道数据结构2019版本中的一串代码运行后,发现错误但是并不清楚错在哪,后来争论后知道原因在于重新申请的L内存空间而没有对其进行操作的代码,后面return的必然是个空,因此在主函数中增加L=(LinkList)malloc(sizeof(LNode)); 也可以在Create函数开始的地方添加,在对其进行操作。总结自身,过于依赖书上的代码没有自身理解后运行,这一点还是得感谢阿浩同学。

      代码注释过多是为了便于后期复习,不要在意‘细节’。

    so测试数据如下:

      

  • 相关阅读:
    Python并发编程—自定义线程类
    Python并发编程—线程对象属性
    syfomny 好教材....
    drupal_get_css -- drupal
    common.inc drupal
    date iso 8610
    js很好的教材
    user_load_by_name
    eck add form
    把一个表导入到另一个地方...
  • 原文地址:https://www.cnblogs.com/yjm5/p/9211434.html
Copyright © 2011-2022 走看看