2008年10月16日星期四

单链表:打印,测长,建立,节点插入,节点删除,逆置

#include <stdio.h> 
#include <stdlib.h> 

typedef struct link { 
    int data; 

    struct link *next; 
}node; 

void print_link(node *head) 
{ 
    printf("the link:\n"); 

    while (head) { 
        printf("%d ", head->data); 
        head = head->next; 
    } 

    printf("\n"); 
} 

int length_link(node *head) 
{ 
    int len = 0; 

    while (head) { 
        len++; 
        head = head->next; 
    } 

    return len; 
} 

node * delete_node(node *head, int data) 
{ 
    node *p, *q; 

    if (!head) 
        return head; 

    p = head; 

    if (head->data == data) { 
        head = head->next; 
        free(p); 
        return head; 
    } 

    while (p->next) { 
        q = p->next; 

        if (q->data == data) { 
            p->next = q->next; 
            free(q); 
            return head; 
        } 

        p = q; 
    } 

    return head; 
} 

node *insert_node(node *head, int data) 
{ 
    node *p, *s, *q; 

    s = (node*)malloc(sizeof(node)); 
    s->data = data; 

    if (!head) { 
        head = s; 
        head->next = NULL; 
        return head; 
    } 

    p = head; 

    q = NULL; 

    while (p && data >= p->data) { 
        q = p; 
        p = p->next; 
    } 

    if (!q) { 
        s->next = head; 
        head = s; 

    } else { 
        q->next = s; 
        s->next = p; 
    } 

    return head; 
} 

node * creat_link(void) 
{ 
    node *head = NULL; 
    int data; 

    while (1) { 
        printf("insert a num:"); 
        scanf("%d", &data); 

        if (data == 0) break; 

        head = insert_node(head, data); 
    } 

    return head; 
} 

node * reverse_link(node *head) 
{ 
    node *p, *q, *r; 

    if (!head || !head->next) 
        return head; 

    p = head; 

    q = head->next; 

    while (q) { 
        r = q->next; 
        q->next = p; 
        p = q; 
        q = r; 
    } 

    head->next = NULL; 

    return p; 
} 

int main(void) 
{ 
    printf("creat a link:\n"); 
    node *head = creat_link(); 
    print_link(head); 

    printf("link length:%d\n", length_link(head)); 

    printf("delete a node 3:\n"); 
    head = delete_node(head, 3); 
    print_link(head); 

    printf("insert a node 3:\n"); 
    head = insert_node(head, 3); 
    print_link(head); 

    printf("reverse link:\n"); 
    head = reverse_link(head); 
    print_link(head); 

    return 0; 
} 

没有评论:

发表评论