链栈的括号匹配问题 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("匹配成功!");
} 试试
#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("匹配成功!");
} x=(wzw*)malloc(sizeof(wzw*));
这里用它干嘛?申请不用,free的是q原来的空间 写题不易,一个代码几个小时,如果能运行成功并达到了预期效果
给个最佳吧
页:
[1]