1.头文件
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<stdbool.h>
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
//定义节点数据类型
struct LinkNode
{
int data;
struct LinkNode* next;
};
//初始化链表
struct LinkNode* Init_LinkList();
//在值为oldval的位置插入新的数据newval
void InsertByValue_LinkList(struct LinkNode* header, int oldval, int newval);
//删除值为val的节点
void RemoveByValue_LinkList(struct LinkNode* header, int delValue);
//遍历
void Foreach_LinkList(struct LinkNode*header);
//销毁
void Destroy_LinkList(struct LinkNode* header);
//清空
void Clear_LinkList(struct LinkNode* header);
#ifdef __cplusplus
}
#endif
2.链表内容及函数定义
/*内容:定义节点数据类型
* 初始化链表
* 在节点oldvalue后面插入newvalue
* 删除值为val的节点
* 遍历
* 销毁
* 清空
*/
#define _CRT_SECURE_NO_WARNINGS
#include"LinkList.h"
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<stdbool.h>
using namespace std;
//初始化链表
struct LinkNode* Init_LinkList()
{
//创建头结点
struct LinkNode* header = (struct LinkNode*)malloc(sizeof(struct LinkNode));
header->data = -1;
header->next = NULL;
//尾部指针
struct LinkNode* pRear = header;
int val = -1;
while (true)
{
cout << "输入插入的数据:" << endl;
cin >> val;
if (val == -1)
break;
//创建新节点
struct LinkNode* newnode = (struct LinkNode*)malloc(sizeof(struct LinkNode));
newnode->data = val;
newnode->next = NULL;
//新节点插入到链表中
pRear->next = newnode;
//更新尾部指针指向
pRear = newnode;
}
return header;
}
//遍历
void Foreach_LinkList(struct LinkNode *header)
{
if (NULL == header)
{
return;
}
//辅助指针变量
struct LinkNode* pCurrent = header->next;
while (pCurrent != NULL)
{
cout << pCurrent->data<<endl;
pCurrent = pCurrent->next;
}
}
//在值为oldval的位置插入新的数据newval
void InsertByValue_LinkList(struct LinkNode* header, int oldval, int newval)
{
if (NULL == header)
{
return;
}
//两个辅助指针变量
struct LinkNode* pPrev = header;
struct LinkNode* pCurrent = pPrev->next;
while (pCurrent != NULL)
{
if (pCurrent->data == oldval)
{
break;
}
pPrev = pCurrent;
pCurrent = pCurrent->next;
}
#if 0
//如果pCurrent为NULL,说明链表中不存在值为oldval的节点
if (pCurrent == NULL)
{
return;
}//用了if和endif之后:若链表中未找到oldval节点,则默认插入到链表末尾
#endif
//否则找到了oldval,先创建新节点
struct LinkNode* newnode = (struct LinkNode*)malloc(sizeof(struct LinkNode));
newnode->data = newval;
newnode->next = NULL;
//新节点插入到链表中
newnode->next = pCurrent;
pPrev->next = newnode;
}
//清空
void Clear_LinkList(struct LinkNode* header)
{
if (NULL == header)
{
return;
}
//辅助指针变量
struct LinkNode* pCurrent = header->next;
while (pCurrent != NULL)
{
//先保存当前节点的下一节点的地址
struct LinkNode* pNext = pCurrent->next;
//释放当前节点的内存
free(pCurrent);
//pCurrent指向下一个节点
pCurrent = pNext;
}
header->next = NULL;//这句话是和销毁不一样的地方
}
//删除值为val的节点
void RemoveByValue_LinkList(struct LinkNode* header, int delValue)
{
if (NULL == header)
{
return;
}
//两个辅助指针变量
struct LinkNode* pPrev = header;
struct LinkNode* pCurrent = pPrev->next;
while (pCurrent != NULL)
{
if (pCurrent->data == delValue)
{
break;
}
//移动两个辅助指针
pPrev = pCurrent;
pCurrent = pCurrent->next;
}
if (NULL == pCurrent)
{
return;
}
//重新建立待删除节点的前驱和后续节点的联系
pPrev->next = pCurrent->next;
//释放删除节点内存
free(pCurrent);
pCurrent = NULL;
}
//销毁
void Destroy_LinkList(struct LinkNode* header)
{
if (NULL == header)
{
return;
}
//辅助指针变量
struct LinkNode* pCurrent = header->next;
while (pCurrent != NULL)
{
//先保存当前节点的下一节点的地址
struct LinkNode* pNext = pCurrent->next;
//释放当前节点的内存
free(pCurrent);
//pCurrent指向下一个节点
pCurrent = pNext;
}
}
3.测试
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<stdbool.h>
#include"LinkList.h"
void test()
{
//初始化链表 输入:100 200 666 300 400 500 600(在300的节点插入666数据)
struct LinkNode* header = Init_LinkList();
//打印链表(遍历)
Foreach_LinkList(header);
//插入数据
InsertByValue_LinkList(header, 300, 666);
//打印链表(遍历)
cout << "------------------------"<<endl;
Foreach_LinkList(header);
//清空链表
Clear_LinkList(header);
//打印链表(遍历)
cout << "------------------------" << endl;
Foreach_LinkList(header);
}
int main()
{
test();
system("pause");
return EXIT_SUCCESS;
}