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

  • 5
  • 0
  • 约3.34千字
  • 约 2页
  • 2023-12-05 发布于中国
  • 举报
C递归实现单向链表的反转 C递归实现单向链表的反转 众所周知,链表作为线性表的⼀种实现⽅式,有插⼊删除⽅便的优点,但不能对节点进⾏随机访问.同时,要想知道某⼀节点的前驱节点,必须从头节点开始遍历才能找到,这体现了单链表 的⽅向性.由于单链表⽅向性的存在,使得链表的反转变得复杂起来. 在这⾥,采⽤递归的算法,可以使反转过程看起来更容易理解,代码如下: 1 /* 2 Code by : EricYou 3     Date: 2006.1.14 5   6 */ 7 8 #include stdio.h 9 #include stdlib.h 10 #include conio.h 11 12 /*链表节点存储的数据*/ 13 typedef char ElemType; 14 15 16 /*链表节点结构*/ 17 typedef struct LinkListNode 18 { 19 ElemType data ; 20 struct LinkListNode * next; 21 } *LinkList,*pNode,LinkListNode; 22 23 24 /*递归实现反转不带头节点的单向链表 25 26 pNode:PerNode 前⼀节点指针 27 pNode:CurrentNode 后⼀节点指针 28 visit ⾃定义节点访问函数 29 */ 30 LinkList ReverseLinkList( pNode PreNode, pNode CurrentNode, void(*visit)(ElemType e) ) 31 { 32 if(!CurrentNode) /*如果当前节点指针为空,则返回NULL,此种情况只有在*/ 33 return NULL; /*链表头指针为空时才可能执⾏到*/ 34 35 if(!CurrentNode-next) /*如果下⼀节点指针为空,则将当前节点next指针指向上⼀节点,并*/ 36 { /*返回当前节点指针,次种情况只有在当前节点为尾节点时才能执⾏到*/ 37 visit(CurrentNode-data); 38 CurrentNode-next=PreNode; 39 return CurrentNode; 40 } 41 else /* 其他节点的情况,先调⽤递归函数反转后续节点,再反转当前节点*/ 42 { /*并将递归函数返回来的尾节点指针向上层函数返回*/ 43 LinkList FirstNode; 44 45 FirstNode=ReverseLinkList(CurrentNode,CurrentNode-next,visit); 46 47 visit(CurrentNode-data); 48 CurrentNode-next=PreNode; 49 return FirstNode; /*返回的是尾节点的指针,即反转后新链表的头指针*/ 50 } 51 } 52 53 /* ⾃定义链表节点访问函数*/ 54 void visit(ElemType e) 55 { 56 printf(process node %c\n,e); 57 } 5 59 60 /*打印链表*/ 61 void PrintLinkList(LinkList PL) 62 { 63 printf(\n\n); 64 while(PL) 65 { 66 printf(%c ,PL-data); 67 PL=PL-next; 68 } 69 printf(\n\n); 70 } 71 72 /*⽤键盘输⼊初始化⼀个链

文档评论(0)

1亿VIP精品文档

相关文档