C基础--双链表的构造

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

void print_item(link p)
{
    printf("%d\n", 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("***************\n");
    link_travel_tail(&tail, print_item);    //遍历打印链表数值域
    printf("***************\n");

    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);
}
时间: 2024-10-26 11:09:33

C基础--双链表的构造的相关文章

双链表和循环链表

双链表定义 双链表就是在单链表结点上增添了一个指针域,指向当前结点的前驱.这样就可以方便的由其后继来找到其前驱,而实现输出终端结点到开始结点的数据序列. 同样,双链表也分为带头结点的双链表和不带头结点的双链表,情况类似于单链表.带头结点的双链表 head->next 为null的时候链表为空.不带头结点的双链表head为null的时候链表为空. 1.采用尾插法建立双链表 void CreateDlistR (DLNode *&L, int a[], int n){ DLNode*s,*r;

算法与数据结构基础7:C++双链表的简单实现

双链表在单链表的基础上加了一个指向前一个节点的指针. // DList.h #include <cstdio> #include <cassert> #include <iostream> using namespace std; class DList { public: // ************************************************************************** // 类的四大函数:构造函数.拷贝构造函数

线性表—双链表

1.基础知识 a.双链表结点的结构:其由前序元素地址,数据域,后继元素地址组成. b.双链表结点的连接方法:先声明该结点,可以在内部也可以利用其特性来表明前序结点和后继结点是什么,之后同时还需要说明"其前序结点的后继地址为该结点"和"其后继结点的前序地址为该结点.(本质:双向) 2.循环双链表的实现 线性表接口LList package com.clarck.datastructure.dlinked; /*** 线性表接口LList,描述线性表抽象数据类型,泛型参数T表示数

1216.1——双链表

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环链表. typedef struct node{ struct node *pre;   //前驱指针 int age; struct node *next;  //后驱指针 }Node; int main(int argc, const char * argv[]) { Node * phead =

java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制)

转载请注明出处(请尊重原创!谢谢~): http://blog.csdn.net/javazejian/article/details/53073995 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) ??这篇是数据结构与算法的第3篇,通过前两篇的介绍,对应顺序表和链表已有

java数据结构与算法之双链表设计与实现

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/53047590 出自[zejian的博客] 关联文章: 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) ??上一篇文章分析顺序表和单链表,本篇就接着上篇继续聊链表,在单链表

数据结构之自建算法库——循环双链表

本文针对数据结构基础系列网络课程(2):线性表中第13课时循环链表. 按照"0207将算法变程序"[视频]部分建议的方法,建设自己的专业基础设施算法库. 双链表算法库算法库采用程序的多文件组织形式,包括两个文件: 1.头文件:cdlinklist.h,包含定义双链表数据结构的代码.宏定义.要实现算法的函数的声明: #ifndef CDLINKLIST_H_INCLUDED #define CDLINKLIST_H_INCLUDED //循环双链表基本运算函数 typedef int E

C++ 双链表基本操作

上一篇博客主要总结了单向链表,这次再总结一下双向链表. 1.概念 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环链表. 结构图如下所示: 2.基本操作实例 DoubleList.cpp #include "stdafx.h" #include "DoubleList.h" #include <stdio.h>

实例讲解C++ 双链表基本操作

1.概念 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环链表. 结构图如下所示: 2.基本操作实例 DoubleList.cpp #include "stdafx.h" #include "DoubleList.h" #include <stdio.h> #include <malloc.h>