List.h
#ifndef _LIST_H_
#define _LIST_H_
#include <stdio.h>
#include <Windows.h>
#include <assert.h>
#include <malloc.h>
typedef int DataType;
typedef struct ListNode
{
DataType _data;
struct ListNode* _next;
}ListNode;
void PrintList(ListNode* pList);
ListNode* BuyNode(DataType x);
void PushBack(ListNode** ppList, DataType x);
void PopBack(ListNode** ppList);
void PushFront(ListNode** ppList, DataType x);
void PopFront(ListNode** ppList);
ListNode* Find(ListNode* pList, DataType x);
void Insert(ListNode** ppList, ListNode* pos, DataType x);
void Erase(ListNode** ppList, ListNode* pos);
#endif
List.c
#include "List.h"
void PrintList(ListNode* pList)
{
if (pList == NULL)
{
printf("NULL\n");
}
ListNode* cur = pList;
while (cur)
{
printf("%d ", cur->_data);
cur = cur->_next;
}
printf("\n");
}
ListNode* BuyNode(DataType x)
{
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->_data = x;
newNode->_next = NULL;
return newNode;
}
void PushBack(ListNode** ppList, DataType x)
{
//1.空 2.非空
assert(ppList);
if (*ppList == NULL)
{
*ppList = BuyNode(x);
}
else
{
ListNode* tail = *ppList;
while (tail->_next)
{
tail = tail->_next;
}
tail->_next = BuyNode(x);
}
}
void PopBack(ListNode** ppList)
{
//1.空 2.一个 3.多个
assert(ppList);
if (*ppList == NULL)
{
return;
}
else if ((*ppList)->_next==NULL)
{
free(*ppList);
*ppList = NULL;
}
else
{
ListNode* prev = NULL;
ListNode* tail = *ppList;
while (tail->_next)
{
prev = tail;
tail = tail->_next;
}
free(tail);
prev->_next = NULL;
}
}
void PushFront(ListNode** ppList, DataType x)
{
//1.空 2.非空
assert(ppList);
if (*ppList == NULL)
{
(*ppList) = BuyNode(x);
return;
}
else
{
ListNode* head = BuyNode(x);
head->_next = *ppList;
*ppList = head;
}
}
void PopFront(ListNode** ppList)
{
//1.空 2.一个 3.多个
assert(ppList);
if (*ppList == NULL)
{
return;
}
else if ((*ppList)->_next == NULL)
{
free(*ppList);
*ppList = NULL;
}
else
{
ListNode* cur = (*ppList)->_next;
free(*ppList);
*ppList = cur;
}
}
ListNode* Find(ListNode* pList, DataType x)
{
while (pList)
{
if (pList->_data == x)
{
return pList;
}
pList = pList->_next;
}
return NULL;
}
void Insert(ListNode** ppList, ListNode* pos, DataType x)
{
//1.头插 2.中间位置插入
assert(pos);
assert(ppList);
if (pos==*ppList)
{
PushFront(ppList, x);
return;
}
else
{
ListNode* cur = BuyNode(x);
ListNode* prev = *ppList;
while (prev->_next!=pos)
{
prev = prev->_next;
}
cur->_next = prev->_next;
prev->_next = cur;
}
}
void Erase(ListNode** ppList, ListNode* pos)
{
//1.头删 2.其余位置删除
assert(ppList);
assert(pos);
if (pos == *ppList)
{
PopFront(ppList);
return;
}
else
{
ListNode* prev = *ppList;
while (prev->_next != pos)
{
prev = prev->_next;
}
prev->_next = pos->_next;
free(pos);
pos = NULL;
}
}
测试用例test.c
#include "List.h"
void TestList1()
{
ListNode* list = NULL;
PushBack(&list, 1);
PushBack(&list, 2);
PushBack(&list, 3);
PushBack(&list, 4);
PrintList(list);
}
void TestList2()
{
ListNode* list = NULL;
PushBack(&list, 1);
PushBack(&list, 2);
PushBack(&list, 3);
PushBack(&list, 4);
PopBack(&list);
PopBack(&list);
PopBack(&list);
//PopBack(&list);
//PopBack(&list);
PrintList(list);
}
void TestList3()
{
ListNode* list = NULL;
PushFront(&list, 1);
PushFront(&list, 2);
PushFront(&list, 3);
PushFront(&list, 4);
PrintList(list);
}
void TestList4()
{
ListNode* list = NULL;
PushFront(&list, 1);
PushFront(&list, 2);
PushFront(&list, 3);
PushFront(&list, 4);
PopFront(&list);
PopFront(&list);
PopFront(&list);
//PopFront(&list);
//PopFront(&list);
PrintList(list);
}
void TestList5()
{
ListNode* list = NULL;
PushBack(&list, 1);
PushBack(&list, 2);
PushBack(&list, 4);
ListNode* ret = Find(list,1);
Insert(&list, ret, 0);
ret = Find(list, 4);
Insert(&list, ret, 3);
PrintList(list);
}
void TestList6()
{
ListNode* list = NULL;
PushBack(&list, 1);
PushBack(&list, 2);
PushBack(&list, 3);
PushBack(&list, 4);
ListNode* ret = Find(list,1);
Erase(&list, ret);
PrintList(list);
ret = Find(list, 4);
Erase(&list, ret);
PrintList(list);
ret = Find(list, 2);
Erase(&list, ret);
PrintList(list);
ret = Find(list, 3);
Erase(&list, ret);
PrintList(list);
}
int main()
{
TestList6();
system("pause");
return 0;
}