Gå til innhold

[Løst] C Problem med Lesing fra fil til struktur i Binær-tre


Anbefalte innlegg

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
Videoannonse
Annonse

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...