List.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int DataType;
typedef struct ListNode
{
DataType data;
struct ListNode *next;
}ListNode;
void PrintList(ListNode *pList);//从头到尾打印
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);//删除指定位置
List.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "List.h"
ListNode *CreatNode(DataType x)//创建节点
{
ListNode *tmp = (ListNode*)malloc(sizeof(ListNode));
if(tmp == NULL)
{
printf("创建节点失败!\n");
return NULL;
}
tmp->data = x;
tmp->next = NULL;
return tmp;
}
void PrintList(ListNode *pList)//打印
{
while(pList)
{
printf("%d->", pList->data);
pList = pList->next;
}
printf("NULL\n");
return;
}
void PushBack(ListNode **ppList, DataType x)//尾插
{
//1.没有节点
//2.有一个节点
//3.有多个节点
if((*ppList) == NULL)
{
*ppList = CreatNode(x);
}
else if((*ppList)->next == NULL)
{
(*ppList)->next = CreatNode(x);
}
else
{
ListNode *tmp = *ppList;
while(tmp->next)
{
tmp = tmp->next;
}
tmp->next = CreatNode(x);
}
}
void PopBack(ListNode **ppList)//尾删
{
//1.没有节点
//2.有一个节点
//3.有多个节点
if(*ppList == NULL)
{
return;
}
else if((*ppList)->next == NULL)
{
free(*ppList);
*ppList = NULL;
}
else
{
ListNode *tmp = *ppList;
ListNode *pre = *ppList;
while(tmp->next)
{
pre = tmp;
tmp = tmp->next;
}
free(tmp);
pre->next = NULL;
}
}
void PushFront(ListNode **ppList, DataType x)//头插
{
//1.没有节点
//2.有节点
if(*ppList == NULL)
{
*ppList = CreatNode(x);
}
else
{
ListNode *tmp = CreatNode(x);
tmp->next = *ppList;
*ppList = tmp;
}
}
void PopFront(ListNode **ppList)//头删
{
//1.没有节点
//2.有一个节点
//3.有多个节点
if(*ppList == NULL)
{
return;
}
else if((*ppList)->next == NULL)
{
free(*ppList);
*ppList = NULL;
}
else
{
ListNode *tmp = (*ppList)->next;
free(*ppList);
*ppList = tmp;
}
}
ListNode *Find(ListNode *pList, DataType x)//查找
{
while(pList)
{
if(pList->data == x)
{
return pList;
}
pList = pList->next;
}
return pList;
}
void Insert(ListNode **ppList, ListNode *pos, DataType x)//指定位置前插入
{
ListNode *tmp = CreatNode(pos->data);
assert((*ppList)&&(pos));
if(tmp != NULL)
{
if(pos->next == NULL)
{
pos->data = x;
pos->next = tmp;
*ppList = pos;
}
else
{
pos->data = x;
tmp->next = pos->next;
pos->next = tmp;
}
}
}
void Erase(ListNode **ppList, ListNode *pos)//删除指定位置
{
assert((*ppList)&&(pos));
if((*ppList == pos))
{
*ppList = pos->next;
free(pos);
}
else
{
ListNode *tmp = *ppList;
while(tmp->next != pos)
{
tmp = tmp->next;
}
tmp->next = pos->next;
free(pos);
}
}
test.c
#include "List.h"
void test1()//测试PushBack/PopBack
{
ListNode *List = NULL;
PushBack(&List, 1);
PushBack(&List, 2);
PushBack(&List, 3);
PushBack(&List, 4);
PrintList(List);
PopBack(&List);
PopBack(&List);
PrintList(List);
PopBack(&List);
PopBack(&List);
PrintList(List);
}
void test2()//测试PushFront/PopFront
{
ListNode *List = NULL;
PushFront(&List, 4);
PushFront(&List, 3);
PushFront(&List, 2);
PushFront(&List, 1);
PrintList(List);
PopFront(&List);
PopFront(&List);
PrintList(List);
PopFront(&List);
PopFront(&List);
PrintList(List);
}
void test3()//测试Insert/Erase
{
ListNode *List = NULL;
ListNode *ret = NULL;
PushBack(&List, 1);
PushBack(&List, 2);
PushBack(&List, 3);
PushBack(&List, 4);
PrintList(List);
ret = Find(List, 1);
Insert(&List, ret, 0);
PrintList(List);
ret = Find(List, 4);
Erase(&List, ret);
PrintList(List);
}
int main()
{
test1();
test2();
test3();
return 0;
}
如有不对之处,欢迎留言指正。