Нужна помощь: Stack ADT Связанный список с реализацией VOID STAR (Программирование на C) - PullRequest
1 голос
/ 22 ноября 2010

Прежде всего, я не смог использовать «пример кода», поэтому я добавляю свои коды, как указано ниже:

Header.h

    #ifndef MYHEADER_H
    #define MYHEADER_H

    #define EMPTY_TOS -1
    #define MIN_STACK_SIZE 5
    #define FALSE 0
    #define TRUE 1


    struct Node;
    typedef struct Node *Stack;


    void *PopStack(Stack);
    void *TopOfStack(Stack);
    void PushStack(void *val, Stack); 
    int IsEmptyStack(Stack);
    int IsFullStack(Stack);

    #endif 

Header.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    #include "myheader.h"

    #define EMPTY_TOS -1 
    #define MIN_STACK_SIZE 5
    #define FALSE 0
    #define TRUE 1

    struct Node
    {
        void *val; 
        struct Node *next;
    };

    void PushStack(void *x, Stack s)
    {
         printf("/n a1");
        struct Node *insert;
               printf("/n a2");
        insert = (struct Node *) malloc(sizeof(struct Node));
               printf("/n a3");

        if (insert == NULL)
               printf("Out of memory space!\n");
        else
        {      printf("\n a4");
               insert->val = x;printf("\n a5");
               insert->next= s;printf("\n a6");
               s = insert;printf("\n a7");
        }
        printf("\n a8");
    }

    void *PopStack(Stack s)
    {                    printf("\n pop1");
        struct Node *remove; printf("\n pop2");
        void *val;           printf("\n pop3");

        if (IsEmptyStack(s))
        {
               printf("\nThe stack is empty!\n");
        }
        else   
        {      printf("\n pop4");
               remove = s;       printf("\n pop5");
               val = remove->val;     printf("\n pop67");
               s = s->next;      printf("\n pop7");
               free(remove);     printf("\n pop8");
        }
        return val;              printf("\n pop9");
    }

    void *TopOfStack(Stack s)
    {
        if (!IsEmptyStack(s))
               return s->next->val;
        else
        {
               printf("\nThe stack is empty\n");
               return 0;
        }

    }

    int IsEmptyStack(Stack s)
    {
        printf("empty");
        return (s == NULL);
    }


    int IsFullStack(Stack s)
    {
        return FALSE;
    }

Project.cpp

int main()
{

 Stack S = NULL;
 int x = 5;
 PushStack((void *)x, S);
 int z = (int)PopStack(S);
 printf("\n z = %d \n", z);



 system("PAUSE");
 return 0;
}

РЕДАКТ.используя функцию PushStack.И тогда я хочу взять значение (5), хранящееся в S, и вывести его как Z, которое является целым числом.Но я вижу такие числа, как 4247612, которые не меняются, если окно компилятора не закрыто.

Ответы [ 3 ]

2 голосов
/ 22 ноября 2010

Обратите внимание, что PushStack((void *)x, S); int z = (int)PopStack(S); может привести к усечению, и поэтому такие типы пункастинга не гарантируют работу во всех случаях: void * не является магическим типом, который может содержать все возможные значения во вселенной. (Это особенно вспыхнет, если вы начнете использовать double с вместо int с в современных реализациях.) Однако оно может указывать на единицу.

1 голос
/ 22 ноября 2010

Проблема в том, что вы определили Stack как struct Node * и пытаетесь обновить его значение внутри функций PushStack() и PopStack(). Когда вы присваиваете значение s внутри любой функции, оно обновляет только локальную переменную, а не S в вашей основной функции. Вместо этого PushStack() и PopStack(), возможно, потребуется взять указатель на объект стека (Stack *), чтобы вы могли также обновить значение вызывающей стороны.

0 голосов
/ 22 ноября 2010

Ваши подпрограммы PushStack и PopStack не выполняют то, что вы хотите

Чтобы явным образом отобразить это в функции PopStack:

void *PopStack(Stack s) { // <-- The s declared here is a LOCAL copy of the s your pass
  struct Node *remove;
  void *val;

  if (IsEmptyStack(s)) {
    printf("\nThe stack is empty!\n");
  } else {
    remove = s; 
    val = remove->val; 
    s = s->next;          // <-- Changes the local copy, but the original is unchanged
    free(remove);   
  }
  return val; 
}

Поскольку S вmain никогда не обновляется, он по-прежнему равен NULL.

Это можно исправить, передав Stack *s и получив к нему доступ, используя *s в обеих функциях.

...