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

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

原文地址:https://www.cnblogs.com/yjm5/p/9211434.html

时间: 2024-10-05 23:07:31

尾插法建表后递归算法删除表中元素的相关文章

mssqlserver修改表名,列名,添加表列,删除表列,修改表列类型

mssqlserver修改表名,列名,添加表列,删除表列,修改表列类型 ,代码肯定省事的呀 --添加表列 alter table test add address nvarchar(50) null; --删除表列 alter table test drop column address; --修改表列字段类型 alter table test alter column address char(10); --修改表列字段名 exec sp_rename '表名.[列名]', '新的列名', '

删除vector中元素高效的方法

#include <iostream> #include <vector> using namespace std; int main() { std::vector<int> ve1; ve1.push_back(1); ve1.push_back(2); ve1.push_back(3); ve1.push_back(4); ve1.push_back(5); ve1.push_back(6); std::vector<int>::iterator it

JS实现循环删除数组中元素的方法介绍

这篇文章主要给大家介绍了关于Javascript循环删除数组中元素的几种方法,文中给出了详细的示例代码供大家参考学习,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧. 本文主要跟大家分享了关于Javascript循环删除数组中元素的几种方法,分享出来供大家参考学习,下面来看看详细的介绍: 发现问题 大家在码代码的过程中,经常会遇到在循环中移除指定元素的需求.按照常规的思路,直接一个for循环,然后在循环里面来个if判断,在判断中删除掉指定元素即可.但是实际情况往往不会像预想的那样顺利

python中循环删除列表中元素时的坑![转]

原博文链接:https://www.cnblogs.com/baihualin/p/10698651.html 循环删除列表中元素时千万别用正序遍历,一定要用反序遍历! 废话不多说,先上案例代码: def test(data): for i in data: data.remove(i) return data data = [1, 2, 3] print(test(data)) 面对以上代码,乍一看以为会打印出空列表,因为test函数内通过for的方法将data中的元素都删除了,其实不然,实际

循环删除数组中元素的正确方法

1.循环删除数组中元素的正确方法 提起循环删除数组中的元素,最先想到的就是使用for循环和数组的splice方法来实现(正序循环删除方法),如下代码用来实现删除数组中大于2的元素: 1 let arr = [1, 2, 3, 4, 5, 4, 3, 2, 1]; 2 for (let i = 0, len = arr.length; i < len; i++) { 3 if (arr[i]> 2) { 4 arr.splice(i, 1); 5 } 6 } 7 console.log(arr)

mysql建立表及表的简单操作-插入数据-删除主键-删除表-修改表的数据-删除表的数据

-- 1.使用数据库 USE ren; -- 2.建立student表 CREATE TABLE student ( sid INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,   -- UNSIGNED(无符号) AUTO_INCREMENT(自增) sname VARCHAR(10),    -- 只能保存10个字符 saddress VARCHAR(15)   -- 只能保存15个字符 )ENGINE=MYISAM DEFAULT CHARSET=utf8;

Mysql清空表(truncate)与删除表中数据(delete)的区别

近日在做一个区块链积分转代币的APP,牵涉到数据库中表的记录删除问题, 如果一条条删除那可真是累人.遂考虑直接进入mysql直接清空表或者删除表中数据. 本文记录一下这2种操作模式的区别,目标对象是表wp_comments,里面的所有留言均是垃圾留言,均可删除.然后便有了以下2种方式(进入mysql操作界面后): truncate table wp_comments; delete * from wp_comments; 其中truncate操作中的table可以省略,delete操作中的*可以

drop表后仍占表空间解决办法

练习oracle时create了很多表,drop表后select * from tab; 网上找了好些方法,但是好多都适用... SQL>purge recyclebin; 回收站已清空.

mysql修改表名,列名,列类型,添加表列,删除表列

alter table test rename test1; --修改表名 alter table test add column name varchar(10); --添加表列 alter table test drop column name; --删除表列 alter table test modify address char(10) --修改表列类型 ||alter table test change address address char(40) alter table test