2013-04-06 18 views
1

该代码无错误但不运行。我在文件处理附近应用了各种打印语句。问题似乎在那里。有人可以看到他们是否发现问题?文件处理时我的二叉查找树代码中的段错误

我输入的文件有格式的数据:

Insert "tab>" "name" "tab""IDNo" "tab" "Department""newline" 
Delete "tab""IDNO""newline" 
Find"tab"IDNO"newline" 

代码:

/*bst.h*/ 

typedef struct{ 
    unsigned int id; 
    char name[20]; 
    char dep[10]; 
    }studRec; 

struct bst; 
typedef struct bst binTree; 
typedef struct binTree *BST; 
struct binTree{ 
    studRec sRec; 
    BST left; 
    BST right; 
    }; 

/* bstMain.c*/ 

#include "bstOps.h" 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(){ 
    int s; 
    int key,i; 
    FILE *f; 
    char a[4][20]; 
    f=fopen("input.txt","r"); 
    if(f==NULL) 
    printf("error"); 
    else 
      printf("no error"); 
    char ch=getc(f); 

    studRec rec; 
    BST bt=createEmptyBST(); 



    do{ 
      for(i=0;ch!='\n';i++) 
        fscanf(f,"%s",a[i]); 

      if(a[0]=="Insert") 
        s=1; 
      else if(a[0]=="Delete") 
        {s=2; 
        key=atoi(a[1]);} 

      else if(a[0]=="Find"){ 
        s=3; 
        key=atoi(a[1]);} 
      printf("To print the list, press 4\n To exit,press 5.\n"); 
      scanf("%d",&s); 



    switch(s){ 
      case 1: 

      strcpy(rec.name,a[1]); 
      rec.id=atoi(a[2]); 
      strcpy(rec.dep,a[3]); 
      bt=insertInBST(bt,rec); 
      break; 

      case 2: 

      bt=deleteFromBST(bt,key); 
      break; 

      case 3: 
      rec=findInBST(bt,key); 

      case 4: 

      inorderTraversal(bt); 
      break; 

      case 5: 

      printf("\nTerminating!!!\n"); 
      break; 

      default: 
      printf("\nInvalid Option!! \n"); 
      break;} 
      ch=getc(f); 

      }while(ch!=EOF||s==5); 
      fclose(f); 

} 

/*bstOps.c*/ 

#include "bstOps.h" 
#include <string.h> 
#include <stdio.h> 
#include <stdlib.h> 

BST createEmptyBST(){ 
    BST root; 
    root=(BST)malloc(sizeof(BST)); 
//  root->sRec=(studRec *)malloc(sizeof(studRec)); 
    root->sRec.id=0; 
    strcpy(root->sRec.name,"/"); 
    strcpy(root->sRec.dep,"/"); 
    root->left=NULL; 
    root->right=NULL; 
    //root=NULL; 
    return root; 
    } 

BST insertInBST(BST bt,studRec rec){ 

    BST bt1=createEmptyBST(); 
    bt1=bt; 

    while(1){ 
    /*  if(bt==NULL){ 
        bt->sRec=rec; 
        bt->left=NULL; 
        bt->right=NULL; 
        break;} 
*/ 
      if(bt->sRec.id==rec.id) 
      { 
      return bt; 
      break; 
      } 
      else if(rec.id<bt->sRec.id){ 
        if(bt->left==NULL){ 
        bt->left=createEmptyBST(); 
        bt=bt->left; 
        bt->sRec=rec; 
        break; 
        } 
        else 
          bt=bt->left; 
        } 
      else{ 
        if(bt->right==NULL){ 
        bt->right=createEmptyBST(); 
        bt=bt->right; 
        bt->sRec=rec; 
        break; 
        } 
        else 
          bt=bt->right; 
      } 

    } 
    printf("inserted\n"); 
    return bt1; 
    } 


void inorderTraversal(BST bt){ 
    if(bt!=NULL){ 
      inorderTraversal(bt->left); 
      if(bt->sRec.id!=0) 
      printf("\t Id:%d\n Name:%s\n Deparment:%s\n",bt->sRec.id,bt->sRec.name,bt->sRec.dep); 
      inorderTraversal(bt->right); 
      } 
    } 

studRec findInBST(BST bt,int id){ 
    BST temp=createEmptyBST(); 
    if(bt==NULL||bt->sRec.id==0) 
      return temp->sRec; 
    if(id>bt->sRec.id) 
      return findInBST(bt->right,id); 
    else if(id<bt->sRec.id) 
      return findInBST(bt->left,id); 
    else 
      return bt->sRec; 



} 

BST deleteFromBST(BST bt,int id){ 
    BST q; 
    if(bt==NULL||bt->sRec.id==0){ 
      printf("\nElement not found\n"); 
      } 


    else if(id>bt->sRec.id) 
      bt->right=deleteFromBST(bt->right,id); 
    else{ 
      if(bt->right && bt->left){ 
        q=FindMin(bt->right); 
        bt->sRec=q->sRec; 
        bt->right=deleteFromBST(bt->right,q->sRec.id); 
        } 
      else{ 
        q=bt; 
        if(bt->left==NULL) 
          bt=bt->right; 
        else if(bt->right==NULL) 
          bt=bt->left; 
        free(q); 
        } 
      } 
      return bt; 
    } 

    BST FindMin(BST bt){ 
    if(bt==NULL||bt->sRec.id==0){ 
      return NULL; 
      } 
    if(bt->left) 
      return FindMin(bt->left); 
    else 
      return bt; 
    } 
int getHeight(BST bt){ 
    int h,lh,rh; 
    h=lh=rh-0; 
    if(bt->left!=NULL) 
      lh=(1+getHeight(bt->left)); 
    else if(bt->right!=NULL) 
      rh=(1+getHeight(bt->right)); 
    h=lh>rh?lh:rh; 
    return(h); 
    } 
+1

您需要先查看您的代码。它包含一些错误: ** 1。**在'getHeight()'中使用'strcmp'进行字符串比较(不是'=='运算符) ** 2。**,我认为它是'h = lh = rh = 0'不是'h = lh = rh-0' ** 3。**'FindMin'返回一个指针。在使用之前检查其返回“NULL”。 ** 4。**在主函数中,您的'for'永远不会停止。你正在检查哪一个没有改变。 ** 5.检查mani的注释 – Bechir 2013-04-06 10:43:56

+0

1)'} while(ch!= EOF && s!= 5);'。 2)'if(f == NULL) {fprintf(stderr,“error”); exit(EXIT_FAILURE);}'3)'for(i = 0; ch!='\ n'; i ++)'是循环不变的。 – wildplasser 2013-04-06 11:05:10

回答

0

坠毁是由不变环路引起的:

for(i=0;ch!='\n';i++) 
    fscanf(f,"%s",a[i]); 

停止条件永远如果是TRUE,则最终将覆盖将导致分段错误的数组a

这里有一个修复建议。您需要根据您的需求进行更新

int getHeight(BST bt) { 
    int h, lh, rh; 
    h = lh = rh = 0; 
    if (bt->left != NULL) 
     lh = (1 + getHeight(bt->left)); 
    else if (bt->right != NULL) 
     rh = (1 + getHeight(bt->right)); 
    h = lh > rh ? lh : rh; 
    return (h); 
} 

int main(int argc, char *argv[]) { 
    int s; 
    int key = 0, i; 
    FILE *f; 
    char line[200]; 
    char options[5][200]; 
    f = fopen(argv[1], "r"); 

    if (f == NULL) { 
     printf("error"); 
     return -1; 
    } 

    printf("no error"); 

    char ch = fgetc(f); 
    studRec rec; 
    BST bt = createEmptyBST(); 

    do { 

     for (i = 0; ch != '\n' && ch != EOF; i++) { 
      line[i] = ch; 
      ch = fgetc(f); 
     } 

     if (EOF == ch) { 
      printf("To print the list, press 4\n To exit,press 5.\n"); 
      scanf("%d", &s); 
     } 

     if (!strncmp(line, "Insert", strlen("Insert"))) { 
      s = 1; 
      // TODO parse the line string to get your options 
      sprintf(line, "Insert %s %s %s", options[0], options[1], options[2]); 
     } else if (!strncmp(line, "Delete", strlen("Delete"))) { 
      s = 2; 
      key = atoi(line + strlen("Delete") + 1); 
     } else if (!strncmp(line, "Find", strlen("Find"))) { 
      s = 3; 
      key = atoi(line + strlen("Find") + 1); 
     } 

     switch (s) { 
     case 1: 

      strcpy(rec.name, options[0]); 
      rec.id = atoi(options[1]); 
      strcpy(rec.dep, options[2]); 
      bt = insertInBST(bt, rec); 
      break; 

     case 2: 
      bt = deleteFromBST(bt, key); 
      break; 

     case 3: 
      rec = findInBST(bt, key); 
      break; 

     case 4: 

      inorderTraversal(bt); 
      break; 

     case 5: 

      printf("\nTerminating!!!\n"); 
      ch = EOF; // to break the do {} while() loop 
      break; 

     default: 
      printf("\nInvalid Option!! \n"); 
      break; 
     } 

    } while (ch != EOF || s == 5); 
    fclose(f); 
    return 0; 
} 
+0

while(ch!= EOF && s!= 5)'仍然需要修复'}。 – wildplasser 2013-04-06 12:04:58