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 ...
随机推荐
- Dotnetbar中如何让LabelX自动换行
把LableX标签控件的WordWrap属性设置为true. https://zhidao.baidu.com/question/207858423.html 另外lable控件可以设置AutoSiz ...
- 单周期CPU设计的理论基础
写在前面:本博客内容为本人老师原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法UR ...
- [administrator][driver] driverctl 是如何在udev上层管理设备驱动的
https://gitlab.com/driverctl/driverctl driverctl 处于 kernel 与 udev做设备与驱动管理的上层. 理解什么叫override是本文的核心内容. ...
- 自己写的JdbcUtils小工具-----得到Connection对象
Properties文件中存放键值对------(可看对Properties文件的解析) static代码块是在构造函数之前执行的,而且只执行一次,即类首次加载时. 也就是只加载一次配置文件和加载数据 ...
- iOS使用mask切割不规则图案
起点,终点要闭合: CGPathAddQuadCurveToPoint(path, NULL, viewSize.width * 0.5, viewSize.height, viewSize.widt ...
- 内部排序->基数排序->链式基数排序
文字描述 基数排序是和前面各类排序方法完全不相同,前面几篇文章介绍的排序算法的实现主要是通过关键字间的比较和移动记录这两种操作,而实现基数排序不需要进行记录关键字间的比较.基数排序是一种借助多关键字排 ...
- LeetCode 976 Largest Perimeter Triangle 解题报告
题目要求 Given an array A of positive lengths, return the largest perimeter of a triangle with non-zero ...
- LeetCode 961 N-Repeated Element in Size 2N Array 解题报告
题目要求 In a array A of size 2N, there are N+1 unique elements, and exactly one of these elements is re ...
- redis哨兵模式,数据尽量少的丢失
min-slave-to-write 1 ->至少要有1个从节点 min-slaves-max-lag 10 ->超过10秒如果数据不能同步则拒绝新的写请求
- Qt获取QObject对应的类名并把它转为真实类型(使用obj->metaObject()->className() )
QObject是有窗口类的父类,比如QWidget,QLabel,QPushButton等都直接或间接继承自QObject类.如果把某个窗口中的所有控件都装到一个QList<QObject*&g ...