宁武皇仁光九年锦文轩刻本《异闻录》载: 扶桑画师浅溪,居泰安,喜绘鲤。院前一方荷塘,锦鲤游曳,溪常与嬉戏。 其时正武德之乱,潘镇割据,战事频仍,魑魅魍魉,肆逆于道。兵戈逼泰安,街邻皆逃亡,独溪不舍锦鲤,未去。 是夜,院室倏火。有人入火护溪,言其本鲤中妖,欲取溪命,却生情愫,遂不忍为之。翌日天明,火势渐歇,人已不见。 溪始觉如梦,奔塘边,但见池水干涸,莲叶皆枯,塘中鲤亦不知所踪。 自始至终,未辨眉目,只记襟上层迭莲华,其色魅惑,似血着泪。 后有青岩居士闻之,叹曰:魑祟动情,必作灰飞。犹蛾之投火耳,非愚,乃命数也。 ————《锦鲤抄》

对于带头结点的单链表,利用递归实现(从尾到头)逆序输出结点的值

#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");
}
*/

 

测试结果如下

posted @ 2020-09-23 23:05  哒布溜  阅读(1696)  评论(0编辑  收藏  举报