数据关系是1×2×2×12(C)

本文介绍了一种使用C语言实现的复杂数据结构构建方法,通过层级关系组织数据,并提供了创建、填充及查询等核心功能。

 数据关系是1×2×2×12,具体数据如下

  ---------------------------------------------------------------------------
  |                                   000                                   |
  ---------------------------------------------------------------------------
  |                001               | * |                028               |
  ---------------------------------------------------------------------------
  |      002      |  |      015      | * |      029      |  |      042      |
  ---------------------------------------------------------------------------
  |003 004 005 006|  |016 017 018 019| * |030 031 032 033|  |043 044 045 046|
  |007 008 009 010|  |020 021 022 023| * |034 035 036 037|  |047 048 049 050|
  |011 012 013 014|  |024 025 026 027| * |038 039 040 041|  |051 052 053 054|

 

/**
*1*2*2*3(C)
*/

#include<stdio.h>
#include<stdlib.h>
//存放要表示的数据
struct Plist{
 int end;//结束位置
 int start;//开始位置
 struct Plist *nextP;//下一层的地址
 struct Plist *leftP;//左边的一层的地址
};
//存放层关系
struct layer{
  int layerNumber;//曾数
  int count;//共有几个接点
  struct layer *nextLyaer;//下一层的地址
};
int fillNum = 1;

/**
*建立层关系,输入要执行的结构
*/

struct  layer *createLayer(struct  layer *head)
{
   struct  layer *pc,*pf;
   int num = 1;
   int i = 1;
   pf = (struct  layer *)malloc(sizeof(struct  layer));
   if(pf == NULL)
   {
    return NULL;
   }
   printf("please input num:");
   if(num == 0)
   {
    return NULL;
   }
   pf->layerNumber = i;
   pf->count = num;
   pf->nextLyaer = NULL;
   head = pf;
   do{
    i++;
    pc = (struct  layer *)malloc(sizeof(struct  layer));
    if(pc==NULL)
    {
     return NULL;
    }
    scanf("%d",&num);
    if(num!=0)
    {
     pc->count = num;
     pc->layerNumber = i;
     pf->nextLyaer = pc;
     pc->nextLyaer = NULL;
     pf = pc;
    }
   }while(num!=0);
   return head;
}
/**
*打印关系图
*/
void  display(struct  layer *temp)
{
 printf("关系结构图/n");
 while(temp!= NULL)
 {
  if(temp->layerNumber==1)
  {
   printf("%d ",temp->count);
  }else
  {
   printf("* %d ",temp->count);
  }
  temp = temp->nextLyaer;
 }
 printf("/n");

}
/**
*填充数据
*/
void FillNumber(struct Plist *pf,struct layer *player)
{
 struct Plist *pc;
 int i;
 if(player != NULL)
 {
  fillNum++;
  if(player->nextLyaer==NULL)
  {
   pc = (struct Plist *)malloc(sizeof(struct Plist *));
   pc->leftP = pc->nextP = NULL;
   pc->start=fillNum;
   fillNum+=player->count;
   pc->end = fillNum;
   pf->nextP = pc;
  }else
  {
   for(i = 0;i < player->count;i++)
   {
    pc = (struct Plist *)malloc(sizeof(struct Plist *));
    pc->leftP = pc->nextP = NULL;
    pc->start=pc->end=fillNum;
    if(i ==0)
    {
     pf->nextP = pc;
    }else
    {
     pf->leftP = pc;
    }
    pf = pc;
    FillNumber(pc,player->nextLyaer);
   }
  }
 }

}
/**
*给关系赋值
*/
struct Plist *createPiontList(struct Plist *head,struct layer *player)
{
 struct Plist *pc;
 pc = (struct Plist *)malloc(sizeof(struct Plist));
 if(pc == NULL)
 {
  return NULL;
 }
 pc->leftP = NULL;
 pc->nextP = NULL;
 pc->end = pc->start = fillNum;
 head = pc;
    FillNumber(pc,player->nextLyaer);
 return head;
}
/**
*打印关系
*/
void displayAll(struct Plist *plist)
{
 struct Plist * temp;
 int i;
 if(plist!=NULL)
 {
 
  if(plist->start == plist->end)
  {
   printf("%d下面有:/n",plist->start);
  }else
  {
   for(i = plist->start;i<plist->end;i++)
   {
    printf("%d  ",i);
   }
   printf("/n");
  }

  if(plist->nextP!=NULL)
  {
   temp = plist->nextP;
   displayAll(temp);
  }

  if(plist->leftP!=NULL)
  {
   temp = plist->leftP;
   displayAll(temp);
  }
 }
}
//查找
void quaryfather(struct Plist *plist1)
{
 int num;
 int yn;
 struct Plist *templeft,*plist;
 do
 {
  plist = plist1;
  printf("输入要找的数据:");
  scanf("%d",&num);
  if( (num<1 ) || (num > fillNum-1))
  {
   printf("%d要找的数据不在数列内/n",num);
  }else if(num == 1)
  {
   printf("1就是根");
  }else
  {
   printf("%d的根有%d ",num,plist->end);
   plist = plist->nextP;
   while(plist->nextP != NULL)
   {
    templeft = plist->leftP;
    if(templeft != NULL)
    {
     if(num < templeft->start)
     {
      printf("%d ",plist->start);
      plist = plist->nextP;
     }else
     {
      plist = plist->leftP;
     }
    }else
    {
     printf("%d ",plist->start);
     plist = plist->nextP;
    }
   }
  }
  printf("/n");
  printf("是否要输入0-exit 1-continue:");
  scanf("%d",&yn);
 }while(yn!=0);
}
void main()
{
 struct layer *pLayer,*tempPLayer;
 struct Plist *piontList,*tempPiontList;
    piontList = NULL;
    pLayer = NULL;
 pLayer = createLayer(pLayer);
 tempPLayer = pLayer;
 display(tempPLayer);
 tempPLayer = pLayer;

 piontList = createPiontList(piontList,tempPLayer);
    tempPiontList = piontList;
 
 displayAll(tempPiontList);
 
 tempPiontList = piontList;
 quaryfather(tempPiontList);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值