用链表模拟栈机制倒序输出字符串,该如何处理

用链表模拟栈机制倒序输出字符串
    各位达人,下面这个程序用链表模拟栈机制倒序输出字符串,但不知问题在哪,麻烦指教!
// exercise 5, chapter 17

#include <stdio.h>
#include <stdlib.h>

typedef char Item;

typedef struct node
{
Item item;
struct node * next;
struct node * prev;
}Node;

typedef struct {
Node * head;
Node * tail;
}Stack;

int main(void)
{
char ch;
Stack stack;
Node * tmp;

stack.head = stack.tail = NULL;
puts("Enter a string:");
while((ch = getchar())!= '\n' && (ch = getchar()) != EOF)
{
tmp = (Node *) malloc(sizeof(Node));
tmp->item = ch;
if(tmp == NULL)
{
fputs("Failed to allocate memory.", stderr);
exit(1);
}
if(stack.head == NULL)
{
stack.head = tmp;
stack.head->prev = NULL;  //让第一个元素的前溯指针为NULL
}
else
{
stack.tail->next = tmp;
        tmp->prev = stack.tail; //让从第二个元素开始的前溯指针指向前一个元素
}
tmp->next = NULL;
stack.tail = tmp;
}
if(stack.head == NULL)
puts("No string entered.");
else
{
puts("String in reverse:");
tmp = stack.tail;
while(tmp != NULL)
{
putchar(tmp->item);
tmp = tmp->prev;
}
}

puts("\nDone!");
return 0;
}

------解决思路----------------------
直接倒序创建链表不就行了吗,要弄这么复杂吗?用链表模拟栈机制倒序输出字符串,该如何处理
倒序创建链表(仅供参考)
typedef struct node
{
int num;
struct node *next;
}NODE;
struct node *crfun(int n)
{
NODE* head=NULL;
NODE* p;
while(n)
{
p=(NODE*)malloc(sizeof(NODE));
scanf("%d",&p->num);
p->next=head;
head=p;
n--;
}
return p;
}