C递归实现单向链表的反转
2011-02-22 18:14
375 查看
/*
Code by : yxin1322
http://blog.csdn.net/yxin1322
Email: yxin1322@163.com
Date: 2005.1.14
*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
/*链表节点存储的数据*/
typedef char ElemType;
/*链表节点结构*/
typedef struct LinkListNode
{
ElemType data;
struct LinkListNode * next;
} *LinkList,*pNode,LinkListNode;
/*递归实现反转不带头节点的单向链表
pNode:PerNode 前一节点指针
pNode:CurrentNode 后一节点指针
visit 自定义节点访问函数
*/
LinkList ReverseLinkList( pNode PreNode, pNode CurrentNode, void(*visit)(ElemType e) )
{
if(!CurrentNode) /*如果当前节点指针为空,则返回NULL,此种情况只有在*/
return NULL; /*链表头指针为空时才可能执行到*/
if(!CurrentNode->next) /*如果下一节点指针为空,则将当前节点next指针指向上一节点,并*/
{ /*返回当前节点指针,次种情况只有在当前节点为尾节点时才能执行到*/
visit(CurrentNode->data);
CurrentNode->next=PreNode;
return CurrentNode;
}
else /*其他节点的情况,先调用递归函数反转后续节点,再反转当前节点*/
{ /*并将递归函数返回来的尾节点指针向上层函数返回*/
LinkList FirstNode;
FirstNode=ReverseLinkList(CurrentNode,CurrentNode->next,visit);
visit(CurrentNode->data);
CurrentNode->next=PreNode;
return FirstNode; /*返回的是尾节点的指针,即反转后新链表的头指针*/
}
}
/*自定义链表节点访问函数*/
void visit(ElemType e)
{
printf("process node %c/n",e);
}
/*打印链表*/
void PrintLinkList(LinkList PL)
{
printf("/n--------------------------/n");
while(PL)
{
printf("%c ",PL->data);
PL=PL->next;
}
printf("/n--------------------------/n");
}
/*用键盘输入初始化一个链表,参数为链表头指针地址*/
void InitializeLinkList(LinkList * Head)
{
pNode EndNode=*Head; /*总是指向链表最后一个节点*/
pNode TempNode=NULL; /*临时节点,存放当前输入的链表节点*/
int i=1; /*节点记数*/
char getEnter;
printf("please input characters of the linklist(end with Enter):/n");
/*开始构造不带头节点的单向链表*/
while(1)/*不停地循环接受字符*/
{
TempNode=(pNode)malloc(sizeof(LinkListNode)); /*为当前输入的链表节点分配空间*/
TempNode->next=NULL;
printf("Node[%d]:",i);
TempNode->data=getchar(); /*接受字符*/
if(TempNode->data=='/n') /*如果直接回车,则结束链表的输入*/
{
TempNode=NULL;
break;
}
getEnter=getchar(); /*接受输完字符后的回车*/
if(i==1) /*如果当前输入的是第一个节点,则让头指针指向它*/
{
*Head=TempNode;
EndNode=*Head;
}
EndNode->next=TempNode; /*将当前输入的节点接到链表尾端*/
EndNode=TempNode;
i++;
}
}
int main()
{
LinkList head=NULL; /*声明头指针*/
InitializeLinkList(&head); /*初始化链表*/
PrintLinkList(head); /*打印原链表*/
head=ReverseLinkList(NULL,head,visit); /*调用反转函数*/
PrintLinkList(head); /*打印反转后的链表*/
return 1;
}
注:非自己所写,转载他人
Code by : yxin1322
http://blog.csdn.net/yxin1322
Email: yxin1322@163.com
Date: 2005.1.14
*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
/*链表节点存储的数据*/
typedef char ElemType;
/*链表节点结构*/
typedef struct LinkListNode
{
ElemType data;
struct LinkListNode * next;
} *LinkList,*pNode,LinkListNode;
/*递归实现反转不带头节点的单向链表
pNode:PerNode 前一节点指针
pNode:CurrentNode 后一节点指针
visit 自定义节点访问函数
*/
LinkList ReverseLinkList( pNode PreNode, pNode CurrentNode, void(*visit)(ElemType e) )
{
if(!CurrentNode) /*如果当前节点指针为空,则返回NULL,此种情况只有在*/
return NULL; /*链表头指针为空时才可能执行到*/
if(!CurrentNode->next) /*如果下一节点指针为空,则将当前节点next指针指向上一节点,并*/
{ /*返回当前节点指针,次种情况只有在当前节点为尾节点时才能执行到*/
visit(CurrentNode->data);
CurrentNode->next=PreNode;
return CurrentNode;
}
else /*其他节点的情况,先调用递归函数反转后续节点,再反转当前节点*/
{ /*并将递归函数返回来的尾节点指针向上层函数返回*/
LinkList FirstNode;
FirstNode=ReverseLinkList(CurrentNode,CurrentNode->next,visit);
visit(CurrentNode->data);
CurrentNode->next=PreNode;
return FirstNode; /*返回的是尾节点的指针,即反转后新链表的头指针*/
}
}
/*自定义链表节点访问函数*/
void visit(ElemType e)
{
printf("process node %c/n",e);
}
/*打印链表*/
void PrintLinkList(LinkList PL)
{
printf("/n--------------------------/n");
while(PL)
{
printf("%c ",PL->data);
PL=PL->next;
}
printf("/n--------------------------/n");
}
/*用键盘输入初始化一个链表,参数为链表头指针地址*/
void InitializeLinkList(LinkList * Head)
{
pNode EndNode=*Head; /*总是指向链表最后一个节点*/
pNode TempNode=NULL; /*临时节点,存放当前输入的链表节点*/
int i=1; /*节点记数*/
char getEnter;
printf("please input characters of the linklist(end with Enter):/n");
/*开始构造不带头节点的单向链表*/
while(1)/*不停地循环接受字符*/
{
TempNode=(pNode)malloc(sizeof(LinkListNode)); /*为当前输入的链表节点分配空间*/
TempNode->next=NULL;
printf("Node[%d]:",i);
TempNode->data=getchar(); /*接受字符*/
if(TempNode->data=='/n') /*如果直接回车,则结束链表的输入*/
{
TempNode=NULL;
break;
}
getEnter=getchar(); /*接受输完字符后的回车*/
if(i==1) /*如果当前输入的是第一个节点,则让头指针指向它*/
{
*Head=TempNode;
EndNode=*Head;
}
EndNode->next=TempNode; /*将当前输入的节点接到链表尾端*/
EndNode=TempNode;
i++;
}
}
int main()
{
LinkList head=NULL; /*声明头指针*/
InitializeLinkList(&head); /*初始化链表*/
PrintLinkList(head); /*打印原链表*/
head=ReverseLinkList(NULL,head,visit); /*调用反转函数*/
PrintLinkList(head); /*打印反转后的链表*/
return 1;
}
注:非自己所写,转载他人
相关文章推荐
- java实现单向链表CRUD,反转,排序,查找倒数第k个元素,递归输出等操作
- C递归实现单向链表的反转
- C递归实现单向链表的反转
- 单向链表的倒序输出(栈实现和递归实现)
- 单链表反转(非递归java实现)
- Java实现单向链表反转
- 【补充】递归实现单向链表逆转
- java实现单链表反转(递归方式)
- 反转单向链表 (java 语言实现)
- 链表反转C实现(递归与循环)
- 单向链表的递归反转
- 单向链表遍历反转 Javascript实现
- C语言实现单向链表的反转
- 链表反转的实现(递归反转链表,非递归反转链表)
- 链表的反转(递归实现和非递归实现)
- Java实现单向链表反转
- 面试 考虑链表反转的递归实现
- 链表反转C实现(递归与循环)
- JAVA实现单向链表反转2
- 链表反转C实现(递归与循环)