《算法导论》中的伪码可以让我们更加关注算法本身而不是实现,是一种很优美的表达方式,比直接看代码要更直接,所以我自己也要慢慢学着写伪码。今天看到一个用递归实现的伪码,自己却不知不觉用C语言的实现去想,居然忘了那只是伪码,汗!在这里记上一笔,防止以后再犯类似的错误!
原版例子是关于递归实现二叉查找树的插入,现简化为递归插入元素到单链表。
伪代码如下:
insert(L,k)
if L = NIL then
key[L] <-- k
next[L] <-- NIL
else
insert(next[L],k)
很多人第一次接触类似的伪码,估计就会有这样的想法(我猜的,至少我曾经这样想过):
为什么 L 是NULL ,怎么还能用类似 " key[L] <-- k " 这样的语句?这样不会抛出 " NULL exception " 异常么?
下面的是实际的代码,看看有何不同吧!!
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int data;
struct node * next;
}link;
link * insert(link *lk, int k){
if(lk==NULL){
link * node =(link *)malloc(sizeof(link));
node->data=k;
node->next=NULL;
lk=node;
}else{
lk->next = insert(lk->next,k);
}
return lk;
}
void print_link(link *lk){
if(lk!=NULL){
printf("%d ",lk->data);
print_link(lk->next);
}else{
printf("\n");
}
}
void free_link(link* lk){
if(lk!=NULL){
free_link(lk->next);
free(lk);
lk=NULL;
}
}
int main(){
link *head=NULL;
int i;
for(i=0;i<5;i++){
head=insert(head,i);
}
print_link(head);
free_link(head);
return 0;
}
其实,具体实现时可以通过传递指针的指针,或者返回值来实现递归过程中对指针的改变!!!上例就是通过返回值来实现指针的修改!
虽然很简单,但是初学者容易不理解它。
(全文完)