单链表:
1.广州医院统计:院名、级别、地址(区)、类型(综合/单科(具体单科))、名医
2.可以插入 删除 修改
修改只改对应属性,不要一个实体全部属性改(单个数据项修改)
3.显示(通过地区查找医院,通过医院名查找医院信息,通过级别查医院,通过类型查找医院信息,通过名医查找医院信息)
我上面的广州医院管理系统已经完成
现在要在上面的基础上
用树形结构做,加至少三个城市做成广东省医院系统。
请问思路应该是怎么样呢?
将单链表管理系统升级为树型结构,可以按照以下步骤进行:
定义树的节点结构体
typedef struct treeNode
{
char name[20]; //节点名称
int type; //节点类型:0表示省,1表示市,2表示医院
union {
char province[20]; //省节点的省名
char city[20]; //市节点的市名
struct hospitalNode* hospital; //医院节点的指针
} info;
struct treeNode* parent; //父节点指针
struct treeNode* child; //第一个子节点指针
struct treeNode* sibling; //兄弟节点指针
} TreeNode, *TreeNodePtr;
其中,name表示节点的名称,type表示节点类型,info是一个联合体,存储节点的信息,可以是省名、市名或者医院节点的指针。parent指向父节点,child指向第一个子节点,sibling指向下一个兄弟节点。
定义医院节点结构体
typedef struct hospitalNode
{
char name[20]; //医院名称
char level[10]; //医院级别
char address[50]; //医院地址
char type[20]; //医院类型
char doctor[20]; //名医
} HospitalNode, *HospitalNodePtr;
其中,name表示医院名称,level表示医院级别,address表示医院地址,type表示医院类型,doctor表示名医。
创建树
首先创建省节点,然后创建市节点,最后创建医院节点。每个节点都要设置好其父节点、子节点和兄弟节点。在创建节点的时候,可以读取外部文件中的数据,初始化节点信息。
插入节点
插入节点时,可以先查找要插入节点的父节点,然后将新节点插入到其父节点的子节点中。
删除节点
删除节点时,可以先查找要删除节点的父节点,然后将其从其父节点的子节点中删除。
修改节点
修改节点时,可以先查找要修改的节点,然后修改其对应的属性。
查找节点
可以通过不同的方式查找节点,如通过地区查找医院、通过医院名查找医院信息、通过级别查找医院、通过类型查找医院信息、通过名医查找医院信息等。具体实现可以根据实际需要进行设计。
显示树
可以按照树的层次遍历方式,逐层输出节点信息,以展示整个树形结构。
以上是将单链表管理系统升级为树型结构的一些思路,可以根据实际情况进行具体的实现。
也可以输入职工号查询, 输出职工姓名
https://blog.csdn.net/qq_41071068/article/details/89461999
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 10
struct staff {//创建结构体变量
int id;//职工号
char name[1024];//姓名
};
void input(struct staff* p) {//输入职工的姓名和职工号
struct staff* q = p;
for (int i = 1; p < q + N; ++i, ++p) {
printf("请输入第%d个职工的职工号\n", i);
scanf("%d", &p->id);
printf("请输入该职工的姓名\n");
scanf("%s", p->name);//p->name本来就是指针,存放的就是地址,无需取地址
}
}
void sort(struct staff* p) {//按职工号从大到小排序
char temp[1024];
struct staff* q = p;
for (; p < q + N; ++p) {
for (struct staff* qq = p + 1; qq < q + N; ++qq) {
if (p->id > qq->id) {
p->id = p->id ^ qq->id;//按位异或法
qq->id = p->id ^ qq->id;
p->id = p->id ^ qq->id;
strcpy(temp, p->name);
strcpy(p->name, qq->name);
strcpy(qq->name, temp);
}
}
}
}
struct staff* bisearch(char* str, struct staff* p) {
struct staff* q = p;
int n;
for (int i = 1; p < q + N; ++i, ++p) {
n = strlen(p->name);
if (n == strlen(str) && strcmp(p->name,str) == 0) {
return p;
}
}
return NULL;
}
void main() {
char str[1024];
struct staff staff[N];//创建N个结构体变量
struct staff* p;//创建指向结构体
p = staff;//指向结构体数组的首元素
input(p);
sort(p);
system("cls");
for (; p < staff + N; ++p) {
printf("%d\t%s\n", p->id, p->name);
}
p = staff;
printf("请输入需要查询的员工姓名\n");
scanf("%s", str);
struct staff* q = bisearch(str, p);
if (q != NULL) {
printf("职工%s的职工号为:%d\n", q->name, q->id);
}
else {
printf("没有名字为%s的职工\n", str);
}
system("pause");
}