开发者

Need Help: Stack ADT Linked list with VOID STAR implementation (C Programming)

开发者 https://www.devze.com 2023-01-26 19:38 出处:网络
First of all, i couldn\'t use \"code sample\" therefore i am adding my codes as stated below: Header.h

First of all, i couldn't use "code sample" therefore i am adding my codes as stated below:

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");
        inser开发者_Go百科t = (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;
}

EDIT: I want to put X, into S(tack) by using PushStack function. And then i want to take the value(5) stored in S and print it as Z which is an integer. But i see a numbers like 4247612, which does not change as long as the compiler window is not closed.


Note that PushStack((void *)x, S); int z = (int)PopStack(S); can incur truncation, and so, puncasting types like this is not guaranteed to work in all cases: void * is not a magic type that can hold each and every possible value in the universe. (It would especially go up in flames if you started to use doubles instead of ints on contemporary implementations.) It may however point to one.


The problem is that you've defined Stack as a struct Node * and are trying to update its value inside the PushStack() and PopStack() functions. When you assign a value to s inside either function, it only updates the local variable, and not S in your main function. Instead, PushStack() and PopStack() may need to take a pointer to a stack object (Stack *) so that you can update the caller's value too.


Your PushStack and PopStack routines is not doing what you want

To exhibit it explicitly in the PopStack function:

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; 
}

Because the S in main is never updated it continues to be NULL.

You would fix this by passing a Stack *s, and accessing it using *s in both function.

0

精彩评论

暂无评论...
验证码 换一张
取 消