//数据结构C语言版(清华大学_唐国民_第3版) //栈的顺序存储,书 P55 例子3.2.4 顺序栈逆置带头结点的单链表,与书上代码有些许出入,不用在意,重要的是思路 #include#include #define Maxsize 100 typedef struct SNode* Stack; typedef struct Node* Link; struct SNode{ int Data[Maxsize]; int Top; }; struct Node{ int Data; Link Next; }; Stack StackCreate(); void Push(Stack,Link); int Pop(Stack); Link LinkCreate(); void LinkInput(Link); void LinkPrint(Link); void LinkReverse(Stack,Link); int main() { Stack s; Link Ptrl; s = StackCreate(); Ptrl = LinkCreate(); printf("Please input these numbers in order to set a link(end with 0).n"); LinkInput(Ptrl); printf("The established link's numbers are as follows:n"); LinkPrint(Ptrl); Push(s,Ptrl); LinkReverse(s,Ptrl); printf("The reversed link's numbers are as follows:n"); LinkPrint(Ptrl); return 0; } Stack StackCreate() { Stack s; s = (Stack)malloc(sizeof(struct SNode)); s->Top = -1; } Link LinkCreate() { Link Ptrl; Ptrl = (Link)malloc(sizeof(struct Node)); Ptrl->Next = NULL; } void LinkInput(Link Ptrl) { Link New,p; int data; p = Ptrl; scanf("%d",&data); while(data != 0){ New = (Link)malloc(sizeof(struct Node)); New->Data = data; New->Next = p->Next; p->Next = New; p = New; scanf("%d",&data); } } void LinkPrint(Link Ptrl) { Link p; p = Ptrl->Next; while(p!= NULL){ printf("%dt",p->Data); p = p->Next; } putchar('n'); } void Push(Stack s, Link Ptrl) { Link p; p = Ptrl->Next; if(s->Top == Maxsize-1){ printf("The stack overflows.n"); return; } else{ while(p != NULL){ s->Data[++s->Top] = p->Data; p = p->Next; } } } int Pop(Stack s) { int i; if(s->Top == -1){ printf("The stack is empty!n"); } else{ i = s->Data[s->Top--]; return i; } } void LinkReverse(Stack s ,Link Ptrl){ Link p; p = Ptrl->Next; while(p != NULL && s->Top != -1){ p->Data = Pop(s); p = p->Next; } }



