Почему это приводит к ошибке «запрос элемента данных в чем-то, не являющемся структурой»? - PullRequest
0 голосов
/ 15 февраля 2011

В чем проблема с закомментированной строкой?

#include<stdio.h>


typedef struct _stack
{
    char data;
    struct stack* next;
}stack;

int main()
{
    char *s="4$2*3-3+8/4/(1+1)";
    char * prefix= (char*) malloc(strlen(s+1)); 
    convertinfixtoprefix(s,prefix);
    int len=strlen(prefix);
    int i;
    for(i=0;i<len/2;i++)
    {
        char temp;
        temp=prefix[i];
        prefix[i]=prefix[len-i-1];
        prefix[len-i-1]=prefix[i];
    }
    printf("The Prefix expression is %s",prefix);
}


void convertinfixtoprefix(char* infix,char*prefix)
{
    stack *s=NULL;
    int pr;
    char c=NULL;
    char d;
    int i=strlen(infix)-1;
    int index=0;

    while(i>=0)
    {
        c=infix[i];
        if(c==')')
        {
            push(&s,c);
        }
        else
        if(c=='(')
        {
            while((d=pop(&s))!=')')
            {
                prefix[index]=d;
                index++;
            }
        }

        if( (c!='+') && (c!='-') && (c!='*') && (c!='/') && (c!='$') ) 
        {
            prefix[index]=c;
            index++;
        }   
        else
        {
            pr=priority(d=pop(&s));
            while(pr>priority(c))
            {
                prefix[index]=d;
                index++;
                pr=priority(d=pop(&s));
            }
            push(&s,c);
        }
    }
}


void push(stack** s,char c)
{
    if(*s==NULL)
    {
    *s=(stack*)malloc(sizeof(stack));
    ((*s)->data)=c;// HERE ITS SHOWS ERROR WHY?
    ((*s)->next)=NULL;
        }
    else
    {
        stack* temp=(stack*)malloc(sizeof(stack));
        temp->data=c;
        temp->next=*s;
        (*s)=temp;
    }
}


char pop(stack**s)
{
    if(*s==NULL)
    printf("Stack khaali hai bhai\n");
    else
    {
    char c=*s->data;
    stack* temp=*s;
    *s=*s->next;
    free(temp);
        return c;   
    }
    return 0;
}


int priority(char c)
{
    if(c=='+'||c=='-')
    {   return 1;
    }
    else if(c=='*'||c=='/'||c=='%')
    {   return 2;
    }
    else if(c=='$')
    {
        return 3;
    }
}

Ответы [ 3 ]

2 голосов
/ 15 февраля 2011

Ваша ошибка не там, где вы ее указали.

Это следующие строки:

char c=*s->data;
stack* temp=*s;
*s=*s->next;

Что должно быть:

char c=(*s)->data;
stack* temp=*s;
*s=(*s)->next;

Есть несколько других плохих вещейтакже, например, вам нужно включить заголовок stdlib.h и string.h - и несколько ваших функций нуждаются в прототипе, прежде чем вызывать их.Скомпилируйте предупреждения, и вы увидите эти ошибки.

0 голосов
/ 15 февраля 2011

Боюсь, рекурсия в вашей структуре _stack не верна.Указатель на следующее также должен быть объявлен как struct _stack * next , вместо ссылки на тип stack , который вы создали ...

0 голосов
/ 15 февраля 2011

Очень часто эта ошибка появляется, когда ваш struct / class (C / C ++ / ObjectiveC / ...) не определен в области доступа к члену.

Проверьте включенные файлы, может быть, простая причина.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...