2013-07-28 2 views
0

Ok поэтому у меня есть следующий код: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 

Он всегда выполняет первый набор выражений правильно, любое выражение после этого пропускает некоторые элементы из связанного списка, теперь я ДУМАЮ, что я сузил его до метода dequeue, который работает некорректно, когда я я освобождаю голову. Если я не освобождаюсь и просто проверяю вывод на печать, он печатает каждый отдельный элемент в списке, который подходит для наблюдений, но в конце дня мне нужно освободить каждый узел, когда я извлечу его из списка, и я я не уверен, почему он пропускает целую кучу узлов. Я напечатал список, прежде чем он будет отправлен printQueue, и это кажется прекрасным, но сразу после удаления из очереди элементы начинают исчезать. Любое понимание было бы полезно.

ответ

2

Это происходит потому, что вы забываете сбросить указатель головы после того, как вы напечатали результат выражения и начали анализировать новое выражение (следовательно, новый связанный список).

в основной(), попробуйте заменить этот фрагмент кода

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

     printQueue(head); 
    } 

по

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

     printQueue(head); 
     head = NULL; 
    } 

И вы должны получить ожидаемый результат.

Также обратите внимание на утечку памяти, которая может произойти, если ваш входной файл не заканчивается символом '=' (это не вызовет ваш printQueue(), в котором вы в настоящее время освобождаете свои узлы списка).

+0

Спасибо! Такой простой вопрос я забыл, но он работает так, как он должен сейчас. И в моем случае файл всегда заканчивается знаком «=», поэтому мне не нужно беспокоиться об этом. –