mylist.h
#define _CRT_SECURE_NO_DEPRECATE 1
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<string.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 input);
void PopBack(ListNode** ppList);
void PushFront(ListNode** ppList, DataType input);
void PopFront(ListNode** ppList);
ListNode* Find(ListNode* pList, DataType input);
// 在pos的前面插入一个节点x
void Insert(ListNode** ppList, ListNode* pos, DataType input);
void Erase(ListNode** ppList, ListNode* pos);
mylist.c
#include"mylist.h"
ListNode* BuyNode(DataType input)
{
ListNode * node;
node = (ListNode*)malloc(sizeof(ListNode));
node->data = input;
node->next = NULL;
return node;
}
void PrintList(ListNode* pList)
{
ListNode* tmp = pList;
while(tmp != NULL)
{
printf("%d->",tmp->data);
tmp = tmp->next;
}
printf("NULL\n");
}
void PushBack(ListNode** ppList, DataType input)
{
//1没有节点
//2有一个节点
//3有多个节点
if(*ppList == NULL)
{
*ppList = BuyNode(input);
}
else if((*ppList)->next == NULL)
{
(*ppList)->next = BuyNode(input);
}
else
{
ListNode* tmp =*ppList;
while(tmp->next != NULL)
{
tmp =tmp->next ;
}
tmp->next = BuyNode(input);
}
}
void PopBack(ListNode** ppList)
{
//1没有节点
//2只有一个节点
//3有多个节点
assert(ppList);
if(*ppList == NULL)
{
return;
}
else if((*ppList)->next == NULL)
{
free(*ppList);
*ppList = NULL;
}
else
{
ListNode* tmp = *ppList;
ListNode* pos;
while(tmp->next != NULL)
{
pos = tmp;
tmp = tmp->next ;
}
free(tmp);
tmp=NULL;
pos->next = NULL;
}
}
void PushFront(ListNode** ppList, DataType input)
{
//1没有节点
//2有节点
if(*ppList == NULL)
{
*ppList = BuyNode(input);
}
else
{
ListNode* tmp = BuyNode(input);
tmp->next = *ppList; //把已有链表的头给新节点的next
*ppList = tmp; //再把新节点的头(新链表的头)给*ppList
}
}
void PopFront(ListNode** ppList)
{
//1没有节点
//2有多个节点
if(*ppList == NULL)
{
return ;
}
else
{
ListNode* tmp = (*ppList)->next;
free(*ppList);
*ppList = NULL;
*ppList = tmp;
}
}
ListNode* Find(ListNode* pList, DataType input)
{
//1没有节点
//2有节点
if((pList == NULL))
{
return NULL;
}
else
{
ListNode* pos = pList;
while(pos)
{
if(pos->data == input)
{
return pos;
}
else
pos = pos->next;
}
}
return NULL;
}
// 在pos的前面插入一个节点x
void Insert(ListNode** ppList, ListNode* pos, DataType input)
{
//1空链表
//2在第一个前面插入
//3在中间插入
assert(pos);
if(*ppList == NULL)
{
return ;
}
else if((*ppList == pos) || (*ppList)->data == pos->data)
{
PushFront(ppList,input);
}
else
{
ListNode* tmp = *ppList;
ListNode* NewNode;
while((tmp->next) != pos)
{
tmp = tmp->next;
}
NewNode = BuyNode(input);
tmp->next = NewNode;
NewNode->next = pos;
}
}
void Erase(ListNode** ppList, ListNode* pos)
{
//1没有节点
//2删除头节点
// 删除尾结点
//3多个节点
assert(pos);
if(*ppList == NULL)
{
return ;
}
else if((*ppList)-> data == pos->data )
{
PopFront(ppList);
free(pos);
pos->next = NULL;
}
else if(pos->next == NULL)
{
PopBack(ppList);
free(pos);
pos->next = NULL;
}
else
{
ListNode* tmp =*ppList;
ListNode* pretmp;
while (tmp->next != pos )
{
pretmp = tmp;
tmp = tmp->next;
}
tmp->next = pos->next ;
free(pos);
pos->next = NULL;
}
}
test.c
#include"mylist.h"
void test1()
{
ListNode* mylist=NULL;
PushBack(&mylist,1);
PushBack(&mylist,2);
PushBack(&mylist,3);
PushBack(&mylist,4);
PrintList(mylist);
PopBack(&mylist);
PopBack(&mylist);
PopBack(&mylist);
PopBack(&mylist);
PrintList(mylist);
PushFront(&mylist,1);
PushFront(&mylist,2);
PushFront(&mylist,3);
PushFront(&mylist,4);
PrintList(mylist);
PopFront(&mylist);
PopFront(&mylist);
PopFront(&mylist);
PopFront(&mylist);
PrintList(mylist);
}
void test2()
{
ListNode* mylist=NULL;
ListNode* pos ;
PushFront(&mylist,1);
PushFront(&mylist,2);
PushFront(&mylist,3);
PushFront(&mylist,4);
PrintList(mylist);
pos = Find(mylist,2);
printf("此元素地址 %p\n",Find(mylist,4));
Insert(&mylist,pos,0); //总是插入在最后面
PrintList(mylist);
Erase(&mylist,pos);
PrintList(mylist);
}
int main()
{
test1();
test2();
system("pause");
return 0;
}