繁体   English   中英

C-链接列表遍历问题

[英]C- Linked List traversing issue

好的,我有以下代码:

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之前打印了它,看起来很好,但是在出列后,元素开始消失。 任何见解都会有所帮助。

发生这种情况是因为在打印表达式的结果并且开始解析新表达式(因此,新的链接列表)之后忘记重置头指针。

在你的main()中,尝试替换代码段

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

        printQueue(head);
    }

通过

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

        printQueue(head);
        head = NULL;
    }

你应该得到预期的输出。

如果您的输入文件没有以'='结尾(这不会调用您当前释放列表节点的printQueue()),请注意可能发生的内存泄漏。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM