LinkList.h(头文件,定义接口):
#pragma once //防止头文件重复包含
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include<stdbool.h>
#include<stdio.h>
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
struct LinkNode
{
int data;
struct LinkNode *next;
};
//初始化链表
struct LinkNode* Init_LinkList();
//在值为oldvalue的后面插入一个新的数据newvalue
void InsertByValue_LinkList(struct LinkNode *header,int oldValue,int newValue);
//删除值为val的结点
void RemoveByValue_LinkList(struct LinkNode* header, int delValue);
//遍历
void Foreach_LinkList(struct LinkNode *header);
//销毁链表
void Destory_LinkList(struct LinkNode * header);
//清空链表
void Clear_LinkList(struct LinkNode *header);
#ifdef __cplusplus
}
#endif
LinkList.c(实现接口):
#include"LinkList.h"
struct LinkNode* Init_LinkList()
{
struct LinkNode *header = malloc(sizeof(struct LinkNode));
header->data = -1;
header->next = NULL;
int val = -1;
struct LinkNode *pRear = header;
while (true)
{
printf("输入插入的数据:\n");
scanf("%d", &val);
if (val == -1)
{
break;
}
struct LinkNode *newNode = malloc(sizeof(struct LinkNode));
newNode->data = val;
newNode->next = NULL;
pRear->next = newNode;
pRear = newNode;
}
return header;
}
//在值为oldvalue的后面插入一个新的数据newvalue
void InsertByValue_LinkList(struct LinkNode* header, int oldValue, int newValue)
{
while (header==NULL)
{
return;
}
struct LinkNode* pPrev = header;
struct LinkNode* pCurrent = pPrev->next;
while (pCurrent!=NULL)
{
if (pCurrent->data==oldValue)
{
break;
}
pPrev = pCurrent;
pCurrent = pCurrent->next;
}
#if 0
if (pCurrent == NULL) //数据没找到
{
return;
}
#endif // 0
struct LinkNode* newNode = malloc(sizeof(struct LinkNode));
newNode->data = newValue;
newNode->next = NULL;
pPrev->next = newNode;
newNode->next = pCurrent;
}
void RemoveByValue_LinkList(struct LinkNode* header, int delValue)
{
if (header==NULL)
{
return;
}
struct LinkNode* pPrev = header;
struct LinkNode* pCurrent = pPrev->next;
while (pCurrent!=NULL)
{
if (pCurrent->data==delValue)
{
break;
}
pPrev = pCurrent;
pCurrent = pCurrent->next; //移动俩指针
}
if (pCurrent==NULL)
{
return;
}
pPrev->next = pCurrent->next;
free(pCurrent);
pCurrent = NULL;
}
void Foreach_LinkList(struct LinkNode* header)
{
if (header==NULL)
{
return;
}
struct LinkNode* pCurrent = header->next;
while (pCurrent!=NULL)
{
printf("% d", pCurrent->data);
pCurrent = pCurrent->next;
}
}
void Destory_LinkList(struct LinkNode* header)
{
if (header==NULL)
{
return;
}
struct LinkNode* pCurrent = header;
while (pCurrent!=NULL)
{
struct LinkNode* pNext = pCurrent->next;
printf("%d结点被销毁\n", pCurrent->data);
free(pCurrent);
pCurrent = pNext;
}
}
void Clear_LinkList(struct LinkNode* header)
{
if (header==NULL)
{
return;
}
//辅助指针变量
struct LinkNode *pCurrent = header->next;
while (pCurrent!=NULL)
{
struct LinkNode* pNext = pCurrent->next;
free(pCurrent);
pCurrent = pNext;
}
header->next = NULL;
}
TestLinkList.c(测试接口):
#include"LinkList.h"
void test()
{
struct LinkNode* header = Init_LinkList(); //输入100 200 300 400 500 600
Foreach_LinkList(header);
InsertByValue_LinkList(header, 300, 66666666); //插入后的
printf("\n----------\n");
Foreach_LinkList(header);
printf("\n----------\n");
Clear_LinkList(header); //清空后
Foreach_LinkList(header);
printf("\n----------\n");
InsertByValue_LinkList(header, 0, 111);
InsertByValue_LinkList(header, 0, 222);
InsertByValue_LinkList(header, 0, 333);
InsertByValue_LinkList(header, 0, 444);
InsertByValue_LinkList(header, 0, 555);
printf("\n----------\n");
Foreach_LinkList(header);
printf("\n----------\n");
RemoveByValue_LinkList(header, 444);
Foreach_LinkList(header);
Destory_LinkList(header);
}
int main()
{
test();
system("pause");
return EXIT_SUCCESS;
}