双向链表和单向链表的区别就是结构体里有一个指向前面结点的指针
List.h
#include<assert.h>
#include<stdio.h>
#include<stdlib.h>
typedef int DATATYPE;
typedef struct ListNode
{
DATATYPE _data;
struct ListNode* _prev;
struct ListNode* _next;
}ListNode;
typedef struct ListHead
{
ListNode* _head;
}ListHead;
void ListInit(ListHead* plist);
void ListPushBack(ListHead* plist, DATATYPE x);
void ListPopBack(ListHead* plist);
ListNode* ListCreate(DATATYPE x);
void ListPrint(ListHead* plist);
void ListPushFront(ListHead* plist, DATATYPE x);
void ListPopFront(ListHead* plist);
void ListInsert(ListNode* node, DATATYPE x);
List.c
#include<assert.h>
#include<stdio.h>
#include<stdlib.h>
typedef int DATATYPE;
typedef struct ListNode
{
DATATYPE _data;
struct ListNode* _prev;
struct ListNode* _next;
}ListNode;
typedef struct ListHead
{
ListNode* _head;
}ListHead;
void ListInit(ListHead* plist);
void ListPushBack(ListHead* plist, DATATYPE x);
void ListPopBack(ListHead* plist);
ListNode* ListCreate(DATATYPE x);
void ListPrint(ListHead* plist);
void ListPushFront(ListHead* plist, DATATYPE x);
void ListPopFront(ListHead* plist);
void ListInsert(ListNode* node, DATATYPE x);
test.c
#include"List.h"
int main()
{
ListHead _head;
ListInit(&_head);
ListPushBack(&_head, 1);
ListPushBack(&_head, 2);
ListPushBack(&_head, 3);
ListPushBack(&_head, 4);
ListPushBack(&_head, 5);
ListPrint(&_head);
ListPushFront(&_head, 0);
ListPrint(&_head);
ListPopFront(&_head);
ListPrint(&_head);
ListInsert(_head._head->_next, -1);
ListPrint(&_head);
system("pause");
return 0;
}