Hello world!(内含自己编写的C语言二叉树同学录)
修改:刷了一段时间的题,水平渐涨,发现同学录真的要做成市面可行的应用的话,应该按学号建立二叉平衡树,红黑树是一个可行的选择。
在同学的推荐下,来到博客园来找志同道合的人交流代码。3个月后参加蓝桥杯比赛,报名的是C语言组,所以接下来3个月我会在此发布刷题时的心得与原创代码。
以下代码是我的课程设计自己花12小时编写的二叉树同学录。
反思一下自己的代码,删除节点用了取巧的办法,并没有完全删除节点内信息,仅仅是将学号数组第一个字符设为空,没有释放节点与接下来的连接节点。
为什么用二叉树,并没有掌握精髓,应该是要用二叉排序树按学号排序,这样搜索起来就快了。不过因为仅仅是课程设计,也没心思真的去做一个很完美的程序。
另外代码中有一段重复使用率比较高,也没去单独编一个函数,没有使用用C语言中字符串相关的函数,初学者也能弄懂。有兴趣的同学可以交流一下。
最后庆祝一下!第一次开通博客园账户,第一次写博客,感觉还是挺新奇的哈哈。
#include<stdio.h>
#include<stdlib.h>
typedef struct Student_node
{
char number[];
char name[];
char sex[];
char telephone[];
char interest[];
char favourite_sentence[];
struct Student_node *left;
struct Student_node *right;
}student_node,*student;
int n,k,flagf=,flagd=,flaga=,c=,insert;
char findnumber[];
void init(student *stu)
{
*stu=NULL;
}
int make_student(student *stu)
{
int i;
char t;
if(k==)
{
*stu=NULL;
return ;
}
printf("当前节点有值则输入1,无值则输入0\n");
scanf("\n%c",&t);
if(t=='')
*stu=NULL;
else if(t=='')
{
*stu=(student)malloc(sizeof(student_node));
printf("输入学号\n");
scanf("\n%c",&t);
(*stu)->number[]=t;
for(i=;t!='\n';i++)
{
scanf("%c",&t);
(*stu)->number[i]=t;
}
t='\0';
printf("输入名字\n");
for(i=;t!='\n';i++)
{
scanf("%c",&t);
(*stu)->name[i]=t;
}
t='\0';
printf("输入性别\n");
for(i=;t!='\n';i++)
{
scanf("%c",&t);
(*stu)->sex[i]=t;
}
t='\0';
printf("输入电话\n");
for(i=;t!='\n';i++)
{
scanf("%c",&t);
(*stu)->telephone[i]=t;
}
t='\0';
printf("输入兴趣、爱好\n");
for(i=;t!='\n';i++)
{
scanf("%c",&t);
(*stu)->interest[i]=t;
}
t='\0';
printf("输入座右铭\n");
for(i=;t!='\n';i++)
{
scanf("%c",&t);
(*stu)->favourite_sentence[i]=t;
}
t='\0';
k--;
make_student(&((*stu)->left));
make_student(&((*stu)->right));
}
return ;
}
int show_student(student stu)
{
int i;
if(k==)
return ;
if(stu!=NULL)
{
if(stu->number[]!='\0')
{
for(i=;stu->number[i]!='\n';i++)
printf("%c",stu->number[i]);
printf("\n");
for(i=;stu->name[i]!='\n';i++)
printf("%c",stu->name[i]);
printf("\n");
for(i=;stu->sex[i]!='\n';i++)
printf("%c",stu->sex[i]);
printf("\n");
for(i=;stu->telephone[i]!='\n';i++)
printf("%c",stu->telephone[i]);
printf("\n");
for(i=;stu->interest[i]!='\n';i++)
printf("%c",stu->interest[i]);
printf("\n");
for(i=;stu->favourite_sentence[i]!='\n';i++)
printf("%c",stu->favourite_sentence[i]);
printf("\n");
printf("-----------------\n");
}
k--;
show_student(stu->left);
show_student(stu->right);
}
return ;
}
int find(student stu)
{
int i,flag=;
if(k==)
return ;
if(stu!=NULL)
{
k--;
for(i=;stu->number[i]!='\n'||findnumber[i]!='\n';i++)
{
if(findnumber[i]!=stu->number[i])
{
flag=;
break;
}
}
if(!flag&&stu->number[i]==findnumber[i])
{
flagf=;
for(i=;stu->number[i]!='\n';i++)
printf("%c",stu->number[i]);
printf("\n");
for(i=;stu->name[i]!='\n';i++)
printf("%c",stu->name[i]);
printf("\n");
for(i=;stu->sex[i]!='\n';i++)
printf("%c",stu->sex[i]);
printf("\n");
for(i=;stu->telephone[i]!='\n';i++)
printf("%c",stu->telephone[i]);
printf("\n");
for(i=;stu->interest[i]!='\n';i++)
printf("%c",stu->interest[i]);
printf("\n");
for(i=;stu->favourite_sentence[i]!='\n';i++)
printf("%c",stu->favourite_sentence[i]);
printf("\n");
printf("-----------------\n");
return ;
}
else
{
find(stu->left);
find(stu->right);
}
}
return ;
}
int delete_student(student *stu)
{
int i,flag=;
if(k==)
return ;
if((*stu)!=NULL)
{
k--;
for(i=;(*stu)->number[i]!='\n'||findnumber[i]!='\n';i++)
{
if(findnumber[i]!=(*stu)->number[i])
{
flag=;
break;
}
}
if(!flag&&(*stu)->number[i]==findnumber[i])
{
flagd=;
(*stu)->number[]='\0';
return ;
}
else
{
delete_student(&((*stu)->left));
delete_student(&((*stu)->right));
}
}
return ;
}
int add_student(student *stu)
{
int i;
char t;
if(k==)
return ;
if((*stu)!=NULL)
{
if((*stu)->number[]=='\0')
{
flaga=;
printf("输入学号\n");
scanf("\n%c",&t);
(*stu)->number[]=t;
for(i=;t!='\n';i++)
{
scanf("%c",&t);
(*stu)->number[i]=t;
}
t='\0';
printf("输入名字\n");
for(i=;t!='\n';i++)
{
scanf("%c",&t);
(*stu)->name[i]=t;
}
t='\0';
printf("输入性别\n");
for(i=;t!='\n';i++)
{
scanf("%c",&t);
(*stu)->sex[i]=t;
}
t='\0';
printf("输入电话\n");
for(i=;t!='\n';i++)
{
scanf("%c",&t);
(*stu)->telephone[i]=t;
}
t='\0';
printf("输入兴趣、爱好\n");
for(i=;t!='\n';i++)
{
scanf("%c",&t);
(*stu)->interest[i]=t;
}
t='\0';
printf("输入座右铭\n");
for(i=;t!='\n';i++)
{
scanf("%c",&t);
(*stu)->favourite_sentence[i]=t;
}
t='\0';
return ;
}
else
{
add_student(&((*stu)->left));
add_student(&((*stu)->right));
}
}
return ;
}
int can_insert(student stu)
{
if(stu!=NULL)
{
c++;
if(stu->left==NULL||stu->right==NULL)
{
printf("%d ",c);
can_insert(stu->left);
can_insert(stu->right);
}
else
{
can_insert(stu->left);
can_insert(stu->right);
}
}
return ;
}
void creat(student *stu)
{
int i;
char t;
*stu=(student)malloc(sizeof(student_node));
n++;
printf("输入学号\n");
scanf("\n%c",&t);
(*stu)->number[]=t;
for(i=;t!='\n';i++)
{
scanf("%c",&t);
(*stu)->number[i]=t;
}
t='\0';
printf("输入名字\n");
for(i=;t!='\n';i++)
{
scanf("%c",&t);
(*stu)->name[i]=t;
}
t='\0';
printf("输入性别\n");
for(i=;t!='\n';i++)
{
scanf("%c",&t);
(*stu)->sex[i]=t;
}
t='\0';
printf("输入电话\n");
for(i=;t!='\n';i++)
{
scanf("%c",&t);
(*stu)->telephone[i]=t;
}
t='\0';
printf("输入兴趣、爱好\n");
for(i=;t!='\n';i++)
{
scanf("%c",&t);
(*stu)->interest[i]=t;
}
t='\0';
printf("输入座右铭\n");
for(i=;t!='\n';i++)
{
scanf("%c",&t);
(*stu)->favourite_sentence[i]=t;
}
t='\0';
init(&((*stu)->left));
init(&(*stu)->right);
}
int creat_student(student *stu)
{
int x;
if(stu!=NULL)
{
c++;
if(c==insert)
{
if((*stu)->left==NULL&&(*stu)->right==NULL)
{
printf("插入左节点请输入0,插入右节点请输入1\n");
scanf("%d",&x);
if(!x)
{
creat(&((*stu)->left));
return ;
}
else
{
creat(&((*stu)->right));
return ;
}
}
else if((*stu)->left==NULL)
{
printf("插入左节点\n");
creat(&((*stu)->left));
return ;
}
else if((*stu)->right==NULL)
{
printf("插入右节点\n");
creat(&((*stu)->right));
return ;
}
}
else
{
if((*stu)->left!=NULL)
creat_student(&((*stu)->left));
if((*stu)->right!=NULL)
creat_student(&((*stu)->right));
}
}
return ;
}
int main()
{
char x;
int i,key=;
student stu;
printf("***************************创建同学录***************************\n");
printf("学生个数\n");
scanf("%d",&n);
k=n;
make_student(&stu);
system("pause");
while(key!=)
{
system("cls");
printf("|***********************************************************|\n");
printf("|**************************同学录***************************|\n");
printf("|***********************************************************|\n\n\n");
printf("1、遍历输出 2、查找 3、删除 4、增加 5、退出程序\n");
scanf("%d",&key);
if(key==)
{
k=n;
printf("学号、姓名、性别、电话、爱好、座右铭\n-----------------\n");
show_student(stu);
}
if(key==)
{
printf("请输入要查找的学生的学号\n");
k=n;
scanf("\n%c",&x);
findnumber[]=x;
for(i=;x!='\n';i++)
{
scanf("%c",&x);
findnumber[i]=x;
}
printf("学号、姓名、性别、电话、爱好、座右铭\n-----------------\n");
find(stu);
if(flagf)
printf("查无此人!\n");
flagf=;
}
if(key==)
{
printf("请输入要删除的学生的学号\n");
k=n;
scanf("\n%c",&x);
findnumber[]=x;
for(i=;x!='\n';i++)
{
scanf("%c",&x);
findnumber[i]=x;
}
delete_student(&stu);
if(flagd)
printf("输入学号不正确,删除失败!\n");
else
printf("删除成功!\n");
flagd=;
}
if(key==)
{
k=n;
add_student(&stu);
if(flaga)
{
c=;
printf("以下节点可供插入\n");
can_insert(stu);
printf("\n");
printf("插入到哪个节点之下?\n");
scanf("%d",&insert);
c=;
creat_student(&stu);
}
flaga=;
}
if(key==)
{
exit();
}
system("pause");
}
return ;
}
Hello world!(内含自己编写的C语言二叉树同学录)的更多相关文章
- Java编写的C语言词法分析器
Java编写的C语言词法分析器 这是java编写的C语言词法分析器,我也是参考很多代码,然后核心代码整理起来,放在QQ空间和博客上,目的是互相学习借鉴,希望可以得到高手改进.这个词法分析器实现的功能有 ...
- 编写一个C语言函数,要求输入一个url,输出该url是首页、目录页或者其他url
编写一个C语言函数,要求输入一个url,输出该url是首页.目录页或者其他url 首页.目录页或者其他url 如下形式叫做首页: militia.info/ www.apcnc.com.cn/ htt ...
- 一篇文章带你编写10种语言HelloWorld
0,编程语言排行榜 计算机编程语言众多,世界上大概有600 多种编程语言,但是流行的也就几十种.我们来看下编程语言排行榜,下面介绍两种语言排行榜. Ⅰ TIOBE 指数 该指数每月更新一次,它监控了近 ...
- 七周七语言之用Io编写领域特定语言
如果你想获得更好的阅读体验,可以前往我在 github 上的博客进行阅读,http://lcomplete.github.io/blog/2013/06/05/sevenlang-io/. Io 语言 ...
- 如何用visual studio2013编写简单C语言程序
vc++6.0 作为经典版本,虽然已经几乎淘汰,但还是有很多的初学者在使用.但当他们使用vs2013时会发现界面和操作和vc++6.0有了极大的不同,不知该如何 操作.随着vs2013的普及,更多人使 ...
- 【Ubuntu】编写一个c语言代码
安装 sudo apt-get build-depgcc coding:http://www.cnblogs.com/zero1665/archive/2009/11/03/1595510.html ...
- VSCode编写C/C++语言,配置文件和注意事项
前言 主要是自己先下载好VSCode,然后在自己电脑上安装好就行了,但是VSCode是编辑器,不是IDE,所以需要自己配置文件,主要有四个都是以.json结尾的文件,这里默认已经装过C/C++的编辑器 ...
- c语言二叉树基本操作
编译器为vs2013 #include "stdafx.h" #include<malloc.h> #include<stdlib.h> #define O ...
- c语言二叉树
Department of Computing and Information SystemsCOMP10002 Foundations of AlgorithmsSemester 2, 2014As ...
随机推荐
- Android Studio自动排版的两种方法
Android Studio这样的集成开发环境虽然代码自动化程度很高,但是自动化程度高导致人的自主性就下降了,而且总是依赖编辑器的功能也会搞得代码排版很别扭. 最难受的是你在Android Studi ...
- Usage of git
目录 Git 配置 查看配置信息 基本概念 Git 创建仓库 git init git clone 撤销操作 从暂存区恢复文件 从仓库恢复某个文件 版本退回 版本前进 分支操作 删除未跟踪的文件 连 ...
- java jdk安装配置
1. 配置java_home 2. path添加: %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; 3. 添加CLASSPATH路径: .;%Java_Home%\bin;% ...
- Spring 测试
1. pom.xml ==> Depency <!-- Test --> <dependency> <groupId>junit</groupId> ...
- 洛谷P3224 永无乡 [HNOI2012] 线段树/splay/treap
正解:线段树合并 解题报告: 传送门! 这题也是有很多解法,eg:splay,treap,... 然而我都不会我会学的QAQ! 反正今天就只讲下线段树合并怎么做QAQ 首先看到这样子的说第k重要的是什 ...
- oracle的undo表空间
undo表空间是Oracle特有的概念.undo表空间中会自动分配undo段,这些undo段用来保存事务中的DML语句的undo信息,也就是来保存数据在被修改之前的值.在rollback,实例恢复(回 ...
- SpringBoot-热部署Devtools
热部署 什么是热部署 所谓的热部署:比如项目的热部署,就是在应用程序在不停止的情况下,实现新的部署 项目演示案例 @RestController @Slf4j public class IndexCo ...
- python-面向对象-13_文件
文件 目标 文件的概念 文件的基本操作 文件/文件夹的常用操作 文本文件的编码方式 01. 文件的概念 1.1 文件的概念和作用 计算机的 文件,就是存储在某种 长期储存设备 上的一段 数据 长期存储 ...
- mysql 数据表操作 目录
mysql 数据表操作 存储引擎介绍 mysql 使用存储引擎 mysql 数据表的增删改查 mysql 数据类型 mysql 约束条件
- left outer join的on不起作用
left outer join的on不起作用 Why and when a LEFT JOIN with condition in WHERE clause is not equivalent to ...