對於帶頭結點的單鏈表,利用遞歸實現(從尾到頭)逆序輸出結點的值


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

typedef int DataType;//元素類型為整型
typedef struct Node
{
    DataType Data;
    struct Node* Next;
}Node,*LinkList;

void InitList(LinkList* PHead)
{
    if ((*PHead = (LinkList)malloc(sizeof(Node))) == NULL)
    {
        printf("內存分配失敗.\n");
        return;
    }
    (*PHead)->Next = NULL;
}

//尾插法建表
void CreatFormTail(LinkList PHead)
{
    Node* s;
    Node* tail;
    DataType data;
    tail = PHead;

    printf("依次輸入元素,當輸入-1時停止\n");
    scanf("%d", &data);
    while (data != -1)
    {
        s = (Node*)malloc(sizeof(Node));
        s->Data = data;
        s->Next = tail->Next;
        tail->Next = s;
        tail = s;   //tail始終指向表尾
        scanf("%d", &data);
    }
}

//打印表中元素
void PrintList(LinkList PHead)
{
    printf("打印表中元素\n");
    Node* p;
    p = PHead->Next;
    while (p)
    {
        printf("%6d", p->Data);
        p = p->Next;
    }
    printf("\n");
}//遞歸逆序輸出
void printRevList(LinkList pHead){
    if (pHead->Next != NULL)
        printRevList(pHead->Next);

    //if(pHead!=NULL)
    printf("%6d", pHead->Data);

    
}

//帶頭結點的鏈表逆置
void Reverse(LinkList pHead)
{
    
    //以下兩種情況為線性表長度可能為0或1,即如果鏈表為空,或者鏈表中只有一個結點則不需要逆置
    if (pHead->Next == NULL || pHead->Next->Next == NULL)
    {
        return;
    }
    Node* p1 = pHead->Next;
    Node* pNext;
    //將頭結點與鏈表斷開,構成一個空鏈表
    pHead->Next = NULL;
    //當p1!=NULL時依次取鏈表中的結點插入到頭結點之后
    while (p1)
    {
        pNext = p1->Next;
        p1->Next = pHead->Next;
        pHead->Next = p1;
        p1 = pNext;
    }
}

int main()
{
    LinkList L;
    InitList(&L);
  
    CreatFormTail(L); //用尾插法建表
    PrintList(L);    //打印
  //  R_Print(&L);//從尾到頭打印單鏈表


    //printRevList(L);

    printf("下面是遞歸實現逆序輸出:\n");
    printRevList(L->Next);//遞歸調用逆序輸出;注意入口為第一個帶元素的結點
    printf("\n");
    
    printf("鏈表逆置中......\n\n");
    //鏈表逆置
    Reverse(L);
    //打印逆置后的鏈表中元素
    PrintList(L);
    system("pause");

    return 0;
}

/*
另一種
void R_Print(LinkList* pHead)
{
  //  assert(pHead);
    printf("從尾到頭反向輸出結點值:\n");
    Node* p1 = (*pHead)->Next;
    Node* Tail = NULL;
    while (p1!= Tail)
    {
        while (p1->Next != Tail)
        {
            p1 = p1->Next;
        }
        printf("%6d", p1->Data);
        Tail = p1;
        p1 = (*pHead)->Next;
    }
    printf("\n");
}
*/

 

測試結果如下


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM