关于伪代码

    《算法导论》中的伪码可以让我们更加关注算法本身而不是实现,是一种很优美的表达方式,比直接看代码要更直接,所以我自己也要慢慢学着写伪码。今天看到一个用递归实现的伪码,自己却不知不觉用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 
#include 

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;
}

其实,具体实现时可以通过传递指针的指针,或者返回值来实现递归过程中对指针的改变!!!上例就是通过返回值来实现指针的修改!

虽然很简单,但是初学者容易不理解它。

(全文完)

你可能感兴趣的:(算法和数据结构)