尾插法建表后递归算法删除表中元素

 1 #include
 2 #include 
 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("\np->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("\n被删除的结点是:%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测试数据如下:

  尾插法建表后递归算法删除表中元素_第1张图片

 

转载于:https://www.cnblogs.com/yjm5/p/9211434.html

你可能感兴趣的:(数据结构与算法)