o Logo
首页
反馈
o Logo
首页 反馈
  1. 首页
  2. 数据结构与算法
  3. 双链表

双链表

  • 数据结构与算法
  • 发布于 2025-09-03
  • 7 次阅读
o
o
#ifndef __LIST_H__
#define __LIST_H__
typedef struct node{
    int data;
    struct node* next;
    struct node* prev;
}node_t;
typedef struct {
    node_t head;
    node_t tail;
}list_t;
//初始化
void list_init(list_t* l);
//释放
void list_deinit(list_t* l);
//头插入
void list_add_head(list_t* l,int data);
//尾插入
void list_add_tail(list_t* l,int data);
//顺序
void list_add(list_t* l,int data);
//删除节点
void list_del(list_t* l,int data);
//遍历
void list_travel(list_t* l);
#endif //__LIST_H__
#include<stdio.h>
#include<stdlib.h>
#include"list.h"
void list_init(list_t *l){
    l->head.next = &l->tail;
    l->head.prev = NULL;
    l->tail.next = NULL;
    l->tail.prev = &l->head;
    l->head.data = 0;
    l->tail.data = 0;
}
void list_deinit(list_t *l){
    while (l->head.next != &l->tail){
    node_t* first = &l->head;
    node_t* mid = first->next;
    node_t* last = mid->next;
    free(mid);
    first->next = last;
    last->prev = first;
    }
}

void list_add_head(list_t *l, int data){
    node_t* new = malloc(sizeof(node_t));
    new->data = data;
    new->next = NULL;
    new->prev = NULL;
    node_t* mid = l->head.next;
    l->head.next = new;
    new->next = mid;
    new->prev = &l->head;
    mid->prev = new;  
}

void list_add_tail(list_t *l, int data){
    node_t* new = malloc(sizeof(node_t));
    new->data = data;
    new->next = NULL;
    new->prev = NULL;
    node_t* mid = l->tail.prev;
    l->tail.prev = new;
    new->prev = mid;
    new->next = &l->tail;
    mid->next = new; 
}

void list_add(list_t *l, int data){
    node_t* new = malloc(sizeof(node_t));
    new->data = data;
    new->next = NULL;
    new->prev = NULL;
    for(node_t* p = &l->head;p != &l->tail;p = p->next) {
    node_t* first = p;
    node_t* mid = first->next;
    if((new->data < mid->data) || (mid == &l->tail)){
        first->next = new;
        new->next = mid;
        new->prev = first;
        mid->prev = new;
        break;
    }
    }
}

void list_del(list_t *l, int data){
    for(node_t* p = &l->head;p != &l->tail;p = p->next) {
    node_t* first = p;
    node_t* mid = first->next;
    node_t* last = mid->next;
    if (mid->data == data) {
    free(mid);
    first->next = last;
    last->prev = first;
    break;
    }
    }
}

void list_travel(list_t *l){
    for (node_t* p = l->head.next;p != &l->tail;p = p->next) {
    printf("%d\n",p->data);
    }
}
#include<stdio.h>
#include"list.h"
int main(void){
    list_t list;
    list_init(&list);
    for(int i=0;i<5;i++){
        static int data = 10;
        list_add_head(&list,data);
        data--;
    }
        for(int i=0;i<5;i++){
        static int data = 20;
        list_add_tail(&list,data);
        data++;
    }
    for(int i=0;i<5;i++){
        static int data = 1;
        list_add(&list,data);
        static int data2 = 30;
        list_add(&list,data2);
        data++;
        data2--;
    }
    for(int i=0; i<5;i++){
        static int data = 10;
        list_del(&list,data);
        data--;
    } 
    list_travel(&list);
    list_deinit(&list);
    return 0;
}