Q:

menu driven program for stack as linked list with char info

As part of school assignment on data structures i have to write a program to implement Stack as linked list. Following is the code I wrote. 
C++ Program To Implement Stack using Linked List
    #include<iostream.h>
    #include<stdlib.h>
    #include<stdio.h>
    #include<string.h>

    /*
     * Node Declaration
     */
    struct node
    {
        char city[20];
        struct node *link;
    }*top;

    /*
     * Class Declaration
     */
    class stack_list
    {
        public:
        node *push(node *, char[20]);
        node *pop(node *);
        void traverse(node *);
        stack_list()
        {
            top = NULL;
        }
    };

    /*
     * Main: Contains Menu
     */
     int main()
    {
        int choice;
        char item[20];
        stack_list sl;
        do
        {
        cout<<"\n-------------"<<endl;
        cout<<"Operations on Stack"<<endl;
        cout<<"\n-------------"<<endl;
        cout<<"1.Push Element into the Stack"<<endl;
        cout<<"2.Pop Element from the Stack"<<endl;
        cout<<"3.Traverse the Stack"<<endl;
        cout<<"4.Quit"<<endl;
        cout<<"Enter your Choice: ";
        cin>>choice;
        switch(choice)
        {
        case 1:
            cout<<"Enter value to be pushed into the stack: ";
            gets(item);
            top = sl.push(top, item);
            break;
        case 2:
            top = sl.pop(top);
            break;
        case 3:
            sl.traverse(top);
            break;
        case 4:
            exit(1);
            break;
        default:
            cout<<"Wrong Choice"<<endl;
        }
        } while(choice !=4);
       return 0;
    }

    /*
     * Push Element into the Stack
     */
    node *stack_list::push(node *top, char city[20])
    {
        node *tmp=NULL;
        tmp = new (struct node);
        strcpy(tmp->city,city);
       // tmp->city[20] =item[20];
        tmp->link = top;
        top = tmp;
        return top;
    }

    /*
     * Pop Element from the Stack
     */
    node *stack_list::pop(node *top)
    {
        node *tmp;
        if (top == NULL)
            cout<<"Stack is Empty"<<endl;
        else
        {       
            tmp = top;
        cout<<"Element Popped: "<<tmp->city<<endl;
            top = top->link;
            free(tmp);
        }
        return top;
    }

    /*
     * Traversing the Stack
     */
    void stack_list::traverse(node *top)
    {       
        node *ptr;
        ptr = top;
        if (top == NULL)
            cout<<"Stack is empty"<<endl;
        else
        {
            cout<<"Stack elements :"<<endl;
            while (ptr != NULL)
            {
            cout<<ptr->city[20]<<endl;
                ptr = ptr->link;
            }
        }
    }

The following program doesn't display the pushed character during run.
If I push "Delhi", I get pushed and popped but when I call the transverse, it does not show the pushed members.

A:

This line is wrong:
        cout<<ptr->city[20]<<endl;

You need to use:
        cout<<ptr->city<<endl;

Suggestion to change stack_list
Instead of using a global top, make a member variable top in the class. Then, you can simplify the member functions. They don't need a node* as input any more.
class stack_list
{
    public:
    node *push(char[20]);
    node *pop();
    void traverse();
    stack_list()
    {
        top = NULL;
    }
    private:
       node* top;
};

Change the implementations accordingly.

