warren伟 发表于 2020-11-11 15:49:21

链栈的括号匹配问题 pop函数运行到free(p)的时候报错,求大佬帮我看看


#include <stdio.h>
#define maxsize 100
#define size 5
typedef char data;
typedef struct wzw
{
        data sj;
        struct wzw *next;
       
}wzw;




void *inintstack(wzw *q)
{
        q->next= NULL;
       


}
int ifemepty(wzw *q)
{
        return (q ? 1 : 0);
}

data gettop(wzw* q)
{
        if (!q) { printf("空栈!"); return 0; }
        else
                return (q->sj);
}
void push(wzw* q, data x)
{
        wzw* p;
        p= (wzw*)malloc(sizeof(wzw*));
        p->sj = x;
        p->next = q;
   q->sj=p->sj;
       q->next = p->next;
       
}
wzw* pop(wzw* q)
{

        wzw* x;
        x=(wzw*)malloc(sizeof(wzw*));
        if (!q) { printf("空栈"); return 0; }
       
        x=q;
   q =q->next;
   free(x);
        return q;
}

intmatch(char c[])
{

        int x = 0;
        wzw *q;
        q = (wzw*)malloc(sizeof(wzw*));
inintstack(q);
        while (c != '#')
        {
                switch (c)
                {
                case '{':
                case'(':
                case'[': push(q, c); break;

                case '}': if (ifemepty(q) && gettop(q) == '{')
                {
                        pop(q); break;
                }
                                else return 1;

                case ')':if (ifemepty(q) && gettop(q) == '(')
                {
                        pop(q); break;
                }
                                else return1;

                case ']':if (ifemepty(q) && gettop(q) == '[')
                {
                        pop(q); break;
                }
                                elsereturn 1;                        
                }
                x++;
        }
        return(ifemepty(q));
}



int main()
{
        int a = 0;
       
                char p;
       
                printf("请输入%d个括号并以‘#’结尾:\n",size-1);
                for (int i = 0; i < size; i++)
                {
                        scanf_s("%c", &p);
                }
       //if (p != '#') printf("输入错误!请重新输入\n"); return 0;
               
       match(p);
                if (match(p) ==1 ) printf("匹配失败!");
             else printf("匹配成功!");

}

巴巴鲁 发表于 2020-11-15 10:13:57

试试
#include <stdio.h>
#include <stdlib.h>// 头文件最好加上
#define maxsize 100
#define size 5
typedef char data;
typedef struct wzw
{
      data sj;
      struct wzw *next;
         
}wzw;

void inintstack(wzw *q) // 不需要'*'号
{
      q->next= NULL;
}
int ifemepty(wzw *q)
{
      return (q->next ? 1 : 0); // 判断这个
}

data gettop(wzw* q)
{
      if (!q) { printf("空栈!"); return 0; }
      else
                return (q->next->sj); // 取这个元素
}

void push(wzw* q, data x)
{
      wzw* p;
      p= (wzw*)malloc(sizeof(wzw));
      p->sj = x;
      /*p->next = q;
   q->sj=p->sj;
         q->next = p->next;*/
         // 尾插法
         p->next = NULL;
         q->next = p;
         q = p;
         
}
wzw* pop(wzw* q)
{

      wzw* x;
      x=(wzw*)malloc(sizeof(wzw));
      if (!q) { printf("空栈"); return 0; }
      
      //删除这块有问题
      x=q->next;
                   q->next =x->next;
                   free(x);
      return q;
}

intmatch(char c[])
{

      int x = 0;
      wzw *q;
      q = (wzw*)malloc(sizeof(wzw));
                inintstack(q);
      while (c != '#')
      {
                switch (c)
                {
                case '{':
                case'(':
                case'[': push(q, c); break;

                case '}': if (ifemepty(q) && gettop(q) == '{')
                {
                        pop(q); break;
                }
                              else return 1;

                case ')':if (ifemepty(q) && gettop(q) == '(')
                {
                        pop(q); break;
                }
                              else return1;

                case ']':if (ifemepty(q) && gettop(q) == '[')
                {
                        pop(q); break;
                }
                              elsereturn 1;                        
                }
                x++;
      }
      return(ifemepty(q));
}



int main()
{
      int a = 0;
         
                char p;
         
                printf("请输入%d个括号并以‘#’结尾:\n",size-1);
                for (int i = 0; i < size; i++)
                {
                        scanf_s("%c", &p);
                }
         //if (p != '#') printf("输入错误!请重新输入\n"); return 0;
               
         match(p); // 这句有点多余,程序会多进行一次判断
            if (match(p) ==1 ) printf("匹配失败!");
             else printf("匹配成功!");

}

lovedai 发表于 2020-11-18 10:38:23

x=(wzw*)malloc(sizeof(wzw*));
这里用它干嘛?申请不用,free的是q原来的空间

巴巴鲁 发表于 2020-11-22 12:43:50

写题不易,一个代码几个小时,如果能运行成功并达到了预期效果
给个最佳吧
页: [1]
查看完整版本: 链栈的括号匹配问题 pop函数运行到free(p)的时候报错,求大佬帮我看看