头文件
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#ifdef _cplusplus{
#endif
//创建一个节点
struct Linknode {
int data;
struct Linknode* next;
};
//初始化链表
struct Linknode* Inint_Linklist();
//在链表中值oldval处插入新数据newval;
void Insertbyvalue_linklist(struct Linknode* header, int oldval, int newval);
//遍历链表
void print_Linklist(struct Linknode* header);
//删除值为val的结点
void removebyvalue_linklist(struct Linknode* header, int delvalue);
//清空链表
void clear_Linklist(struct Linknode* header);
//销毁链表
void destroy_Linklist(struct Linknode* header);
#ifdef _cplusplus
}
#endif
源文件:Linklist.c
#include <stdio.h>
#include <string.h>
#include "LinkList.h"
//初始化链表
struct Linknode* Inint_Linklist()
{
//创建一个头结点
struct Linknode *header= malloc(sizeof(struct Linknode));
if (header == NULL)
{
printf("堆内存开辟失败!\n");
exit(0);
}
header->data = -1;
header->next = NULL;
//创建一个尾指针
struct Linknode* prear = header;
//定义用户输入的值
int val = -1;
while (true)
{
printf("请输入您需要插入的值:\n");
int reval=scanf_s("%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;
}
//在链表中值oldval处插入新数据newval;
void Insertbyvalue_linklist(struct Linknode* header, int oldval, int newval)
{
//创建两个辅助指针
struct Linknode* pPrev = header;
struct Linknode* pcurrent = pPrev->next;
//若链表为空。程序结束
if (header == NULL)
{
return;
}
while (pcurrent != NULL)
{
if (pcurrent->data == oldval)
{
break;
}
pPrev = pcurrent;
pcurrent = pcurrent->next;
}
if (pcurrent == NULL)
{
return;
}
//找到oldval对应的位置后,创建一个新的结点,并将其插入链表中;
struct Linknode* newnode = malloc(sizeof(struct Linknode));
//初始化新的结点
newnode->data = newval;
newnode->next = NULL;
//将新的结点插入到链表中
pPrev->next = newnode;
newnode->next = pcurrent;
}
//遍历链表
void print_Linklist(struct Linknode* header)
{
if (header == NULL)
{
return;
}
struct Linknode* pcurrent = header->next;
while (pcurrent != NULL)
{
printf("%d\t", pcurrent->data);
pcurrent = pcurrent->next;
}
printf("\n");
}
//删除值为val的结点
void removebyvalue_linklist(struct Linknode* header, int delvalue)
{
//创建两个辅助指针
struct Linknode* pPrev = header;
struct Linknode* pcurrent = pPrev->next;
if (header == NULL)
{
return;
}
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 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的指向
pcurrent = pnext;
}
header->next = NULL;
}
//销毁链表
void destroy_Linklist(struct Linknode* header)
{
if (header == NULL)
{
return;
}
//创建一个辅助指针
struct Linknode* pcurrent = header;
while (pcurrent != NULL)
{
//创建一个新节点用来保存写一个结点的地址
struct Linknode* pnext = pcurrent->next;
//释放当前节点内存空间
free(pcurrent);
//更新pcurrent的指向
pcurrent = pnext;
}
}
测试
#include <stdio.h>
#include "LinkList.h"
#include <string.h>
#include <stdlib.h>
void test()
{
struct Linknode* header = Inint_Linklist();
//打印链表
print_Linklist(header);
printf("----------------------------------\n");
//插入数据
Insertbyvalue_linklist(header, 400, 666);
Insertbyvalue_linklist(header, 400, 667);
Insertbyvalue_linklist(header, 400, 668);
print_Linklist(header);
printf("----------------------------------\n");
//删除数据
removebyvalue_linklist(header, 666);
removebyvalue_linklist(header, 668);
print_Linklist(header);
printf("----------------------------------\n");
//清空链表
clear_Linklist(header);
print_Linklist(header);
printf("----------------------------------\n");
//清空后的链表还可以继续初始化并插入数据
header = Inint_Linklist();
Insertbyvalue_linklist(header, 200, 888);
Insertbyvalue_linklist(header, 200, 999);
print_Linklist(header);
printf("----------------------------------\n");
//销毁链表
destroy_Linklist(header);
}
int main()
{
test();
system("pause");
return 0;
}