1 main.c
#include "double_list.h"
int main()
{
node_p H = create_double();
insert_head(H,19);
insert_head(H,67);
show(H);
dele_head(H);
show(H);
insert_tail(H,99);
show(H);
dele_tail(H);
show(H);
insert_pos(H,200,1);
show(H);
insert_pos(H,100,5);
dele_pos(H,1);
show(H);
return 0;
}
2 double_list.c
#include "double_list.h"
//创建双向链表
node_p create_double()
{
node_p H = (node_p)malloc(sizeof(node));
if (H==NULL)
{
printf("空间申请失败\n");
return NULL;
}
H->prev = NULL;
H->next = NULL;
H->data = 0;
return H;
}
//创建结点
node_p create_node(int data)
{
node_p new = (node_p)malloc(sizeof(node));
if(new==NULL)
{
printf("空间申请失败\n");
return NULL;
}
new->data = data;
return new;
}
//判空
int empty_double(node_p H)
{
//入参合理性检查
if(H==NULL)
{
printf("入参为空\n");
return -1;
}
return H->next==H?1:0;
}
//头插
void insert_head(node_p H,int data)
{
//入参合理性检查
if(H==NULL)
{
printf("入参为空\n");
return;
}
node_p new = create_node(data);
new->next = H->next;
if(H->next!=NULL) //防止头结点后面没有结点,发生段错误
{
H->next->prev = new;
}
new->prev = H;
H->next = new;
H->data++;
}
//头删
void dele_head(node_p H)
{
//入参合理性检查
if(H==NULL)
{
printf("入参为空\n");
return;
}
//只有头结点的情况
if(H->next == NULL)
{
printf("只有头结点,不可删除\n");
return;
}
//链表中只有一个结点的情况
node_p del = H->next;
if(H->next->next == NULL)
{
H->next = NULL;
H->prev = NULL;
free(del);
}
//链表中结点大于1的情况
H->next->next->prev = H;
H->next = H->next->next;
free(del);
H->data--;
}
//尾插
void insert_tail(node_p H,int data)
{
//入参合理性检查
if(H==NULL)
{
printf("入参为空\n");
return;
}
node_p new = create_node(data);
node_p p = H;
while(p->next!=NULL) //H->next==NULL时不执行
{
p=p->next;
}
new->next = p->next;
new->prev = p;
p->next = new;
H->data++;
}
//尾删
void dele_tail(node_p H)
{
//入参合理性检查
if(H==NULL)
{
printf("入参为空\n");
return;
}
if(empty_double(H))
{
printf("表为空\n");
return;
}
node_p p = H;
while(p->next->next!=NULL) //找到倒数第二个结点
{
p=p->next;
}
node_p del = p->next;
p->next = p->next->next;
free(del);
H->data--;
}
//按位置插入
void insert_pos(node_p H,int data,int pos)
{
//入参合理性检查
if(H==NULL)
{
printf("入参为空\n");
return;
}
//检查pos值合理性
if (pos <= 0 || pos > H->data+1)
{
printf("pos值不合理\n");
return;
}
int i = 0;
node_p p = H;
for(i=0;i<pos-1;i++)
{
p=p->next;
}
node_p new = create_node(data);
new->next = p->next;
if(p->next!=NULL) //防止p->next==NULL时,发生段错误
{
p->next->prev = new;
}
new->prev = p;
p->next = new;
H->data++;
}
//按位置删除
void dele_pos(node_p H,int pos)
{
//入参合理性检查
if(H==NULL)
{
printf("入参为空\n");
return;
}
//检查pos值合理性
if (pos <= 0 || pos > H->data)
{
printf("pos值不合理\n");
return;
}
node_p p = H; //让指针从头结点出发
for(int i=0;i<pos-1;i++)
{
p=p->next;
}
node_p del = p->next; //保存要删除的结点
p->next->next->prev = p;
p->next = p->next->next;
free(del);
H->data--;
}
//输出
void show(node_p H)
{
//入参合理性检查
if(H==NULL)
{
printf("入参为空\n");
return;
}
//判空
if(empty_double(H))
{
printf("链表为空\n");
return;
}
node_p p = H->next;
while(p!=NULL)
{
printf("%d->",p->data);
p = p->next;
}
printf("NULL\n");
}
3 double_list.h
#ifndef __DOUBLE_LIST_H__
#define __DOUBLE_LIST_H__
#include <stdlib.h>
#include <stdio.h>
typedef struct node
{
int data;
struct node *prev;
struct node *next;
}node,*node_p;
#include "double_list.h"
//创建双向链表
node_p create_double();
//创建结点
node_p create_node(int data);
//判空
int empty_double(node_p H);
//头插
void insert_head(node_p H,int data);
//头删
void dele_head(node_p H);
//尾插
void insert_tail(node_p H,int data);
//尾删
void dele_tail(node_p H);
//按位置插入
void insert_pos(node_p H,int data,int pos);
//按位置删除
void dele_pos(node_p H,int pos);
//输出
void show(node_p H);
#endif
运行结果: