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

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

         众所周知,链表作为线性表的一种实现方式,有插入删除方便的优点,但不能对节点进行随机访问.同时,要想知道某一节点的前驱节点,必须从头节点开始遍历才能找到,这体现了单链表的方向性.由于单链表方向性的存在,使得链表的反转变得复杂起来.
         在这里,采用递归的算法,可以使反转过程看起来更容易理解,代码如下:
1    
7
8    #include <stdio.h>
9    #include <stdlib.h>
10    #include <conio.h>
11
12    
13    typedef  ElemType;
14
15
16    
17    typedef  LinkListNode
18    {
19    	ElemType ;
20    	 LinkListNode * next;
21    } *LinkList,*pNode,LinkListNode;
22
23
24    
30    LinkList ReverseLinkList( pNode PreNode, pNode CurrentNode, (*visit)(ElemType e) )
31    {
32    	(!CurrentNode)				
33    		 ;			
34
35    	(!CurrentNode->next)			
36    	{					
37    		visit(CurrentNode->data);
38    		CurrentNode->next=PreNode;
39    		 CurrentNode;
40    	}
41    						
42    	{					
43    		LinkList FirstNode;
44
45    		FirstNode=ReverseLinkList(CurrentNode,CurrentNode->next,visit);
46
47    		visit(CurrentNode->data);
48    		CurrentNode->next=PreNode;
49    		 FirstNode;			
50    	}
51    }
52
53    
54     visit(ElemType e)
55    {
56    	printf(,e);
57    }
58
59
60    
61     PrintLinkList(LinkList PL)
62    {
63    	printf();
64    	(PL)
65    	{
66    		printf(,PL->data);
67    		PL=PL->next;
68    	}
69    	printf();
70    }
71
72    
73     InitializeLinkList(LinkList * Head)
74    {
75    	pNode EndNode=*Head;	
76
77    	pNode TempNode=;	
78    	 i=;			
79    	 getEnter;
80
81    	printf();
82
83    	
84    	()
85    	{
86    		TempNode=(pNode)malloc((LinkListNode));	
87    		TempNode->next=;
88
89    		printf(,i);
90    		TempNode->data=getchar();	
91
92
93    		(TempNode->data==  )	
94    		{
95    			TempNode=;
96    			;
97    		}
98    		getEnter=getchar();		
99
100    		(i==)				
101    		{
102    			*Head=TempNode;
103    			EndNode=*Head;
104    		}
105
106    		EndNode->next=TempNode;		
107    		EndNode=TempNode;
108
109    		i++;
110    	}
111    }
112
113     main()
114    {
115    	LinkList head=;			
116
117    	InitializeLinkList(&head);			
118
119    	PrintLinkList(head);			
120
121    	head=ReverseLinkList(,head,visit);	
122
123    	PrintLinkList(head);			
124
125    	 ;
126    }

转载于:https://www.cnblogs.com/yxin1322/archive/2008/03/08/1096692.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值