C基础--双链表的构造

#include <stdio.h>
#include "link.h"

void print_item(link p)
{
    printf("%d
", p->item);
}
int main(void)
{
    link head, tail, p;        //struct node *head;
    link_init(&head, &tail);        //head => NULL

    p = make_node(3);
    link_insert(&head, &tail, p);    //头插法
    p = make_node(5);
    link_insert(&head, &tail, p);    //头插法
    p = make_node(1);
    link_insert(&head, &tail, p);    //头插法
    p = make_node(8);
    link_insert(&head, &tail, p);    //头插法

    link_travel_head(&head, print_item);    //遍历打印链表数值域
    printf("***************
");
    link_travel_tail(&tail, print_item);    //遍历打印链表数值域
    printf("***************
");

    p = link_search(&head, 1);
    if (p != NULL) {
        link_delete(&head, &tail, p);
        free_node(p);
    }
    link_travel_tail(&tail, print_item);    //遍历打印链表数值域
    link_destory(&head, &tail);

    return 0;
}
#ifndef _LINK_H_
#define _LINK_H_
typedef struct node *link;
struct node {
    int item;
    link next;        //struct node *next; 后继
    link pre;        //struct node *pre; 前驱
};

void link_init(link *head, link *tail);
link make_node(int item);
void link_insert(link *head, link *tail, link p);
link link_search(link *head, int key);
void link_delete(link *head, link *tail, link p);
void free_node(link p);
void link_modfie(link p, int key);
void link_destory(link *head, link *tail);
void link_travel_head(link *head, void (*vist)(link));
void link_travel_tail(link *tail, void (*vist)(link));

#endif
#include <stdio.h>
#include <stdlib.h>
#include "link.h"

void link_init(link *head, link *tail)        //struct node **head = &head
{
    //head = NULL;
    *head = *tail = NULL;
}
link make_node(int item)
{
    //link p = (link *)malloc(sizeof(struct node));
    link p = (link)malloc(sizeof(*p));
    p->item = item;                //(*p).itme = item;
    p->next = NULL;                //#define NULL (void *)0
    p->pre = NULL;                //#define NULL (void *)0
    return p;
}
void link_insert(link *head, link *tail, link p)        //头插法
{
    link q; 
    if (*head == NULL) {
        *head = p;
        *tail = p;
        return;
    }

    p->next = *head;
    (*head)->pre = p;
    *head = p;
}
link link_search(link *head, int key)
{
    link p;
    for (p = *head; p != NULL; p = p->next)
        if (p->item == key)
            return p;
    return NULL;
}
void link_delete(link *head, link *tail, link q)
{
    link p;
    if (q == *head) {
        *head = q->next;
        (*head)->pre = NULL;
        return;
    }
    if (q == *tail) {
        *tail = q->pre;
        (*tail)->next = NULL;
        return;
    }
    q->pre->next = q->next;
    q->next->pre = q->pre;
}
void free_node(link p)
{
    free(p);
}
void link_modfie(link p, int key)
{
    p->item = key;
}
void link_destory(link *head, link *tail)
{
    link p= *head, q;
    while (p != NULL) {
        q = p->next;
        free(p);
        p = q;
    }
    *head = NULL; *tail = NULL;
}
void link_travel_head(link *head, void (*vist)(link))
{
    link p;
    for (p = *head; p != NULL; p = p->next)
        vist(p);
}
void link_travel_tail(link *tail, void (*vist)(link))
{
    link p;
    for (p = *tail; p != NULL; p = p->pre)
        vist(p);
}
原文地址:https://www.cnblogs.com/zhuyaguang/p/4840967.html