weebl Skrevet 22. august 2011 Del Skrevet 22. august 2011 Hei! driver å jobber med et program i C som leser ifra en fil og lagrer disse dataene i et binær-tre, men i loopen hvor jeg leser fra fil og skal putte inn i treet skjer det noe galt da bare den siste linja som blir lest skrives til treet. output når jeg kjører programmet ser slik ut... 1. Get Data From File 2. Delete 3. Search 4. Display 6. Exit Enter Your Choice : 1 ***** Get data from file ***** to fire seks Õtte ti 1. Get Data From File 2. Delete 3. Search 4. Display 6. Exit Enter Your Choice : 4 1. Preorder 2. Inorder 3. Postorder 4. Non Recursion 5. Exit Enter Your Choice : 1 ti Press Any Key To Continue...... 1. Preorder 2. Inorder 3. Postorder 4. Non Recursion 5. Exit Enter Your Choice : to,fire,seks,åtte,ti er det som leses fra filen og som så blir printa ut i terminalen. selve programmet ser slik ut: /* * File: main.c * Author: Nikolai * * Created on 22. august 2011, 13:46 */ #include <stdio.h> #include <string.h> #include <stdlib.h> /* * */ struct node { char famName[20]; char firstNames[60]; int ID; char address1[30]; char postCode[12]; char email[50]; char boatClass[30]; char boatName[30]; struct node *left, *right; }; void insert(struct node *r, struct node *p) { if ((r->right == NULL) && (strcmp(p->famName, r->famName) > 0)) r->right = p; else if ((r->right != NULL) && (strcmp(p->famName, r->famName) > 0)) insert(r->right, p); if ((r->left == NULL) && (strcmp(p->famName, r->famName) < 0)) r->left = p; else if ((r->left != NULL) && (strcmp(p->famName, r->famName) < 0)) insert(r->left, p); } void tree(struct node *r, int c) { int top, flag; struct node *w, *stack[20]; if (r != NULL) { if (c != 4) { if (c == 1) printf(" %s ", r->famName); tree(r->left, c); if (c == 2) printf(" %s ", r->famName); tree(r->right, c); if (c == 3) printf(" %s ", r->famName); } } if (c == 4) { top = 0; w = r; flag = 0; while ((top != - 1) && (w != NULL)) { while ((flag == 0) && (w->left != NULL)) { stack[top] = w; top++; w = w->left; } printf(" %s ", w->famName); if (w->right != NULL) { w = w->right; flag = 0; } else { top--; w = stack[top]; flag = 1; } } } } int main() { int choice, c, i, flag; char temp = 'N', temp1[15]; struct node *s, *root, *r, *q; root = NULL; static const char filename[] = "C:/movieData/file.txt"; FILE *file = fopen ( filename, "r" ); do { printf("\n 1. Get Data From File"); printf("\n 2. Delete "); printf("\n 3. Search "); printf("\n 4. Display"); printf("\n 6. Exit"); printf("\nEnter Your Choice : "); scanf("%d", &choice); switch (choice) { case 1: /*HER LIGGER FEILEN EN PLASS*/ printf("***** Get data from file ***** \n"); s = malloc(sizeof(struct node)); s->left = NULL; s->right = NULL; if ( file != NULL ) { char line [ 128 ]; /* or other suitable maximum line size */ int fLine = 1; int i = 0; while ( fgets ( line, sizeof line, file ) != NULL ) /* read a line */ { if (fLine) { fLine = 0; } else { if (i % 2 == 0) { strcpy(&s->famName, line); printf("%s",line); //scanf("%s", &s->famName); if (root == NULL) { //printf("root == NULL\n"); root = s; } else { //printf("else\n"); insert(root, s); } i++; } else { i++; } } } } fclose ( file ); //else //{ // perror ( filename ); /* why didn't the file open? */ //} break; /*DEN LIGGER NOK IKKE ETTER DETTE*/ case 2: printf("****** Delete Operation *******\n"); do { printf("\nEnter Element To Be Deleted : "); scanf("%s", temp1); s = root; i = 0; flag = 0; do { if (strcmp(s->famName, temp1) > 0) { r = s; s = s->left; i = 2; } if (strcmp(s->famName, temp1) == 0) { flag = 1; if (i == 0) { if (root->right != NULL) { q = root->left; root = root->right; insert(root, q); } if (root->right == NULL) root = root->left; } else { if (i == 1) { q = s->left; r->right = s->right; if (s->left != NULL) insert(r, q); } if (i == 2) { q = s->right; r->left = s->left; if (s->right != NULL) insert(r, q); } } } } while (flag == 0 && s != NULL); printf("\n Delete Any More[Y/N] : "); scanf("%c", &temp); } while (temp == 'y') ; break; case 3: printf("****** Search Operation *******\n"); printf("\n Enter Name To Be Searched"); scanf("%s", temp1); i = 0; s = root; while (s != NULL && i == 0) { if (strcmp(s->firstNames, temp1) < 0)s = s->right; if (strcmp(s->firstNames, temp1) > 0) s = s->left; if (strcmp(s->firstNames, temp1) == 0) printf("%s", &s->famName); i = 1; } if (i == 0) printf("\nElement Not Found\n"); else printf("\nElement Found\n"); printf("%s", &s->firstNames); printf("%s", &s->famName); break; case 4: do { printf( "\n 1. Preorder\n 2. Inorder \n 3. Postorder \n 4. Non Recursion \n 5. Exit"); printf("\nEnter Your Choice : "); scanf("%d", &c); if (root == NULL) printf("Tree Not Started Yet"); else tree(root, c); printf("\n Press Any Key To Continue......"); int getchar(void); } while (c != 5); break; case 5: printf("***** Enter full info ***** "); s = malloc(sizeof(struct node)); s->left = NULL; s->right = NULL; printf("\nEnter famName: "); scanf("%s", &s->famName); //printf("\nEnter firstNames: "); //scanf("%s", &s->firstNames); //printf("\nEnter Addres line 1: "); //scanf("%s", &s->address1); if (root == NULL) root = s; else insert(root, s); break; } } while (choice != 6); return(0); } regner med feilen ligger i rekkefølgen jeg gjør ting i loopen men har nådd et stadie hvor jeg er totalt kodeblind Lenke til kommentar
Topguy Skrevet 23. august 2011 Del Skrevet 23. august 2011 Jeg tror mye av problemet skyldes at du allokerer kun ett "node" objekt og gjenbruker det hele tiden. Hvis disse linjene: s = malloc(sizeof(struct node)); s->left = NULL; s->right = NULL; legges like etter: if (i % 2 == 0) { så innbiller jeg meg at ting kan bli annerledes. Lenke til kommentar
weebl Skrevet 25. august 2011 Forfatter Del Skrevet 25. august 2011 jepp ser ut til at det gjorde jobben, Takk Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå