2013-07-28 53 views
0

好了,所以我有以下代碼:C-鏈表遍歷問題

typedef struct node { 
char line[3]; 
struct node* next; 
}NODE; 

NODE * enq(char b[]); 
NODE * deq(NODE *head); 
void printQueue (NODE *head); 

int main(void) 
{ 
    FILE* fp; 
    char* filename = "expressions.txt"; 
    char buffer[50]; 
    int len; 

    struct node *head = NULL, *tail, *temp, *temp2; 

    if((fp=fopen(filename, "r"))==NULL) 
    { 
     printf("unable to open %s\n", filename); 
     exit(1); 
    } 


    while(fgets(buffer, sizeof(buffer), fp) !=NULL) 
    { 
     len=strlen(buffer); 
     if(buffer[len-1]=='\n') 
      buffer[len-1]='\0'; 

     if (strcmp("=",buffer) ==0) 
     { 

      printQueue(head); 
     } 
     else 
     {   
      temp = enq(buffer); 

      if(head ==NULL) 
       head = temp; 
      else 
       tail->next = temp; 
      tail = temp; 
     } 
    } 

    } 

    NODE * enq(char b[]) 
    { 
     NODE *temp = malloc(sizeof(NODE)); 
     strcpy(temp->line, b); 
     temp -> next = NULL;  

     return temp; 
    } 

    NODE *deq(NODE *head) 
    { 
     NODE *temp = head->next; 

     free(head); 
     return temp; 
    } 

    void printQueue (NODE *head) 
    { 
     char hold[3]; 
     int sum = 0, place, sign; 
     while(head !=NULL) 
     { 
      strcpy(hold, head->line); 
      if(hold[0] < 58 && hold[0]>47) 
      { 
       place = atoi(hold); 
       if (sign == -1) 
       { 
        place = place *sign; 
        sign = 1; 
       } 
       sum = sum + place; 
      } 
      else if (strcmp(hold, "-")==0) 
      { 
       sign = -1; 
      } 
      printf("%s ", hold); 
     head=deq(head); 
     } 
    printf("= %d\n",sum); 

    } 

這是從我的文件輸入數據:

71 
- 
67 
- 
71 
+ 
9 
- 
19 
= 
27 
+ 
8 
+ 
10 
- 
94 
- 
64 
= 

的預期結果是這樣的:

71 - 67 - 71 + 9 - 19 = -77 
27 + 8 + 10 - 94 - 64 = -113 

輸出我得到:

71 - 67 - 71 + 9 - 19 = -77 
64 = 64 

它總是正確執行第一組表達式,之後的任何表達式,它會跳過鏈表中的一些元素,現在我想我已經縮小到了出列方法,但是當我正在釋放頭。如果我沒有空閒並且只是測試打印輸出,它會列出列表中的每一個元素,這對觀察是可以接受的,但是在一天結束時,我需要釋放每個節點,因爲我從列表中提取它,而我我不確定爲什麼它跳過了一大堆節點。在發送到printQueue之前,我打印了這個列表,看起來很好,但在出列之後,元素開始消失。任何見解都會有所幫助。

回答

2

發生這種情況是因爲在打印表達式的結果並開始解析新表達式(因此,新鏈接列表)後,您忘記重置頭指針。

在你的main(),試圖通過

if (strcmp("=",buffer) ==0) 
    { 

     printQueue(head); 
     head = NULL; 
    } 

更換片斷

if (strcmp("=",buffer) ==0) 
    { 

     printQueue(head); 
    } 

,你應該得到預期的輸出。

另請注意,如果您的輸入文件不以'='結尾(這不會調用您當前釋放列表節點的printQueue()),會發生內存泄漏。

+0

謝謝!我忽略了這樣一個簡單的問題,但它現在應該是這樣。在我的情況下,該文件將始終以「=」號結尾,所以我不必擔心這一點。 –