1. 程式人生 > >輸入一個連結串列的頭結點,從尾到頭反過來輸出每個結點的值。

輸入一個連結串列的頭結點,從尾到頭反過來輸出每個結點的值。

對於這個問題,可以利用"棧"的後進先出的思想,將連結串列中的節點先入棧後再出棧,這樣就可以將連結串列從頭 到位翻轉過來。從網上搜索一下,沒有找到可以直接呼叫棧的的方法,因此要用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;
}