2015-12-22 91 views
0

我基本上是從文本文件讀取行並將其保存到隊列中。但是,我需要確保的一部分行不重複,所以我需要一個函數來檢查該字符串是否已經在隊列中。如何比較我從文件中讀取的值並將其與隊列中的所有值進行比較?

這是我的主要功能結構和組成部分:

struct Runway0TakeOff{  
    char fdetails[10]; 
    int TakeOffHours; 
    int TakeOffMins; 
    int passengers; 
    int WaitingTime; 
    struct Runway0TakeOff *nextPtr; 
}; 

typedef struct Runway0TakeOff RunZeroTakeOff; 
typedef RunZeroTakeOff *RunZeroTakeOffPtr; 

void AddToRunway0T(RunZeroTakeOffPtr *r0ThPtr, RunZeroTakeOffPtr *r0TtPtr, char fdetails[], int TakeOffHours, int TakeOffMins, int passengers); 
int inTheSystem(RunZeroTakeOffPtr currentPtr, char fdetails[]); 
int isEmpty(RunZeroTakeOffPtr r0ThPtr); 

int main() 
{ 
    int c, numberoflines, s, k, n, f, t; 
    char OptionCode[ROW][COLUMN], details[10], fdetails[10]; 

    int TakeOffHours, TakeOffMins, passengers, ArrivalTimeMins, ArrivalTimeHours; 

    RunZeroTakeOffPtr r0ThPtr=NULL; 
    RunZeroTakeOffPtr r0TtPtr=NULL; 

    FILE * fPointer; 
    fPointer = fopen("planes.txt","r"); 

    c=0; 

    while ((c < ROW) && fgets(OptionCode[c], COLUMN, fPointer)) 
    { 
     ++c; 
    } 

    for(k=0;k<8;k++) 
    { 
     n=0; 
     for (s = 2; s < 9; s++) 
     { 
      details[n] = OptionCode[k][s]; 
      ++n; 
      details[7]='\0'; 
      sprintf(fdetails, "%c%c %c%c%c%c%c", details[0], details[1], details[3], details[4], details[5], details[6], details[7]); 
     } 

     if(OptionCode[k][0]=='T') 
     { 
      TakeOffHours=((OptionCode[k][10]-'0')*10)+(OptionCode[k][11]-'0'); 
      TakeOffMins=((OptionCode[k][13]-'0')*10)+(OptionCode[k][14]-'0'); 
      passengers=((OptionCode[k][16]-'0')*100)+((OptionCode[k][17]-'0')*10)+(OptionCode[k][18]-'0'); 
      AddToRunway0T(&r0ThPtr, &r0TtPtr, fdetails, TakeOffHours, TakeOffMins, passengers); 

      printQueue(r0ThPtr); 
      inTheSystem(r0ThPtr,fdetails); 
     } 
     fclose(fPointer); 
    } 
} 

void AddToRunway0T(RunZeroTakeOffPtr *r0ThPtr, RunZeroTakeOffPtr *r0TtPtr, char fdetails[], int TakeOffHours, int TakeOffMins, int passengers) 
{ 
    RunZeroTakeOffPtr newPtr; 
    int WaitingTime=0; 

    newPtr=malloc(sizeof(RunZeroTakeOff)); 

    if(newPtr!=NULL) 
    { 
     strncpy(newPtr->fdetails,fdetails,sizeof(RunZeroTakeOff)); 
     newPtr->TakeOffHours=TakeOffHours; 
     newPtr->TakeOffMins=TakeOffMins; 
     newPtr->passengers=passengers; 
     newPtr->nextPtr=NULL; 
     newPtr->WaitingTime=0; 

     printf("%s %d %d %d %d\n", fdetails, TakeOffHours, TakeOffMins, passengers, WaitingTime); 

     if(isEmpty(*r0ThPtr)) 
     { 
      *r0ThPtr=newPtr; 
     } 
     else 
     { 
      (*r0TtPtr)->nextPtr=newPtr; 
     } 

     *r0TtPtr=newPtr; 
    } 
} 

int isEmpty(RunZeroTakeOffPtr r0ThPtr) 
{ 
    return r0ThPtr==NULL; 
} 

int inTheSystem(RunZeroTakeOffPtr currentPtr, char fdetails[]) 
{ 
    while(currentPtr->nextPtr!=NULL) 
    { 
     if(strcmp(fdetails,currentPtr->fdetails)==0) 
     { 
      printf("It's a match!\n"); 
     } 
     else{ 
      printf("Nein\n"); 
     } 
    } 
    currentPtr = currentPtr->nextPtr; 
} 

我inTheSystem函數返回「Nein」的無限循環。我已經知道它不會與隊列中的所有元素進行比較,我真的不知道該怎麼做。我希望我的問題很清楚。我只想比較最近由程序讀取的fdetails,並將其與之前讀取並保存在隊列中的所有之前的fdetails進行比較。

注意:不要介意額外聲明的變量,這個程序只是一半完成。

+1

瞭解如何使用調試器。他們很平靜(至少在大多數時候),是有幫助的,並且會解決你的問題,或者至少縮小它的範圍。 – Downvoter

回答

0

您通過比較currentPtrNULL你的循環,你必須遍歷到下一個elment currentPtr=currentPtr->nextPtr;控制你的循環(你做的外面)

int inTheSystem(RunZeroTakeOffPtr currentPtr,char *fdetails[]) 
{ 
    int count = 0; 
    while (currentPtr != NULL) 
    { 
     if(strcmp(fdetails,currentPtr->fdetails)==0) 
     { 
      count ++; 
      printf("It's a match!\n"); 
     } 
     else{ 
      printf("Nein\n"); 
     } 
     currentPtr=currentPtr->nextPtr; 
    } 
    return count; 
} 
相關問題