用C语言实现一个简单链表数据结构

/*
*  本程序实现了一个简单的单向链表,其中
*  (1)函数 first_insert()的功能是在已知链表的首表元之前插入一个指定值的表元
*  (2)函数 reverse_copy()的功能是把已知链表,按照逆序复制出一个新链表
*  (3)函数 print_link()用来输出链表中各表元的值
*  (4)函数 free_link()用来释放链表的全部表元
*   By linccn 2011.06.06
* */
#include <stdio.h>
#include <malloc.h>

typedef struct node{
    int val;
    struct node *next;
}NODE;

void first_insert(NODE ** p, int v)
{
    NODE *q = (NODE *)malloc(sizeof(NODE));
    q->val = v;
    q->next = *p;

    *p = q;
}

NODE *reverse_copy(NODE *p)
{
    NODE *u;
    for (u=NULL;p!=NULL;p=p->next)
        first_insert(&u, p->val);

    return u;
}

void print_link(NODE *p)
{
    for (;p!=NULL;p=p->next)
        printf("%d, ", p->val);
    printf("\n");
}

void free_link(NODE *p)
{
    NODE *u;
    while(p!=NULL){
        u = p->next;
        free(p);
        p = u;
    }
}

int main()
{
    NODE *link1, *link2;
    int i;
    link1 = NULL;
    for(i=1;i<10;++i)
        first_insert(&link1, i);

    link2 = reverse_copy(link1);
    print_link(link2);
    free_link(link1);
    free_link(link2);

    return 0;
}