头文件
LinkList.h
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int DataType;
typedef struct Node
{
DataType data;
struct Node* next;
}Node, List, *pNode, *pList;
//初始化
void InitLinkList(pList* pplist);
//申请
pNode BuyNode(DataType d);
//销毁
void DestroyLinkList(pList* pplist);
//尾部插入
void PushBack(pList* pplist, DataType d);
//尾部删除
void PopBack(pList* pplist);
//头部插入
void PushFront(pList* pplist, DataType d);
//头部删除
void PopFront(pList* pplist);
//查找元素
pNode Find(pList plist, DataType d);
//在指定位置之前插入一个值
void Insert(pList* pplist, pNode pos, DataType d);
//指定位置删除
void Erase(pList* pplist, pNode pos);
//删除指定元素
void Remove(pList* pplist, DataType d);
//删除所有指定元素
void RemoveAll(pList* pplist, DataType d);
//删除无头单链表的非尾节点(不能遍历链表)
void EraseNotTailNode(pNode pos);
//打印
void PrintLinkList(pList plist);
//链表长度
int GetListLength(pList plist);
#endif //__LINKLIST_H__
源文件
LinkList.c
#include "LinkList.h"
//初始化
void InitLinkList(pList* pplist)
{
assert(pplist != NULL);
*pplist = NULL;
}
//申请
pNode BuyNode(DataType d)
{
pNode tmp = (pNode)malloc(sizeof(Node));
if (tmp == NULL)
{
perror("BuyNode::malloc");
return NULL;
}
tmp->data = d;
tmp->next = NULL;
return tmp;
}
//尾插法
void PushBack(pList* pplist, DataType d)
{
pNode newNode = BuyNode(d);
assert(pplist != NULL);
if (newNode == NULL)
{
exit(EXIT_FAILURE);
}
if (*pplist == NULL)//空链表
{
*pplist = newNode;
}
else
{
pNode cur = *pplist;
while ((cur->next) != NULL)
{
cur = cur->next;
}
cur->next = newNode;
}
}
//打印
void PrintLinkList(pList plist)
{
pNode cur = plist;
while (cur)
{
printf("%d--->", cur->data);
cur = cur->next;
}
printf("over\n");
}
//销毁
void DestroyLinkList(pList* pplist)
{
assert(pplist != NULL);
pNode cur = *pplist;
while (cur != NULL)
{
pNode del = cur;
cur = cur->next;
free(del);
del = NULL;
}
*pplist = NULL;
}
//尾部删除
void PopBack(pList* pplist)
{
assert(pplist != NULL);
pNode cur = *pplist;
if (*pplist == NULL)
return;
if ((*pplist)->next == NULL)
{
free(*pplist);
*pplist = NULL;
}
else
{
while (cur->next->next != NULL)
{
cur = cur->next;
}
free(cur->next);
cur->next = NULL;
}
}
//头部插入
void PushFront(pList* pplist, DataType d)
{
assert(pplist != NULL);
pNode newNode = NULL;
newNode = BuyNode(d);
newNode->next = *pplist;
*pplist = newNode;
}
//头部删除
void PopFront(pList* pplist)
{
assert(pplist != NULL);
if (*pplist == NULL)
{
return;
}
else
{
pNode del = *pplist;
*pplist = del->next;
free(del);
del = NULL;
}
}
//查找元素
pNode Find(pList plist, DataType d)
{
pNode cur = NULL;
assert(plist != NULL);
cur = plist;
if (plist == NULL)
{
return NULL;
}
else
{
if (cur->data == d)
{
return cur;
cur = cur->next;
}
}
return NULL;
}
//在指定位置之前插入一个值
void Insert(pList* pplist, pNode pos, DataType d)
{
assert(*pplist != NULL);
assert(pplist != NULL);
assert(pos != NULL);
pNode newNode = NULL;
if (*pplist == pos)
{
newNode = BuyNode(d);
newNode->next = *pplist;
*pplist = newNode;
}
else
{
pNode cur = *pplist;
while (cur&&cur->next != pos)
{
cur = cur->next;
}
if (cur != NULL)
{
newNode = BuyNode(d);
newNode->next = pos;
cur->next = newNode;
}
}
}
//指定位置删除
void Erase(pList* pplist, pNode pos)
{
assert(pplist != NULL);
assert(pos != NULL);
pNode tmp = pos;
if (*pplist == NULL)
return;
if (*pplist == pos)
{
*pplist = tmp->next;
free(tmp);
tmp = NULL;
}
else
{
pNode cur = *pplist;
while (cur&&cur->next != NULL)
{
cur = cur->next;
}
if (cur != NULL)
{
cur->next = pos->next;
free(pos);
pos = NULL;
}
}
}
//删除指定元素
void Remove(pList* pplist, DataType d)
{
pNode cur = NULL;
pNode del = NULL;
assert(pplist != NULL);
if (*pplist == NULL)
return;
cur = *pplist;
if (cur->data == d)
{
del = *pplist;
*pplist = cur->next;
free(del);
del = NULL;
}
else
{
while (cur&&cur->next->data != d)
{
cur = cur->next;
}
while (cur)
{
del = cur->next;
cur->next = del->next;
free(del);
del = NULL;
return;
}
}
}
//删除所有指定元素
void RemoveAll(pList* pplist, DataType d)
{
pNode cur = NULL;
pNode del = NULL;
assert(pplist != NULL);
if (*pplist == NULL)
{
return;
}
cur = *pplist;
if (cur->data == d)
{
return;
}
else
{
while (cur&&cur->next->data != d)
{
cur = cur->next;
}
while (cur)
{
del = cur->next;
cur->next = del->next;
free(del);
del = NULL;
}
}
}
//删除无头单链表的非尾节点(不能遍历链表)
void EraseNotTailNode(pNode pos)
{
pNode del = NULL;
assert(pos != NULL);
if (pos->next == NULL)
{
return;
}
del = pos->next;
pos->data = del->data;
pos->next = del->next;
DestroyLinkList(&del);
}
//链表长度
int GetListLength(pList plist)
{
int count = 0;
if (plist == NULL)
{
return 0;
}
else
{
while (plist)
{
count++;
plist = plist->next;
}
return count;
}
}
test.c
#include"LinkList.h"
void test()//尾部插入
{
pList plist = NULL;
InitLinkList(&plist);
PushBack(&plist, 1);
PushBack(&plist, 2);
PushBack(&plist, 3);
PushBack(&plist, 4);
PrintLinkList(plist);
DestroyLinkList(&plist);
}
void test1()//尾部删除
{
pList plist = NULL;
InitLinkList(&plist);
PushBack(&plist, 1);
PushBack(&plist, 2);
PushBack(&plist, 3);
PushBack(&plist, 4);
PrintLinkList(plist);
PopBack(&plist);
PopBack(&plist);
PrintLinkList(plist);
DestroyLinkList(&plist);
}
void test2()//头部插入,头部删除
{
pList plist = NULL;
InitLinkList(&plist);
PushFront(&plist, 1);
PushFront(&plist, 3);
PushFront(&plist, 2);
PushFront(&plist, 4);
PrintLinkList(plist);
PopFront(&plist);
PopFront(&plist);
PrintLinkList(plist);
DestroyLinkList(&plist);
}
void test3()//查找元素
{
pList plist = NULL;
InitLinkList(&plist);
PushFront(&plist, 4);
PushFront(&plist, 3);
PushFront(&plist, 2);
PushFront(&plist, 4);
PrintLinkList(plist);
pNode ret = Find(plist, 4);
if (ret == NULL)
{
printf("找不到\n");
}
else
{
printf("%d\n", ret->data);
}
DestroyLinkList(&plist);
}
/*void test4()//删除指定元素
{
pList plist = NULL;
InitLinkList(&plist);
PushFront(&plist, 4);
PushFront(&plist, 3);
PushFront(&plist, 2);
PushFront(&plist, 1);
PrintLinkList(plist);
Remove(&plist, 3);
PrintLinkList(plist);
DestroyLinkList(&plist);
}
*/
void test4()//在指定位置之前插入一个值
{
pNode pos = NULL;
pList plist = NULL;
InitLinkList(&plist);
PushFront(&plist, 4);
PushFront(&plist, 3);
PushFront(&plist, 2);
PushFront(&plist, 1);
PrintLinkList(plist);
pos = Find(plist, 1);
if (pos != NULL)
{
Insert(&plist, pos, 5);
}
PrintLinkList(plist);
DestroyLinkList(&plist);
}
void test5()//指定位置删除
{
pNode pos = NULL;
pList plist;
InitLinkList(&plist);
PushBack(&plist, 1);
PushBack(&plist, 2);
PushBack(&plist, 3);
PushBack(&plist, 4);
PrintLinkList(plist);
pos = Find(plist, 1);
if (pos != NULL)
{
Erase(&plist, pos);
}
PrintLinkList(plist);
DestroyLinkList(&plist);
}
void test6()//删除指定元素
{
pList List;
InitLinkList(&List);
PushFront(&List, 4);
PushFront(&List, 3);
PushFront(&List, 2);
PushFront(&List, 1);
PrintLinkList(List);
Remove(&List, 3);
PrintLinkList(List);
DestroyLinkList(&List);
}
void test7()//删除所有指定元素
{
pList plist;
InitLinkList(&plist);
PushBack(&plist, 2);
PushBack(&plist, 2);
PushBack(&plist, 3);
PushBack(&plist, 4);
PushBack(&plist, 2);
PrintLinkList(plist);
RemoveAll(&plist, 2);
PrintLinkList(plist);
DestroyLinkList(&plist);
}
void test8()
{
pList plist;
pNode newNode = NULL;
InitLinkList(&plist);
PushBack(&plist, 1);
PushBack(&plist, 2);
PushBack(&plist, 3);
PushBack(&plist, 4);
PushBack(&plist, 5);
newNode = Find(plist, 3);
EraseNotTailNode(newNode);
PrintLinkList(plist);
DestroyLinkList(&plist);
}
//链表长度
void test9()
{
int length = 0;
pList plist;
InitLinkList(&plist);
PushBack(&plist, 1);
PushBack(&plist, 2);
PushBack(&plist, 3);
PushBack(&plist, 4);
PushBack(&plist, 5);
PrintLinkList(plist);
length = GetListLength(plist);
printf("单链表长度为:%d\n", length);
Remove(&plist, 2);
PrintLinkList(plist);
length = GetListLength(plist);
printf("单链表长度为:%d\n", length);
PrintLinkList(plist);
DestroyLinkList(&plist);
}
int main()
{
//test();
//test1();
//test2();
//test3();
//test4();
//test5();
//test6();
//test7();
//test8();
//test9();
system("pause");
return 0;
}