数据结构实例应用(2)

2019-08-31 16:01

while(TRUE) {

printf(\车辆到达\ printf(\车辆离开\ printf(\列表显示\ printf(\退出系统\\n\ while(TRUE) {

scanf(\ if(ch>=1&&ch<=4) break; else printf(\请选择: 1|2|3|4.\ }

switch(ch) {

case 1:/*车辆到达*/ Arrival(&Enter,&Wait); break;

case 2: /*车辆离开*/ Leave(&Enter,&Temp,&Wait); break;

case 3: /*列表打印信息*/ List(Enter,Wait); break;

case 4:/*退出主程序*/ exit(0); default: break; } } }

一、家族关系查询系统 /*家族关系树实现*/ #include \typedef char DataType; #define MAXNUM 20

typedef struct TriTNode/* 树的三叉链表存储结构 */ { DataType data[MAXNUM];

struct TriTNode *parent;/* 双亲 */ struct TriTNode *lchild;/* 左孩子 */ struct TriTNode *rchild;/* 右孩子 */ }TriTree;

typedef struct Node/* 队列的结点结构 */ {

TriTree *info; struct Node *next; }Node;

typedef struct/* 链接队列类型定义 */ {

struct Node *front; /* 头指针 */ struct Node *rear; /* 尾指针 */ }LinkQueue;

DataType fname[MAXNUM],family[50][MAXNUM];/* 全局变量 */

LinkQueue *LQueueCreateEmpty( )/* 建立一个空队列 */ {

LinkQueue *plqu=(LinkQueue *)malloc(sizeof(LinkQueue)); if (plqu!=NULL)

plqu->front=plqu->rear=NULL; else { printf(\内存不足!\\n\ return NULL; }

return plqu; }

int LQueueIsEmpty(LinkQueue *plqu)/* 判断链接表示队列是否为空队列 */ {

return(plqu->front==NULL); }

void LQueueEnQueue(LinkQueue *plqu,TriTree *x)/* 进队列 */ {

Node *p=(Node *)malloc(sizeof(Node)); if(p==NULL)

printf(\内存分配失败!\\n\ else {

p->info=x;

p->next=NULL;

if(plqu->front==NULL)/* 原来为空队 */ plqu->front=p; else

plqu->rear->next=p; plqu->rear=p; } }

int LQueueDeQueue(LinkQueue *plqu,TriTree *x)/* 出队列 */ {

Node *p;

if(plqu->front==NULL) { printf(\队列空!\\n\ return ERROR; } else {

p=plqu->front; x=p->info;

plqu->front=plqu->front->next; free(p); return OK; } }

TriTree *LQueueGetFront(LinkQueue *plqu)/* 在非空队列中求队头元素 */ {

return(plqu->front->info); }

/* 建立家族关系树 */ TriTree *TriTreeCreate() { TriTree *t,*x=NULL,*tree,*root=NULL; LinkQueue *q=LQueueCreateEmpty();/* 建立一个空的队列,存储指向树的指针 */ int i=0,flag=0,start=0; DataType str[MAXNUM]; /* 存放family数组中信息 */ strcpy(str,family[i]); /* 复制 */ i++; /* family数组下标后移 */ while(str[0]!='#') /* 没遇到结束标志继续循环 */ { while(str[0]!='@') /* 没遇到兄弟输入结束标志继续 */ { if(root==NULL) /* 空树 */ { root=(TriTree *)malloc(sizeof(TriTree));/* 申请空间 */ strcpy(root->data,str); root->parent=NULL;

root->lchild=NULL; root->rchild=NULL; LQueueEnQueue(q,root); /* 将root存入队列 */ tree=root; } else /* 不为空树 */ { t=(TriTree *)malloc(sizeof(TriTree)); /* 申请空间 */ strcpy(t->data,str); t->lchild=NULL; t->rchild=NULL; t->parent=LQueueGetFront(q); /* 当前结点的双亲为队头元素 */ LQueueEnQueue(q,t); /* 入队 */ if(!flag) /* flag为0,当前结点没有左孩子 */ root->lchild=t; else /* flag为1,当前结点已有左孩子 */ root->rchild=t; root=t; /* root指向新的结点t */ } flag=1; /* 标记当前结点已有左孩子 */ strcpy(str,family[i]); i++; } if(start!=0) /* 标记不是第一次出现“@” */ { LQueueDeQueue(q,x); /* 出队 */ if(q->front!=NULL) root=LQueueGetFront(q);/* root为队头元素 */ } start=1; /* 标记已出现过“@” */ flag=0; /* “@”后面的结点一定为左孩子 */ strcpy(str,family[i]); i++; } return tree; /* 返回树 */ }

/* 打开一个家族关系 */

TriTree *Open(DataType familyname[MAXNUM]) { int i=0,j=0;

DataType ch; FILE *fp; TriTree *t; strcpy(fname,familyname); /* 以家族名为文本文件名存储 */ strcat(fname,\ fp=fopen(fname,\ /* 以读取方式打开文件 */ if(fp==NULL) /* 文件不存在 */ { printf(\的家族关系不存在!\\n\ return NULL; } else { ch=fgetc(fp); /* 按字符读取文件 */ while(ch!=EOF) /* 读到文件尾结束 */ { if(ch!='\\n') /* ch不为一个结点信息的结尾 */ { family[i][j]=ch; /* 将文件信息存储到family数组中 */ j++; } else { family[i][j]='\\0';/* 字符串结束标志 */ i++; /* family数组行下标后移 */ j=0; /* family数组列下标归零 */ } ch=fgetc(fp); /* 继续读取文件信息 */ } fclose(fp); /* 关闭文件 */ t=TriTreeCreate(family); /* 调用函数建立三叉链表 */ printf(\家族关系已成功打开!\\n\ return t; } }

TriTree *Create(DataType familyname[MAXNUM])/* 建立家族关系并存入文件 */ { int i=0; /* i控制family数组下标 */ DataType ch,str[MAXNUM]; /* ch存储输入的y或n,str存储输入的字符串 */ TriTree *t; FILE *fp; strcpy(fname,familyname); /* 以家族名为文本文件名存储 */


数据结构实例应用(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:电站综合自动化系统安装调试手册

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: