輸入一個連結串列的頭結點,從尾到頭反過來輸出每個結點的值。
阿新 • • 發佈:2019-01-24
對於這個問題,可以利用"棧"的後進先出的思想,將連結串列中的節點先入棧後再出棧,這樣就可以將連結串列從頭 到位翻轉過來。從網上搜索一下,沒有找到可以直接呼叫棧的的方法,因此要用C語言實現必須要先寫完棧的基本操作(入棧、出棧、初始化),幸好以前寫過一個棧的基本操作的原始碼,可以把它放到工程中。
head.h檔案
#ifndef HEAD_H_ #define HEAD_H_ #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <stdbool.h> #endif
stack.h檔案
#ifndef STACK_H_ #define STACK_H_ #include "head.h" typedef struct node { int data;//資料域 struct node *pNext;//指標域 }NODE, *PNODE; typedef struct stack { PNODE top; PNODE buttom; }STACK, *PSTACK; void initStack(PSTACK ps); void pushStack(PSTACK ps, int val); void traverse(PSTACK ps); bool empty(PSTACK ps); bool pop(PSTACK ps, int *pval); void clear(PSTACK ps); #endif
stack.c檔案
#include "stack.h" /**初始化棧**/ void initStack(PSTACK ps) { ps->top = (PNODE)malloc(sizeof(NODE)); if(NULL == ps->top) { printf("動態記憶體分配失敗\n"); exit(-1); } else { ps->top->pNext = NULL;//將棧頂指標指向的節點的指標域賦為空 ps->buttom = ps->top;//將棧頂指標付給棧底指標 } } /**入棧**/ void pushStack(PSTACK ps, int val)//在ps棧中壓入值val { PNODE pNew = (PNODE)malloc(sizeof(NODE)); pNew->data = val;//將要壓入的值賦給新申請的節點的資料域中 pNew->pNext = NULL;//將新申請的節點的指標賦為空 /////////////////////////////////////////////////// pNew->pNext = ps->top; ps->top = pNew; } /**遍歷**/ void traverse(PSTACK ps) { PNODE p; p = ps->top; while(p != ps->buttom) { printf("%d ",p->data); p = p->pNext; } printf("\n"); } /**判空**/ bool empty(PSTACK ps) { if(ps->top == ps->buttom) return true; else return false; } /**出棧**/ bool pop(PSTACK ps, int *pval) { PNODE rm; if(empty(ps)) return false; else { rm = ps->top; *pval = rm->data; ps->top = rm->pNext; free(rm); rm = NULL;//當不在使用申請的記憶體時,記得釋放。釋放後應該把指向這塊記憶體的指標指向NULL //以防程式後面不小心使用它。 return true; } } /**清空棧**/ void clear(PSTACK ps) { PNODE p = ps->top; PNODE q = NULL; while(p != ps->buttom) { q = p->pNext; free(p);//釋放p所指向的用函式malloc所申請的空間 p = q; } ps->top = ps->buttom; }
main函式
#include "head.h"
#include "stack.h"
typedef struct Lnode
{
int data;
struct Lnode *pNode;
}Node, *PNode;
int main()
{
STACK stack;
PNode pHead, p,p1;
int i,save,num;
pHead = (PNode)malloc(sizeof(Node));
pHead->pNode = NULL;
p = pHead;
printf("請輸入連結串列的節點個數:\n");
scanf("%d\n",&num);
for(i = 0; i < num;i++)
{
p1 = (PNode)malloc (sizeof(Node));
p1->pNode = NULL;
scanf("%d",&p1->data);
p->pNode = p1;
p = p1;
}
p = pHead->pNode;
while(p != NULL)
{
printf("%d",p->data);
p = p->pNode;
}
initStack(&stack);
p = pHead->pNode;
while(p != NULL)
{
pushStack(&stack,p->data);
p = p->pNode;
}
printf("\n");
for(i = 0;i < num; i ++)
{
pop(&stack, &save);
printf("%d",save);
}
return 0;
}