C语言:链表的反向输出(反转链表+栈结构)

来源:互联网 发布:linux怎么退出编辑模式 编辑:程序博客网 时间:2024/04/30 01:08
/*链表的反向输出1.反转链表2.链表节点从头到尾入栈,在出栈*/# include <stdio.h># include <malloc.h># define SIZE 5  //初始定义链表的长度//定义节点typedef struct Node{int data;struct Node * pNext;}NODE, * PNODE;//定义栈typedef struct Stack{int * base;  //栈空间基址int * top;  //指向栈顶有效元素的下一个位置}Stack;void traverse(PNODE pHead);   //遍历链表void reverseTrans_reverse(PNODE pHead);   //反转链表void reverseTrans_stack(PNODE pHead);  //用栈反向输出链表Stack creat_stack();   //创建栈void push(Stack &s, int val);   //元素入栈  int main(void){int i, len, val;//创建链表PNODE pHead = (PNODE)malloc(sizeof(NODE));  //头结点PNODE pTail = pHead;    //尾节点PNODE pNew;  //新节点printf("创建链表的长度为:len = %d\n", SIZE);len = SIZE;for(i = 0; i < len; i++){printf("输入第%d个元素:", i+1);scanf("%d", &val);//创建新节点pNew = (PNODE)malloc(sizeof(NODE));pNew->data = val;pNew->pNext = NULL;//新节点添加在尾节点后面pTail->pNext = pNew;pTail = pNew;}//遍历链表traverse(pHead);//反向遍历链表, 从头到尾节点入栈,然后再出栈printf("用栈,反向输出链表:");reverseTrans_stack(pHead);//反向遍历链表,反转链表printf("反转链表:");reverseTrans_reverse(pHead);return 0;}void traverse(PNODE pHead){printf("遍历链表:");PNODE p = pHead->pNext;while(p != NULL){printf("%d ", p->data);p = p->pNext;}printf("\n");}//反转链表,并遍历void reverseTrans_reverse(PNODE pHead){//反向链表的头结点PNODE pRever = (PNODE)malloc(sizeof(NODE));pRever->pNext = NULL;PNODE p = pHead->pNext;PNODE mid = NULL;  //两个临时变量PNODE pTail;while(p != NULL){pTail = mid;mid = p;p = p->pNext;mid->pNext = pTail;}pRever->pNext = mid;traverse(pRever);}//根据栈,反向输出链表void reverseTrans_stack(PNODE pHead){int val;Stack s = creat_stack();  //创建栈PNODE p = pHead->pNext;while(p != NULL){push(s, p->data); //节点从头到尾如入栈p = p->pNext;}while(s.top != s.base)  //元素再出栈{s.top --;val = *(s.top);printf("%d ", val);}printf("\n");}//创建栈Stack creat_stack(){Stack s;s.base = (int *)malloc(sizeof(int) * SIZE); //分配栈空间s.top = s.base;return s;}//元素入栈void push(Stack &s, int val){if((s.top - s.base) > SIZE){printf("栈满!");return;}else{*(s.top) = val;s.top ++;}}

0 0
原创粉丝点击