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

被折叠的 条评论
为什么被折叠?



