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;
ListNode* BuyNode(DataType x)//创建一个结点
{
ListNode* node = (ListNode*)malloc(sizeof(ListNode));
node->data = x;
node->next = NULL;
return node;
}
void PushBack(ListNode** pplist, DataType x)//尾插-----传的是结点的指针的地址
{
//情况一:链表为空
//情况二:链表非空
if(*pplist == NULL)
{
*pplist = BuyNode(x);
}
else
{
ListNode* tail = *pplist;
while (tail->next)
{
tail = tail->next;
}
tail->next = BuyNode(x);
}
}
void PopBack(ListNode** pplist)//尾删
{
//情况一:链表空
//情况二:有一个结点
//情况三:有多个结点
if (*pplist == NULL)
{
return;
}
else if((*pplist)->next == NULL)
{
free(*pplist);
*pplist = NULL;
}
else
{
ListNode *tail = *pplist;
ListNode* prev = NULL;
while (tail->next)
{
prev = tail;
tail = tail->next;
}
free(tail);
prev->next = NULL;
}
}
void PushFront(ListNode** pplist, DataType x)//头插
{
//情况一:链表是空--(创建一个结点)
//情况二:链表非空
if (*pplist == NULL)
{
*pplist = BuyNode(x);
return;
}
else
{
ListNode* tmp = BuyNode(x);//先创建一个结点
tmp->next = *pplist;//链接
*pplist = tmp;
}
}
void PopFront(ListNode** pplist)//头删
{
//情况一:链表为空
//情况二:只有一个结点
//情况三:有多个结点
if (*pplist == NULL)
{
return;
}
else if ((*pplist)->next == NULL)
{
free(*pplist);
*pplist = NULL;
}
else
{
ListNode* del = *pplist;
*pplist = del->next;
free(del);
}
}
ListNode* Find(ListNode* plist,DataType x)//查找一个结点
{
//if (plist == NULL)----自己先写的
//{
// return;
//}
//else
//{
// ListNode* cur = plist;
// while (cur)
// {
// if (cur->data == x)
// {
// printf("找到了\n");
// return;
// }
// cur = cur->next;
// }
// printf("没找到\n");
//}
ListNode* cur = plist;
while (cur)
{
if (cur->data == x)
{
return cur;
}
cur = cur->next;
}
return NULL;
}
void Insert(ListNode** pplist, ListNode* pos, DataType x)//在指定结点前面插入
{
assert(pos);
assert(*pplist);
//情况一:在头结点前插入--(头插)
//情况二:在中间结点插入
if (pos == *pplist)
{
PushFront(pplist,x);
}
else
{
ListNode* prev = *pplist;
while (prev->next != pos)
{
prev = prev->next;
}
ListNode* tmp = BuyNode(x);
prev->next = tmp;
tmp->next = pos;
}
}
void Erase(ListNode** pplist, ListNode* pos)//删除结点
{
assert(pos);
assert(*pplist);
//若链表只有一个结点-----(头删或者尾删)
//情况一:要删除的是头结点(头删)
//情况二:要删除的是中间结点
//情况三:要删除的是尾结点(尾删)
if (pos == *pplist)
{
PopFront(pplist);
}
else if (pos->next == NULL)
{
PopBack(pplist);
}
else
{
ListNode* prev = *pplist;
while (prev->next !=pos)
{
prev = prev->next;
}
prev->next = pos->next;
free(pos);
}
}
void PrintList(ListNode* list)//打印链表
{
ListNode* cur = list;
while (cur)//遍历一边,cur为空时链表遍历完
{
printf("%d->", cur->data);
cur = cur->next;
}
printf("NULL\n");
}
//以下测试
void TestList()
{
ListNode* list = NULL;//定义一个链表
PushBack(&list, 1);
PushBack(&list, 2);
PushBack(&list, 3);
PushBack(&list, 4);
PrintList(list);
PopBack(&list);
PopBack(&list);
PopBack(&list);
PopBack(&list);
PrintList(list);
PushFront(&list, 4);
PushFront(&list, 3);
PushFront(&list, 2);
PushFront(&list, 1);
PrintList(list);
//PopFront(&list);
//PopFront(&list);
//PopFront(&list);
PrintList(list);
Find(list, 2);
Find(list, 8);
}
void TestInsert()
{
ListNode* list = NULL;
PushBack(&list, 1);
PushBack(&list, 2);
PushBack(&list, 4);
PrintList(list);
ListNode* pos = Find(list, 4);
Insert(&list, pos, 3);
PrintList(list);
pos = Find(list, 1);
Insert(&list, pos, 0);
PrintList(list);
}
void TestErase()
{
ListNode* list = NULL;
PushBack(&list, 1);
PushBack(&list, 2);
PushBack(&list, 3);
PushBack(&list, 4);
PrintList(list);
ListNode* pos = Find(list, 1);
Erase(&list, pos);
PrintList(list);
pos = Find(list, 3);
Erase(&list, pos);
PrintList(list);
pos = Find(list, 4);
Erase(&list, pos);
PrintList(list);
}
主函数
#define _CRT_SECURE_NO_WARNINGS 1
#include"List.h"
int main()
{
//TestList();
//TestInsert();
TestErase();
system("pause");
return 0;
}