C语言链表写法,练习链表
- 建立要一个文件:LinkList.h
内容:
#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include<stdlib.h>
#include<stdbool.h>
#include<stdio.h>
#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.建立一个文件:LinkList.c
#include"LinkList.h"
//初始化链表
struct LinkNode *Init_LinkList()
{
//创建头结点
struct LinkNode *header = malloc(sizeof(struct LinkNode));
header->data = -1;//头节点
header->next = NULL;
//尾部指针
struct LinkNode *pRear = header;
int val = -1;
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;
}
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;
}
//先创建节点
struct LinkNode *newnode = malloc(sizeof(struct LinkNode));
newnode->data = newval;
newnode->next = NULL;
//插入数据到链表
pPrev->next = newnode;
newnode->next = pCurrent;
}
//删除值为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)
{
//删除操作
pPrev->next = pCurrent->next;
free(pCurrent);
pCurrent = NULL;
}
//删除了,pCurrent就为空,指针就不能后移
if (NULL == pCurrent)
{
return;
}
pPrev = pCurrent;
pCurrent = pCurrent->next;
}
}
//销毁
void Destroy_LinkList(struct LinkNode *header)
{
if (NULL == header)
{
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 (NULL == header)
{
return;
}
//辅助指针变量
struct LinkNode *pCurrent = header->next;
while (pCurrent != NULL)
{
//先保存下当前结点的下一个节点地址
struct LinkNode *pNext = pCurrent->next;
//释放当前结点内存
free(pCurrent);
//pCurrent指向下一个节点
pCurrent = pNext;
}
header->next = NULL;
}
//遍历
void Foreach_LinkList(struct LinkNode *header)
{
if (NULL == header)
{
return;
}
struct LinkNode *pPrint = header->next;
while (pPrint!= NULL)
{
printf("%d ", pPrint->data);
pPrint = pPrint->next;
}
printf("\n");
}
3.建立一个测试文件:TestLinkList.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"LinkList.h"
void test()
{
//初始化链表
struct LinkNode *header = Init_LinkList();
//打印输出
Foreach_LinkList(header);
//插入数据
InsertByValue_LinkList(header,20,100);
Foreach_LinkList(header);
//删除节点
RemoveByValue_LinkList(header,10);
printf("删除操作\n");
Foreach_LinkList(header);
//清空
Clear_LinkList(header);
//销毁
Destroy_LinkList(header);
}
int main(){
test();
system("pause");
return EXIT_SUCCESS;
}
4.检查结果