这几天正在温习一些根本的算法和完成,今日看了看递归的根本原理,发现自己对递归还不是特别清楚,特别是不清楚递归的思维,不能很精确的掌握先分解成小事情,在兼并的思维,其实也是数学概括法的程序表现,其实数学概括法是一种强壮的办法,记住高中的时分最喜欢做的标题便是数学概括方面的证明,现在想过来很多问题我不能选用这种方法考虑,可见常识真的是有联络的,仅仅咱们没有找到联络的方法罢了。
为了了解递归的思维,我尝试了选用递归的方法完成单向链表的根本操作。单向的链表是C言语课程中接触到的中比较杂乱的数据结构,可是他的确其他数据结构的根底,在一般情况下都是选用迭代的方式完成,迭代的方式比较递归要节省时间和空间,可是代码相对来说要杂乱,递归往往仅仅简略的几句代码,我首要是为了了解迭代,并不在功能上进行剖析。
根本的完成如下所示:
#include
#include
typedef struct listnode
{
int val;
struct listnode *next;
}List;
/*计算节点个数*/
int count_listnode(List *head)
{
static int count = 0;
if(NULL != head)
{
count += 1;
if(head->next != NULL)
{
count_listnode(head->next);
}
return count;
}
}
/*次序打印*/
void fdprint_listnode(List *head)
{
if(NULL != head)
{
printf(“%d “,head->val);
if(head->next != NULL)
{
fdprint_listnode(head->next);
}
}
}
/*反向打印*/
void bkprint_listnode(List *head)
{
if(head != NULL)
{
if(head->next != NULL)
{
bkprint_listnode(head->next);
}
printf(“%d “,head->val);
}
}
/*删去一个节点的数据为d的节点*/
List *delete_node(List * head, int d)
{
List *temp = head;
if(head != NULL)
{
if(head->val == d)
{
temp = head;
head = head->next;
free(temp);
temp = NULL;
}
else
{
temp = head->next;
if(temp != NULL)
{
temp = delete_node(temp,d);
head->next= temp;
}
}
}
return head;
}
/*删去一切val = d的节点*/
List* delete_allnode(List *head, int d)
{
List *temp = head, *cur = head;
if(head != NULL)
{
/*假如第一个便是需求删去的目标*/
if(cur->val == d)
{
temp = cur;
cur = cur->next;
free(temp);
temp = NULL;
temp = delete_allnode(cur, d);
head = temp;
}
else /*不是删去的目标*/
{
cur = head->next;
temp = delete_allnode(cur, d);
/*将得到的链表连接到检测的区域*/
head->next= temp;
}
}
return head;
}