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测试数据如下:

      

  • 相关阅读:
    Code Forces 650 C Table Compression(并查集)
    Code Forces 645B Mischievous Mess Makers
    POJ 3735 Training little cats(矩阵快速幂)
    POJ 3233 Matrix Power Series(矩阵快速幂)
    PAT 1026 Table Tennis (30)
    ZOJ 3609 Modular Inverse
    Java实现 LeetCode 746 使用最小花费爬楼梯(递推)
    Java实现 LeetCode 745 前缀和后缀搜索(使用Hash代替字典树)
    Java实现 LeetCode 745 前缀和后缀搜索(使用Hash代替字典树)
    Java实现 LeetCode 745 前缀和后缀搜索(使用Hash代替字典树)
  • 原文地址:https://www.cnblogs.com/yjm5/p/9211434.html
Copyright © 2011-2022 走看看