c语言——静态链表
链表结点类型定义
如何遍历链表
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//链表结点类型定义
struct LinkNode
{
int data;
struct LinkNode *next;
};
void test()
{
struct LinkNode node1 = { 10, NULL };
struct LinkNode node2 = { 20, NULL };
struct LinkNode node3 = { 30, NULL };
struct LinkNode node4 = { 40, NULL };
struct LinkNode node5 = { 50, NULL };
struct LinkNode node6 = { 60, NULL };
node1.next = &node2;
node2.next = &node3;
node3.next = &node4;
node4.next = &node5;
node5.next = &node6;
//如何遍历链表?
//先定义一个辅助指针变量
struct LinkNode *pCurrent = &node1;
while (pCurrent != NULL)
{
printf("%d ",pCurrent->data);
//指针移动到下一个元素的首地址
pCurrent = pCurrent->next;
}
}
int main(){
test();
system("pause");
return EXIT_SUCCESS;
}
运行
10 20 30 40 50 60
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
主文件 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;
}
#if 0
//如果pCurrent为NULL 说明链表中不存在值为oldval的结点
if (pCurrent == NULL)
{
return;
}
#endif
//先创建新结点
struct LinkNode *newnode = malloc(sizeof(struct LinkNode));
newnode->data = newval;
newnode->next = NULL;
//新节点插入到链表中
newnode->next = pCurrent;
pPrev->next = newnode;
}
//删除值为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 Foreach_LinkList(struct LinkNode *header)
{
if (NULL == header)
{
return;
}
//辅助指针变量
struct LinkNode *pCurrent = header->next;
while (pCurrent != NULL)
{
printf("%d ",pCurrent->data);
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;
}
测试链表 TestLinkList.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"LinkList.h"
void test()
{
//初始化链表 100 200 666 300 400 500 600
struct LinkNode *header = Init_LinkList();
//打印链表
Foreach_LinkList(header);
//插入数据
InsertByValue_LinkList(header, 200, 666);
//打印链表
printf("\n-------------------\n");
Foreach_LinkList(header);
//清空链表
Clear_LinkList(header);
//打印链表
InsertByValue_LinkList(header, 1000, 111);
InsertByValue_LinkList(header, 1000, 211);
InsertByValue_LinkList(header, 1000, 311);
InsertByValue_LinkList(header, 1000, 411);
printf("\n-------------------\n");
Foreach_LinkList(header);
RemoveByValue_LinkList(header,311);
printf("\n-------------------\n");
Foreach_LinkList(header);
RemoveByValue_LinkList(header, 211);
printf("\n-------------------\n");
Foreach_LinkList(header);
//销毁链表
Destroy_LinkList(header);
}
int main(){
test();
system("pause");
return EXIT_SUCCESS;
}