头文件
List.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef int LDataType;
typedef struct ListNode {
LDataType val;
struct ListNode* prev;
struct ListNode* next;
}ListNode;
void ListPrint(ListNode* phead);
ListNode* LTInit();
void LTDestroy(ListNode* phead);
bool LTEmpty(ListNode* phead);
void LTPushBack(ListNode* phead, LDataType x);
void LTPushFront(ListNode* phead, LDataType x);
void LTPopBack(ListNode* phead);
void LTPopFront(ListNode* phead);
ListNode* LTFind(ListNode* phead, LDataType x);
void LTInsert(ListNode* pos, LDataType x);
实现文件
List.c
#define _CRT_SECURE_NO_WARNINGS 1
#include<string.h>
#include"List.h"
void ListPrint(ListNode* phead)
{
ListNode* pcur = phead->next;
while (pcur != phead)
{
printf("%d->", pcur->val);
pcur = pcur->next;
}
printf("\n");
}
ListNode* LTInit()
{
ListNode* phead = (ListNode*)malloc(sizeof(ListNode));
if (phead == NULL) {
perror("malloc fail!\n");
exit(1);
}
phead->prev = phead;
phead->next = phead;
return phead;
}
ListNode* BuyNode(LDataType x)
{
ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));
if (newnode == NULL) {
perror("malloc fail!\n");
exit(1);
}
newnode->val = x;
newnode->next = newnode;
newnode->next = newnode;
return newnode;
}
void LTDestroy(ListNode* phead)
{
ListNode* pcur = phead->next;
while (pcur != phead)
{
ListNode* next = phead->next;
free(phead);
phead = next;
}
free(phead);
}
bool LTEmpty(ListNode* phead)
{
bool judge = (phead->next == phead);
return judge;
}
void LTPushBack(ListNode* phead, LDataType x)
{
assert(phead);
ListNode* newnode = BuyNode(x);
ListNode* pcur = phead->prev;
newnode->next = phead;
newnode->prev = pcur;
phead->prev = newnode;
pcur->next = newnode;
}
void LTPushFront(ListNode* phead, LDataType x)
{
assert(phead);
ListNode* newnode = BuyNode(x);
ListNode* pcur = phead->next;
newnode->prev = phead;
newnode->next = pcur;
phead->next = newnode;
pcur->prev = newnode;
}
void LTPopBack(ListNode* phead)
{
assert(phead);
assert(phead->next != phead);
ListNode* prev = phead->prev;
prev->prev->next = phead;
phead->prev = prev->prev;
free(prev);
prev = NULL;
}
void LTPopFront(ListNode* phead)
{
assert(phead);
assert(phead->next != phead);
ListNode* next = phead->next;
phead->next = next->next;
next->next->prev = phead;
free(next);
next = NULL;
}
ListNode* LTFind(ListNode* phead, LDataType x)
{
assert(phead->next != phead);
ListNode* pcur = phead->next;
while (pcur != phead)
{
if (pcur->val == x)
return pcur;
pcur = pcur->next;
}
return NULL;
}
void LTInsert(ListNode* pos, LDataType x)
{
assert(pos);
ListNode* newnode = BuyNode(x);
ListNode* pcur = pos->next;
newnode->prev = pos;
newnode->next = pcur;
pos->next = newnode;
pcur->prev = newnode;
}
void LTErase(ListNode* pos)
{
pos->prev->next = pos->next;
pos->next->prev = pos->prev;
free(pos);
pos = NULL;
}
测试文件
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"List.h"
void Test1()
{
ListNode* phead = LTInit();
bool judge = LTEmpty(phead);
if (judge)
printf("是空链表。\n");
else
printf("是非空链表。\n");
LTPushFront(phead, 5);
LTPushFront(phead, 6);
LTPushFront(phead, 7);
LTPushFront(phead, 8);
ListNode* find = LTFind(phead, 6);
LTInsert(find, 0);
LTErase(find);
ListPrint(phead);
judge = LTEmpty(phead);
if (judge)
printf("是空链表。\n");
else
printf("是非空链表。\n");
LTDestroy(phead);
phead = NULL;
}
int main()
{
Test1();
return 0;
}