2015-12-22 87 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; 
} 
相关问题