//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;
}