qq_37568611 2017-08-06 03:19 采纳率: 0%
浏览 916
已结题

有大神帮忙看一下这个代码存在什么问题吗?万分感谢!

一个数据结构的问题,在主函数中的‘B’情况运行到EnQueue(Q1,e)的时候出现异常。
using namespace std;
#include
#include
#include
#include

typedef int Status;

#define int Status
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define MAXSIZE 100

//链栈
typedef struct StackNode {
char data;
struct StackNode *next;
}StackNode, *LinkStackPtr;
typedef struct LinkStack {
LinkStackPtr top;
int size;
}LinkStack;

//重要操作 LinkStack
//判断是否为空栈
Status StackEmpty(LinkStack *S) {
if (S->size == 0) {
return TRUE;
}
else {
return FALSE;
}
}
//初始化一个栈
Status InitStack(LinkStack *S) {
S->top = NULL;
S->size = 0;
return OK;
}
//返回栈顶元素
Status GetTop(LinkStack *S, char * e) {//char
if (S->size == 0) {
return ERROR;
}
else {
*e = S->top->data;
}
return OK;
}
//进栈操作
Status push(LinkStack *S, char e) {
LinkStackPtr s = (LinkStackPtr)malloc(sizeof(StackNode));
s->data = e;
s->next = S->top;
S->top = s;
S->size++;
return OK;
}
//出栈操作
Status pop(LinkStack *S, char *e) {
if (StackEmpty(S)) {
return FALSE;
}
else {
*e = S->top->data;
LinkStackPtr s = S->top;
S->top = s->next;
S->size--;
free(s);
return OK;
}
}

//链队列
typedef struct QNode {
char data;
struct QNode *next;
}QNode, *QueuePtr;//结点结构
typedef struct {
QueuePtr front, rear;
int Size;
}LinkQueue;//队列的链表结构

//重要操作 LinkQueue
//判断是否为空队列
Status QueueEmpty(LinkQueue *Q) {
if (Q->Size == 0) {
return TRUE;
}
else {
return FALSE;
}
}
//初始化
Status InitQueue(LinkQueue *Q) {
Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode));
if (!Q->front) exit(OVERFLOW);
Q->front->next = NULL;
Q->Size = 0;
return OK;
}
//入队列
Status EnQueue(LinkQueue *Q, char e) {//链队列是带头节点的,头指针永远指向头节点
QueuePtr q = (QueuePtr)malloc(sizeof(QNode));
if (!q) exit(OVERFLOW);
q->data = e;
q->next = NULL;
Q->rear->next = q;
Q->rear = q;
Q->Size++;
return OK;
}
//出队列
Status DeQueue(LinkQueue *Q, char *e) {
if (Q->front == Q->rear) return ERROR;
*e = Q->front->data;
QueuePtr q = Q->front->next;
Q->front->next = q->next;
if (q == Q->rear) Q->rear = Q->front;
Q->Size--;
free(q);
return OK;
}

//talk函数用于将魔王的语言进行压栈
Status Language_Talk(LinkStack *S) {
char word[MAXSIZE];
cout << "请输入魔王的语言";
cin >> word;
int i;
int j = 0;
int left = 0, right = 0;
cout << "魔王语言为"<<word << endl;
int len = strlen(word) - 1;
cout <<"魔王语言长度为"<< len+1 << endl;

cout << "成功输入魔王语言";

while (j<len) {

    if (word[j] == '(')
        left++;
    if (word[j] == ')')
        right++;
    j++;
}

if (len+1==0) {
    cout << "魔王没有说话";
    return ERROR;
}
else {
    if (left != right) {
        cout << "魔王说了错误的话";
        return ERROR;
    }
    else {
        for (i = len;i >= 0;i--) {
            push(S, word[i]);
        }
        }
    }
return OK;
}

//已经解析的语言存入数组
Status Language_Record(LinkQueue *Q, LinkQueue *Q1) {
//char *e=;
char *e = (char *)malloc(sizeof(char));
while (!QueueEmpty(Q)) {
DeQueue(Q, e);
EnQueue(Q1, *e);
}
return OK;
}

//词汇依次出栈进行处理
//A情况
char Language_explanA(LinkStack S, LinkQueue *Q) {
//char *e;
char *e = (char *)malloc(sizeof(char));
pop(S, e);
char E = *e;
free(e);
int a = 0;
char A[10] = "sae";
while (a <= 2) {
EnQueue(Q, A[a]);
a++;
}
return *e;
/*cout << A;
cout << "输出第一个元素";
cout << Q->front->data;
/
//return OK;
}
//B情况
Status Language_explanB(LinkStack S, LinkQueue *Q) {
//char *e;
char *e = (char
)malloc(sizeof(char));
pop(S, e);
int b = 0;
char B[10] = "tsaedsae";
while (B[b]) {
EnQueue(Q, B[b]);
b++;
}
return 0;
}
//‘(’情况
Status Language_explanleft(LinkStack S, LinkQueue *Q) {
//char *e;
char *e = (char
)malloc(sizeof(char));
pop(S, e);
pop(S, e);
char sita = e;
EnQueue(Q, sita);
while (S->top->data != ')') {
pop(S, e);
EnQueue(Q, *e);
EnQueue(Q, sita);
}
return 0;
}
//')'情况
Status Language_explanright(LinkStack *S, LinkQueue *Q) {
//char *e;
char *e = (char
)malloc(sizeof(char));
pop(S, e);
while (!QueueEmpty) {
DeQueue(Q, e);
push(S, *e);
}
return OK;
}

int main() {
int position = 0;
LinkStack *Link_Stack = (LinkStack *)malloc(sizeof(StackNode));
LinkQueue *Link_Queue = (LinkQueue *)malloc(sizeof(QNode));
LinkQueue *Humanwords = (LinkQueue *)malloc(sizeof(QNode));
InitStack(Link_Stack);
InitQueue(Link_Queue);
char Devilwords[MAXSIZE];

Language_Talk(Link_Stack);
cout << Link_Stack->size;
cout << Link_Stack->top->data << endl;

while (!StackEmpty(Link_Stack)) {
    if (Link_Stack->top->data == 'A') {
        Language_explanA(Link_Stack, Link_Queue);
        cout << "执行了A";
        cout << Link_Queue->Size << endl;
        cout << Link_Stack->size << endl;
    }
    if (Link_Stack->top->data == 'B') {
        Language_explanB(Link_Stack, Link_Queue);
        cout << Link_Queue->Size << endl;
        cout << Link_Stack->size << endl;
    }
    if (Link_Stack->top->data == '(') {
        Language_Record(Link_Queue, Humanwords);
        Language_explanleft(Link_Stack, Link_Queue);
    }
    if (Link_Stack->top->data == ')')
        Language_explanright(Link_Stack, Link_Queue);
}
cout << Humanwords;
system("pause");
return OK;

}

  • 写回答

4条回答 默认 最新

  • 唐之风采 2017-08-06 10:45
    关注

    编译错误信息是什么呀?(我要完整的)

    评论

报告相同问题?

悬赏问题

  • ¥15 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!