BST 存储结构建立(插入)、删除、 查找算法的实现及应用
来源:互联网 发布:js后退不刷新页面 编辑:程序博客网 时间:2024/05/20 16:10
(一)下面的代码要实现的任务:
1.设计 BST 的左右链存储结构;
2.实现 BST 左右链存储结构上的插入(建立)、删除、查找和排序算法。
3.利用 BST 结构和相应的操作算法,实现班级学习成绩管理(单科成绩管理, 排名;加权绩点管理与排名等)
4.学生的基础成绩信息以文件形式保存;学生基础成绩信息和排名信息以文件形式存储;并能显示到屏幕。
(二)话不多说上代码:
#include <stdio.h>#include <stdlib.h>#include <io.h>#include <math.h>#include <time.h>#define maxsize 100typedef struct StuInfo{ char name[100][100]; //char obj1[100][100]; int sco1[100]; //char obj2[100][100]; int sco2[100]; int avi[100]; // char scoAve[100][100];}StuInfo;typedef struct BSTN{ int data; // struct StuInfo stu; char name1[100]; // int sco1[100]; int sco21; int sco11; int scoAv1; struct BSTN *lchild,*rchild;}BSTN,*BstTree;//全局变量写文件char keep[100][10];int cou=0;char s1[10][5];char s2[10][5];char sa[10][5];char *zhengti;//查找,放在建立前面int search(BstTree T,BstTree f,BstTree *p,int key)/* 指针f指向T的双亲,其初始调用值为NULL */{ if(!T) { *p=f; return -1; } else if(key==T->data) { *p=T; return 0; } else if(key<T->data) return search(T->lchild,T,p,key); else return search(T->rchild,T,p,key);}//插入int insert(BstTree *T,int score1,char ss[],int score2,int aveScore,int cho){ int key; BstTree p,s; if (cho==1) key=score1; else key=aveScore; if(search(*T,NULL,&p,key)==-1) { s=(BstTree)malloc(sizeof(BSTN)); s->data=key; //s->name1=s[]; strcpy(s->name1,ss); s->sco11=score1; s->sco21=score2; s->scoAv1=aveScore; s->lchild=s->rchild=NULL; //printf("aa"); if(!p) *T=s;//插入S为新的根结点 else if(key<p->data) p->lchild=s; else p->rchild=s; return 0; } else return -1;}int Delete(BstTree *p){BstTree q,s;if((*p)->rchild==NULL) /* 右子树空则只需重接它的左子树(待删结点是叶子也走此分支) */{q=*p; *p=(*p)->lchild; free(q);}else if((*p)->lchild==NULL) /* 只需重接它的右子树 */{q=*p; *p=(*p)->rchild; free(q);}else /* 左右子树均不空 */{q=*p; s=(*p)->lchild;while(s->rchild) /* 转左,然后向右到尽头(找待删结点的前驱) */{q=s;s=s->rchild;}(*p)->data=s->data; /* s指向被删结点的直接前驱(将被删结点前驱的值取代被删结点的值) */if(q!=*p)q->rchild=s->lchild; /* 重接q的右子树 */elseq->lchild=s->lchild; /* 重接q的左子树 */free(s);}return 1;}/* 若二叉排序树T中存在关键字等于key的数据元素时,则删除该数据元素结点, *//* 并返回TRUE;否则返回FALSE。 */int DeleteBST(BstTree *T,int key){if(!*T) /* 不存在关键字等于key的数据元素 */return -1;else{if (key==(*T)->data) /* 找到关键字等于key的数据元素 */return Delete(T);else if (key<(*T)->data)return DeleteBST(&(*T)->lchild,key);elsereturn DeleteBST(&(*T)->rchild,key);}}void PreOrderTraverse(BstTree T){if(T==NULL)return;printf("%d",T->data);/* 显示结点数据,可以更改为其它对结点操作 */PreOrderTraverse(T->lchild); /* 再先序遍历左子树 */PreOrderTraverse(T->rchild); /* 最后先序遍历右子树 */}/* 初始条件: 二叉树T存在 *//* 操作结果: 中序递归遍历T */void InOrderTraverse(BstTree T){if(T==NULL)return ;/**/InOrderTraverse(T->lchild); /* 中序遍历左子树 */printf("%s\t",T->name1); store(T);printf("%d\t",T->sco11);printf("%d\t",T->sco21);printf("%d\n",T->scoAv1);/* 显示结点数据,可以更改为其它对结点操作 */InOrderTraverse(T->rchild); /* 最后中序遍历右子树 */}void store(BstTree T){ int i; for(i=0;i<strlen(T->name1);i++) { keep[cou][i]=T->name1[i]; } //keep[cou][i]=T->sco11; //itoa(T->sco11,keep[cou][i],10); //keep[cou]=T->name1; itoa(T->sco11,s1[cou],10);itoa(T->sco21,s2[cou],10);itoa(T->scoAv1,sa[cou],10); // printf("%s",keep[cou]);//sa[cou]=T->scoAv1;//wriIn(s1);cou++;//printf("%d",cou);}void andstr(){ int i; for(i=0;i<10;i++) { //strcat(zhengti,keep[i]); zhengti=keep[i]; }}void wriIn(int whi){ //if(whi==1) FILE *pFile = fopen("F:\\untitled\\DataStructure\\实验\\实验二\\aac.txt", "w"); // 文件打开方式 如果原来有内容也会销毁 /* else FILE *pFile = fopen("F:\\untitled\\DataStructure\\实验\\实验二\\aac.txt", //打开文件的名称 "w");*/ int i; fprintf(pFile,"%s","按工数排序\n"); fprintf(pFile,"%s","姓名\t工数\t概率论\t绩点\n"); for(i=0;i<10;i++) { fprintf(pFile,"%s",keep[i]); fprintf(pFile,"\t"); fprintf(pFile,"%s",s1[i]); fprintf(pFile,"\t"); fprintf(pFile,"%s",s2[i]); fprintf(pFile,"\t"); fprintf(pFile,"%s",sa[i]); fprintf(pFile,"\n"); } fclose(pFile);}void wriIn2(int whi){ //if(whi==1) FILE *pFile = fopen("F:\\untitled\\DataStructure\\实验\\实验二\\aab.txt", "w"); // 文件打开方式 如果原来有内容也会销毁 /* else FILE *pFile = fopen("F:\\untitled\\DataStructure\\实验\\实验二\\aac.txt", //打开文件的名称 "w");*/ int i; fprintf(pFile,"%s","按绩点排序\n"); fprintf(pFile,"%s","姓名\t工数\t概率论\t绩点\n"); for(i=0;i<10;i++) { fprintf(pFile,"%s",keep[i]); fprintf(pFile,"\t"); fprintf(pFile,"%s",s1[i]); fprintf(pFile,"\t"); fprintf(pFile,"%s",s2[i]); fprintf(pFile,"\t"); fprintf(pFile,"%s",sa[i]); fprintf(pFile,"\n"); } fclose(pFile);}int main(void){int i,hahahaha;int a[10]={62,88,58,47,35,73,51,99,94,37};BstTree T=NULL;BstTree T1=NULL;StuInfo stu; // read(stu); FILE *in;int LINE = 128,len,j=50,k=0,m;char buf[LINE],ss[50][j];in = fopen("F:\\untitled\\DataStructure\\实验\\实验二\\aaa.txt", "r");if (in == NULL) {printf("找不到该文件");} else { fgets(buf, LINE, in);while(fgets(buf, LINE, in) != NULL) {len = strlen(buf);for(m=0;m<len;m++){ss[k][m]=buf[m];ss[k][m+1]='\0';//printf("%c",ss[k][m]);}k++;//printf("\n");}} char delims[] = " ";int count,a2; char *t;//a1=0; for(a2=0;a2<k;a2++){t= strtok(ss[a2], delims);for(count=0;count<strlen(t);count++) { stu.name[a2][count]=t[count]; // printf("%c", stu.name[a1][count]); } //a1++; t = strtok(NULL, delims); stu.sco1[a2]=atoi(t);//printf("%d", stu.sco1[a1]+1); // a1++; t = strtok(NULL, delims); stu.sco2[a2]=atoi(t); } double ave[10];for(i=0;i<10;i++){ ave[i]=(((int)(stu.sco1[i]*5+stu.sco2[i]*4)/9)*100.00)/100.00; stu.avi[i]=ave[i];insert(&T, stu.sco1[i],stu.name[i],stu.sco2[i],stu.avi[i],1);insert(&T1, stu.sco1[i],stu.name[i],stu.sco2[i],stu.avi[i],2);//printf("%lf",ave[i]);//printf("%d??\n",stu.sco1[i]);}//for(i=0;i<10;)/*printf("\n前序遍历二叉树:");PreOrderTraverse(T);*/printf("请选择相关操作:1.按工数排序;2:按绩点排序;3:结束\n");//do{scanf("%d",&hahahaha);if(hahahaha==1){printf("\n按工数排序:\n");InOrderTraverse(T);wriIn(hahahaha);//hahahaha=2;}cou=0;if(hahahaha==2){printf("\n按绩点排序:\n");InOrderTraverse(T1);wriIn2(hahahaha);}//}while(hahahaha==3);//if(hahahaha==3)return 0;}
1 0
- BST 存储结构建立(插入)、删除、 查找算法的实现及应用
- 编程实现顺序存储结构和链式存储结构线性表的建立、查找、插入、删除等基本操作
- BST的查找、插入、删除
- 【数据结构作业二】写出单链表结点的结构体类型定义及查找、插入、删除算法,并以单链表作存储结构,实现有序表的合并
- 【数据结构作业一】写出顺序表的结构体类型定义及查找、插入、删除算法,并以顺序表作存储结构,实现线性表的插入、删除
- 数据结构 P28-29 算法实现 线性表的链式存储结构——链表的查找、插入与删除
- BST的插入、删除、查找操作
- 关于BST的插入,查找和删除
- 数据结构与算法分析之顺序存储结构的建立,插入和删除操作
- 手写BST插入查找删除
- BST 插入删除查找遍历
- 线性表建立、插入、删除、查找应用
- 《数据结构》线性表:链式存储结构实现示例代码二(插入、删除、查找)
- 顺序表的实现(包含插入,删除,及查找)
- java实现二叉排序树的建立,查找,插入,删除
- 二叉搜索树(BST)递归与非递归的插入、删除、查找的实现
- 动态查找表之二叉排序树(BST)的 创建、查找、插入与删除
- (1)顺序表的操作 ① 输入一组整型元素序列,建立线性表的顺序存储结构。 ② 实现该线性表的遍历。 ③ 在该顺序表中查找某一元素,查找成功显示查找元素,否则显示查找失败。 ④ 在该顺序表中删除或插入指
- 【POJ3294】Life Forms【后缀数组】【二分】
- Uva 10115 2015.5.26
- IOS中获取各种文件的目录路径的方法
- 2048
- 【工作流】——工作流的宿主WorkflowApplication和WorkflowInvoker
- BST 存储结构建立(插入)、删除、 查找算法的实现及应用
- Uva 673 2015.6.7
- Uva 10050 2015.6.7
- view文档的分栏
- LeetCode 2015.7.7 205,206,217,219,223,228,231,111,112
- hdu1248 寒冰王座(完全背包)
- LeetCode 2015.7.8 128,171,172,189,202,203,119
- bestcoder#71
- 一致性Hash算法