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

单链表

  • 数据结构与算法
  • 发布于 2025-09-02
  • 9 次阅读
o
o
//list.h
#ifndef __LIST_H__
#define __LIST_H__
//节点
typedef struct node{
    int data;
    struct node* next;
}node_t;

//链表
typedef struct list{
    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__
//list.c
#include<stdio.h>
#include<stdlib.h>
#include"list.h"
void list_init(list_t *l){
    l->head = malloc(sizeof(node_t));
    l->tail = malloc(sizeof(node_t));
    l->head->next = l->tail;
    l->tail->next = NULL;
    l->head->data = 0;
    l->tail->data = 0;
}

void list_deinit(list_t *l){
    //备份头节点地址
    node_t* pnode = l->head;
    while(pnode != l->tail){
    //暂存下一节点地址
    node_t* tmp = pnode->next;
    //释放当前节点
    free(pnode);
    pnode = tmp;
    }
    l->head = NULL;
    l->tail = NULL;
}

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

void list_add_tail(list_t *l, int data){
    node_t* new = malloc(sizeof(node_t));
    new->data = data;
    new->next = NULL;
    //循环确定插入位置
    for(node_t* p = l->head;p!=l->tail;p = p->next){
        node_t* first = p;
        node_t* mid = first->next;
        if(mid == l->tail){
            first->next = new;
            new->next = mid;
            break;
        }
    }  
}

void list_add(list_t *l, int data){
    node_t* new = malloc(sizeof(node_t));
    new->data = data;
    new->next = 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;
            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;
        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<10;i++){
        static int data2 = 10;
        list_add(&list,data2);
        data2++;
        }
        for(int i = 0;i<7; i++){
            static int data = 9;
            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<3;i++){
            static int data = 16;
            list_del(&list, data);
            data--;
        }
    list_travel(&list);
    list_deinit(&list);
    return 0;
}