C递归实现单向链表的反转

来源:互联网 发布:moto360怎么同步软件 编辑:程序博客网 时间:2024/05/18 03:43

  1. /*
  2.          Code by : yxin1322
  3.                  http://blog.csdn.net/yxin1322
  4.                 Email: yxin1322@163.com
  5.                  Date: 2005.1.14
  6. */
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <conio.h>
  10. /*链表节点存储的数据*/
  11. typedef char ElemType;
  12. /*链表节点结构*/
  13. typedef struct LinkListNode
  14. {
  15.         ElemType data;
  16.         struct LinkListNode * next;
  17. } *LinkList,*pNode,LinkListNode;
  18. /*递归实现反转不带头节点的单向链表
  19.                 pNode:PerNode                        前一节点指针
  20.                 pNode:CurrentNode                后一节点指针
  21.                 visit                                        自定义节点访问函数
  22. */
  23. LinkList ReverseLinkList( pNode PreNode, pNode CurrentNode, void(*visit)(ElemType e) )
  24. {
  25.         if(!CurrentNode)                                /*如果当前节点指针为空,则返回NULL,此种情况只有在*/
  26.                 return NULL;                                /*链表头指针为空时才可能执行到*/
  27.         if(!CurrentNode->next)                        /*如果下一节点指针为空,则将当前节点next指针指向上一节点,并*/
  28.         {                                                        /*返回当前节点指针,次种情况只有在当前节点为尾节点时才能执行到*/
  29.                 visit(CurrentNode->data);
  30.                 CurrentNode->next=PreNode;
  31.                 return CurrentNode;
  32.         }
  33.         else                                                        /*其他节点的情况,先调用递归函数反转后续节点,再反转当前节点*/
  34.         {                                                        /*并将递归函数返回来的尾节点指针向上层函数返回*/
  35.                 LinkList FirstNode;
  36.                 FirstNode=ReverseLinkList(CurrentNode,CurrentNode->next,visit);
  37.                 visit(CurrentNode->data);
  38.                 CurrentNode->next=PreNode;
  39.                 return FirstNode;                        /*返回的是尾节点的指针,即反转后新链表的头指针*/
  40.         }
  41. }
  42. /*自定义链表节点访问函数*/
  43. void visit(ElemType e)
  44. {
  45.         printf("process node %c/n",e);
  46. }
  47. /*打印链表*/
  48. void PrintLinkList(LinkList PL)
  49. {
  50.         printf("/n--------------------------/n");
  51.         while(PL)
  52.         {
  53.                 printf("%c  ",PL->data);
  54.                 PL=PL->next;
  55.         }
  56.         printf("/n--------------------------/n");
  57. }
  58. /*用键盘输入初始化一个链表,参数为链表头指针地址*/
  59. void InitializeLinkList(LinkList * Head)
  60. {
  61.         pNode EndNode=*Head;        /*总是指向链表最后一个节点*/
  62.         pNode TempNode=NULL;        /*临时节点,存放当前输入的链表节点*/
  63.         int i=1;                                /*节点记数*/
  64.         char getEnter;
  65.         printf("please input characters of the linklist(end with Enter):/n");
  66.         /*开始构造不带头节点的单向链表*/
  67.         while(1)/*不停地循环接受字符*/
  68.         {
  69.                 TempNode=(pNode)malloc(sizeof(LinkListNode));        /*为当前输入的链表节点分配空间*/
  70.                 TempNode->next=NULL;
  71.         
  72.                 printf("Node[%d]:",i);
  73.                 TempNode->data=getchar();        /*接受字符*/
  74.         
  75.                 if(TempNode->data=='/n')        /*如果直接回车,则结束链表的输入*/
  76.                 {
  77.                         TempNode=NULL;
  78.                         break;
  79.                 }
  80.                 getEnter=getchar();                        /*接受输完字符后的回车*/
  81.                 if(i==1)                                        /*如果当前输入的是第一个节点,则让头指针指向它*/
  82.                 {
  83.                         *Head=TempNode;
  84.                         EndNode=*Head;                
  85.                 }
  86.                 EndNode->next=TempNode;                /*将当前输入的节点接到链表尾端*/
  87.                 EndNode=TempNode;
  88.                 
  89.                 i++;
  90.         }
  91. }
  92. int main()
  93. {
  94.         LinkList head=NULL;                                        /*声明头指针*/
  95.         InitializeLinkList(&head);                                /*初始化链表*/
  96.         PrintLinkList(head);                                        /*打印原链表*/
  97.         head=ReverseLinkList(NULL,head,visit);        /*调用反转函数*/
  98.         PrintLinkList(head);                                        /*打印反转后的链表*/
  99.         return 1;
  100. }

 

 

注:非自己所写,转载他人

原创粉丝点击