当前位置: 首页 > 编程笔记 >

C语言实现树的动态查找实例代码

易京
2023-03-14
本文向大家介绍C语言实现树的动态查找实例代码,包括了C语言实现树的动态查找实例代码的使用技巧和注意事项,需要的朋友参考一下

C语言实现树的动态查找实例代码

本例演示一种树数据结构存储记录集合时的动态查找方法。首先程序通过construct()函数,利用已经存在的结构体数组数据建立一个二叉树,建立树的过程中,要保证每个节点的值都大于它的左子树上节点的值而小于它右子树所有节点的值,该函数返回建立树的根指针;然后通过函数Search(root,name)查找,如果找到相应的数据,将其打印出来,如果没有找到,则用户可以选择是否将该数据插入到树中。 

具体代码如下:

#include <stdio.h>
#include <stdlib.h> 
#include <string.h>
#define NUM 4
 
struct tree
{
  char name[20];
  char city[20];
  char sex[10];
  char age[10];
  char job[10];
  struct tree *left;
  struct tree *right;
};
 
struct tree Datas[NUM]=
{
  "Willing","Tianjing","Female","21","worker",NULL,NULL,
  "Tom","Beijing","Male","31","doctor",NULL,NULL,
  "Sun","Weifang","Male","24","student",NULL,NULL,
  "Marry","Shanghai","Female","19","techer",NULL,NULL
};
 
struct tree *construct(
  struct tree *root, 
  struct tree *r, 
  struct tree *Data)
{
  if(!r)
  {
    r = (struct tree *)malloc(sizeof(struct tree));
    if(!r)
    {
      printf("内存分配失败!");
      exit(0);
    }
    r->left = NULL;
    r->right = NULL;
    strcpy(r->name,Data->name);
    strcpy(r->city,Data->city);
    strcpy(r->sex,Data->sex);
    strcpy(r->age,Data->age);
    strcpy(r->job,Data->job);
    if(!root)
      return r;
    if(strcmp(Data->name,root->name)<0)
      root->left = r;
    else
      root->right = r;
    return r;
  }
  if(strcmp(Data->name,r->name)<0)
    construct(r,r->left,Data);
  else
    construct(r,r->right,Data);
 
  return root;  
}
 
struct tree *Search(root,name)
struct tree *root;
char name[];
{
  struct tree *p;
  if(root == NULL)
    printf("该树为空\n");
  p = root;
  while(strcmp(p->name,name)!=0)
  {
    if(strcmp(p->name,name)>0)
      p = p->left;
    else
      p = p->right;
    if(p == NULL)
      break;
  }
  return(p);
}
 
void print(struct tree *r)
{
  if(!r)
    return;
  print(r->left);
  printf("%s\n",r->name);
  print(r->right);
}
 
void print_currentData(struct tree *point)
{
  if(point == NULL)
    return;
  printf("  姓名:%s\n",point->name);
  printf("  城市:%s\n",point->city);
  printf("  性别:%s\n",point->sex);
  printf("  年龄:%s\n",point->age);
  printf("  工作:%s\n",point->job);
}
 
int main(void)
{
  int i;
  char c[10];
  char swap[20];
  char name[20];
  struct tree *root,*p;
  struct tree *temp;
  p = NULL;
  temp = NULL;
  root = NULL;
  for(i = 0;i<NUM;i++)
    root =construct(root,root,&Datas[i]);
  printf("现有人员资料:\n");
  print(root);
  printf("请输入要查找的人的名字\n");
  scanf("%s",name);
  p = Search(root,name);
  if(p == NULL)
  {
    printf("没有该人资料\n");
    printf("是否要插入该人资料[y/n]\n");
    scanf("%s",c);
    if(strcmp(c,"y")==0)
    {
      temp = (struct tree *)malloc(sizeof(struct tree));
      if(!temp)
      {
        printf("内存分配失败!");
        exit(0);
      }
      printf("请输入该人姓名:\n");
      scanf("%s",swap);
      strcpy(temp->name,swap);
      printf("请输入该人所在城市:\n");
      scanf("%s",swap);
      strcpy(temp->city,swap);
      printf("请输入该人性别[Male/Female]:\n");
      scanf("%s",swap);
      strcpy(temp->sex,swap);
      printf("请输入该人年龄:\n");
      scanf("%s",swap);
      strcpy(temp->age,swap);
      printf("请输入该人工作:\n");
      scanf("%s",swap);
      strcpy(temp->job,swap);
      temp->left = NULL;
      temp->right = NULL;
      root =construct(root,root,temp);
      print_currentData(temp);
      printf("现有人员资料:\n");
      root = root;
      print(root);
    }
    else
      return 0;
  }
  print_currentData(p);
  return 1;
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

 类似资料:
  • 本文向大家介绍python实现二叉查找树实例代码,包括了python实现二叉查找树实例代码的使用技巧和注意事项,需要的朋友参考一下 本文研究的主要是python实现二叉查找树的相关内容,具体介绍及实现如下。 1. 二叉查找树的定义: 左子树不为空的时候,左子树的结点值小于根节点,右子树不为空时,右子树的结点值大于根节点,左右子树分别为二叉查找树 2. 二叉查找树的最左边的结点即为最小值,要查找最小

  • 本文向大家介绍C语言完美实现动态数组代码分享,包括了C语言完美实现动态数组代码分享的使用技巧和注意事项,需要的朋友参考一下 我们知道,C语言中的数组大小是固定的,定义的时候必须要给一个常量值,不能是变量。 这带来了很大的不便,如果数组过小,不能容下所有数组,如果过大,浪费资源。 请实现一个简单的动态数组,能够随时改变大小,不会溢出,也不会浪费内存空间。 下面的代码实现了简单的动态数组: 运行结果:

  • 本文向大家介绍C语言实现的PNPoly算法代码例子,包括了C语言实现的PNPoly算法代码例子的使用技巧和注意事项,需要的朋友参考一下 写C语言的实验用到的一个算法,判断一个点是否在多边形的内部。C的代码如下: 其中nvert是多边形顶点的个数,vertx和verty分别是多边形顶点横、纵坐标的数组,textx和testy是待测点的坐标。这个算法是由W. Randolph Franklin提出的,

  • 本文向大家介绍C语言实现九大排序算法的实例代码,包括了C语言实现九大排序算法的实例代码的使用技巧和注意事项,需要的朋友参考一下 直接插入排序 将数组分为两个部分,一个是有序部分,一个是无序部分。从无序部分中依次取出元素插入到有序部分中。过程就是遍历有序部分,实现起来比较简单。 折半插入排序 折半插入再直接插入上有改进,用折半搜索替换遍历数组,在数组长度大时能够提升查找性能。其本质还是从无序部分取出

  • 本文向大家介绍C语言二维数组中的查找的实例,包括了C语言二维数组中的查找的实例的使用技巧和注意事项,需要的朋友参考一下 C语言二维数组中的查找的实例 题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 思路描述:一个数字的下方和右方是比它本身大的区域,而左方和上方时比它本身小

  • 本文向大家介绍C语言树状数组的实例详解,包括了C语言树状数组的实例详解的使用技巧和注意事项,需要的朋友参考一下 C语言树状数组的实例详解 最近学了树状数组,给我的感觉就是 这个数据结构好神奇啊^_^ 首先她的常数比线段树小,其次她的实现复杂度也远低于线段树 (并没有黑线段树的意思=-=) 所以熟练掌握她是非常有必要的。。 关于树状数组的基础知识与原理网上一搜一大堆,我就不赘述了,就谈一些树状数组的