zoukankan      html  css  js  c++  java
  • 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);
    }
  • 相关阅读:
    git取消文件跟踪
    servlet
    查杀端口进程
    初始化git仓库,并push到远端
    tomcat
    bootstrap
    idea中web工程错误
    i++和++i
    js算法
    编程工具
  • 原文地址:https://www.cnblogs.com/zhuyaguang/p/4840967.html
Copyright © 2011-2022 走看看