Your stack is a doubly linked list with restricted access to the links in the list. The links themselves need to do nothing (they could display their value if you want but other than display themselves they do nothing) so remove everything from abc but the member variables (and write a display method if you wish). The stack in this program is really called head, and head is really a pointer to the first link in the list, just like you have declared it. To use the list you have to have knowledge of at least one node in the list. Usually you would keep track of the first link in the list, but you could keep track of something else if you want.
When you display the list you don't want to change anything in the list, you just want to display the values stored in it. If you change the value of head as you display the list you will have to have some mechanism to remember what head really is pointing to before you do another function call. This adds another level of complexity to the program but would be doable if you insist. On the other hand, you wouldn't have to keep track of this new location if you have a policy saying head always points to the first link in the list so I will leave it alone when I display the list; instead I will use another abc pointer to run the list in the body of the function.
Stacks differ from doubly linked lists in that you are resticted by ensuring that the last link added is the first link removed. The easiest way to do this is to always add to the front of the list or to always add to the back of the list. If you always add/remove from the front of the list, then the address stored in head will have to change each time one of these operations is performed. If you always add/remove from the end of the list, then value in head may or may not change, depending on whether there is more than one link in the list or not. However, you will have to either keep track of the end of the list or run the list to find the end of the list every time you want to do one of these tasks. So pick your poison, state it clearly, and deal with it.
You also have some other decisions to make.
First you can use free standing functions to manipulate the stack as you do in the post, or you could create another class to encapsulate a stack. Each stack has variables, such as the first node in a linked list and the number of nodes in the list, and a number of methods that can manipulate the stack itself, such as add/remove a link, display link(s), etc. I think it makes sense to create a second class, but it's up to you.
Second, you can either declare your stack and the variables associated with your stack, like ctr, with global scope so it is accessable to all the functions that will use them---using global variables is frowned upon, OR you could declare them within main() and pass then back and forth among the various functions--which would be the prefered way. If you are passing them back and forth between freestanding functions, then you will want to pass the variables by reference to any function that could change the value of the variable, so any changes to the value in the variable is maintained after the function stops.