#c
#c
Вопрос:
Первая часть кода будет хранить целые числа в файл ans.txt через двоичные деревья поиска.
/*code for storin the numbers in a particulr txt file */
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
struct root{
int val ;
struct root *left ;
struct root *right ;
};
void write(struct root *,int); // to write the numbers in a file
struct root *insrt(struct root *r,int val){
struct root *p,*q;
int ch,i=0;
FILE *fp;
if(r==NULL){
r=(struct root *)malloc(sizeof(struct root ));
p = r;
r->val=val;
r->left=r->right=NULL;
i ;
}
else{
if(val<r->val)
r->left=insrt(r->left,val);
else if(val>r->val)
r->right=insrt(r->right,val);
}
write(r,i);
return r;
}
void write(struct root *r,int i){
FILE *fp;
fp=fopen("texts/bst.txt","w");
fwrite(r,sizeof(struct root),1,fp);
fclose(fp);
}
void infile(struct root *r){ //storing the address of the root in ans.txt
FILE *fp;
fp=fopen("texts/ans.txt","a");
fprintf(fp,"%dn",r->val);
}
void show(struct root *r){
if(r){
show(r->left);
printf("%d ",r->val);
infile(r);
show(r->right);
}
}
int main()
{
int val,i=0,n;
char y;
struct root *r;
printf("Enter the number: n");
while((y=getchar())!=EOF){
if(y!=EOF){
scanf("%d",amp;val);
r=insrt(r,val);
i ;
}
}
show(r);
return 0;
}
Эта часть поиска, где я пытаюсь найти адрес
хранить числа, а затем оттуда я могу применить бинарное дерево поиска
метод нахождения числа, но есть несколько ошибок, которые
Я не могу найти. ………. по британскому летнему времени. Пожалуйста, помогите мне.
/*code for search */
#include<stdio.h>
#include<stdlib.h>
struct root{
int val;
struct root *left;
struct root *right;
};
struct root *srch(struct root *r, int a){
if(r->val>a){
return srch(r->left,a);
}
else if (r->val<a){
return srch(r->right,a);
}
else
return r;
}
int main()
{
int num;
struct root *r,*f;
r=(struct root *)malloc(sizeof(struct root ));
FILE *fp;
fp=fopen("texts/bst.txt","rb");
fread(r,sizeof(struct root),1,fp);
fclose(fp);
printf("Enter the Number: ");
scanf("%d",amp;num);
f=srch(r,num);
if(f)
printf("Found");
else
printf("Not Found");
return 0;
}
Комментарии:
1. Прежде чем искать в детали реализации: ты написал каждого узла в файл
texts/bst.txt
, но в поиске программы вы прочитали только первый узел, а не все дерево.2. «некоторые ошибки». Пожалуйста, не заставляйте нас догадываться, или запустите отладку всей программы с нуля. Расскажите нам именно то, что симптомы, которые вы получаете. Обычно предоставляя входные данные, ожидаемые результаты и фактический объем производства. А также поделиться с нами, что вы нашли во время отладки.
3. я получаю результат только для корневого узла. если я ищу номер друга, чем корневой узел будет остановлено.
4. Итак, как я могу прочитать все дерево, что то, что я прошу
5. Сохраняйте только номер
int val
в файле. ………. по британскому летнему времени.
Ответ №1:
У вас есть несколько проблем.
1. while((y=getchar())!=EOF){
: Выброшенные на один символ.
2. fwrite(r,sizeof(struct root),1,fp);
: Только узлы корня сохраняется. Указатель не может быть воспроизведена во время чтения.
3. struct root *srch(struct root *r, int a){
: Во-первых, вам нужно проверить значение null.
if(r->val>a){
Примеры изменений:
по британскому летнему времени.ч.:
#ifndef BST_H
#define BST_H
#define BST_TEXT_FILE "texts/ans.txt"
#define BST_BIN_FILE "texts/bst.dat"
struct root{
int val;
struct root *left;
struct root *right;
};
#endif
input_store.ч.:
#include <stdio.h>
#include <stdlib.h>
#include "bst.h"
typedef enum ftype { Bin, Text } Ftype;
int fprint_bst(FILE *fp, struct root *r, Ftype type ){
if(r){
int count = 0;
count = fprint_bst(fp, r->left, type);
if(type == Text)
fprintf(fp, "%dn", r->val);//write text
else
fwrite(amp;r->val, sizeof(r->val), 1, fp);write bin
count = fprint_bst(fp, r->right, type);
return count 1;//count elements then it return
}
return 0;
}
void fwrite_bst(struct root *r){
FILE *fp;
int n;
fp = fopen(BST_TEXT_FILE, "wt");
n = fprint_bst(fp, r, Text);
fclose(fp);
fp = fopen(BST_BIN_FILE, "wb");
fwrite(amp;n, sizeof(n), 1, fp);//store number of elements
fprint_bst(fp, r, Bin);
fclose(fp);
}
struct root *insert(struct root *r, int val){
if(r == NULL){
r = malloc(sizeof(*r));
r->val = val;
r->left = r->right = NULL;
} else {
if(val < r->val)
r->left = insert(r->left, val);
else if(val > r->val)
r->right = insert(r->right, val);
}
return r;
}
void free_bst(struct root *r){
if(r){
free_bst(r->left);
free_bst(r->right);
free(r);
}
}
int main(void){
int val;
struct root *r = NULL;
printf("Enter the number: n");
while(1 == scanf("%d", amp;val)){
r = insert(r, val);
}
fprint_bst(stdout, r, Text);
fwrite_bst(r);
free_bst(r);
return 0;
}
поиск.с:
#include <stdio.h>
#include <stdlib.h>
#include "bst.h"
struct root *search(struct root *r, int a){
if(r == NULL)//need NULL check
return NULL;//and return NULL
if(r->val > a)
return search(r->left, a);
else if(r->val < a)
return search(r->right,a);
else
return r;
}
struct root *new_node(int val){
struct root *node = malloc(sizeof(*node));
if(!node){
fprintf(stderr, "fail mallocn");
exit(EXIT_FAILURE);
}
node->val = val;
node->left = node->right = NULL;
return node;
}
struct root *create_bst(int n, int data[n]){
if(n == 0)
return NULL;
else if(n == 1)
return new_node(data[0]);
int mid = n / 2;//split [left part] mid [right part]
struct root *r = new_node(data[mid]);
r->left = create_bst(mid, data);
r->right = create_bst(n - mid -1, data mid 1);
return r;
}
struct root *load(void){
int n;
FILE *fp = fopen(BST_BIN_FILE, "rb");
fread(amp;n, sizeof(n), 1, fp);//read number of elements
int *data = malloc(n * sizeof(*data));
fread(data, sizeof(*data), n, fp);
fclose(fp);
struct root *r = create_bst(n, data);
free(data);
return r;
}
int main(void){
int num;
struct root *f, *r = load();//Constitute the tree from the file
printf("Enter the Number: ");
scanf("%d", amp;num);
f = search(r, num);
if(f)
puts("Found");
else
puts("Not Found");
//free_bst(r);//Omitted because it is the same
return 0;
}