此次工程还是使用了3个源文件list.h(头文件源代码),main.c(实现接口的具体代码),list.c(单链表逻辑)
list.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int LTDataType;
typedef struct ListNode
{
LTDataType _data;
struct ListNode* _next;
struct ListNode* _prev;
}ListNode;
typedef struct List
{
struct ListNode* _head;
}List;
void ListInit(List* plist);
void ListDestory(List* plist);
ListNode* BuyListNode(LTDataType x);
void ListPushBack(List* plist, LTDataType x);
void ListPrint(List* plist);
void ListPopBack(List* plist);
void ListPushFront(List* plist, LTDataType x);
void ListPopFront(List* plist);
ListNode* ListFind(List* plist, LTDataType x);
void ListInsert(ListNode* pos, LTDataType x);
void ListErase(List* plist,ListNode* pos);
void ListRemove(List* plist, LTDataType x);
main.c
#include"list.h"
void ListInit(List* plist)
{
ListNode* head = BuyListNode(-1);
assert(plist);
head ->_next = head;
head ->_prev = head;
plist ->_head = head;
}
ListNode* BuyListNode(LTDataType x)
{
ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));
newnode ->_next = NULL;
newnode ->_prev = NULL;
newnode ->_data = x;
return newnode;
}
void ListPrint(List* plist)
{
ListNode* cur = plist ->_head ->_next ;
printf("<-head->");
while(cur != plist ->_head )
{
printf("<-%d->",cur->_data);
cur = cur ->_next ;
}
printf("\n");
}
void ListDestory(List* plist)
{
ListNode* cur = plist ->_head ->_next;
ListNode* next;
while(cur != plist ->_head)
{
next = cur -> _next;
free(cur);
cur = next;
}
free(plist ->_head);
plist ->_head = NULL;
}
void ListPushBack(List* plist, LTDataType x)
{
ListInsert(plist ->_head, x);
}
void ListPopBack(List* plist)
{
ListErase(plist,plist ->_head ->_prev );
}
void ListPushFront(List* plist, LTDataType x)
{
ListInsert(plist ->_head ->_next , x);
}
void ListPopFront(List* plist)
{
ListErase(plist,plist ->_head ->_next);
}
ListNode* ListFind(List* plist, LTDataType x)
{
ListNode* head = plist ->_head;
ListNode* cur = head ->_next;
assert(plist && plist ->_head ->_next != plist ->_head );
while(cur != head)
{
if(cur ->_data == x)
{
return cur;
}
cur = cur ->_next ;
}
return NULL;
}
void ListInsert(ListNode* pos, LTDataType x)
{
ListNode* newnode = BuyListNode(x);
ListNode* prev = pos ->_prev;
assert(pos);
prev ->_next = newnode;
newnode ->_prev = prev;
newnode ->_next = pos;
pos ->_prev = newnode;
}
void ListErase(List* plist,ListNode* pos)
{
ListNode* prev = pos ->_prev;
ListNode* next = pos ->_next;
assert(pos && plist ->_head ->_next != plist ->_head);
prev ->_next = next;
next ->_prev = prev;
}
void ListRemove(List* plist, LTDataType x)
{
ListNode* pos = ListFind(plist,x);
if(pos)
{
ListErase(plist, pos);
}
else
{
return;
}
}
list.h
#include"list.h"
int main()
{
List list;
ListNode* pos = NULL;
ListInit(&list);
ListPushBack(&list,1);
ListPushBack(&list,2);
ListPushBack(&list,3);
ListPushBack(&list,4);
ListPrint(&list);
ListPopBack(&list);
ListPrint(&list);
ListPushFront(&list,5);
ListPrint(&list);
ListPopFront(&list);
ListPrint(&list);
ListFind(&list,2);
pos = ListFind(&list,2);
ListInsert(pos,6);
ListPrint(&list);
ListErase(&list,pos);
ListPrint(&list);
ListRemove(&list,3);
ListPrint(&list);
ListDestory(&list);
return 0;
}