目录
链表基本操作
1. 初始化链表
建立带有头结点的单向链表,,结点数据域中的数值从键盘输入,以 -1 作为输入结束标志,链表的头结点地址由函数值返回。
//初始化链表
struct LinkNode * Init_LinkList()
{
//待插入数据
int a;
//创建头节点
struct LinkNode * pHeader = (struct LinkNode *)malloc(sizeof(struct LinkNode));
//记录尾节点位置,方便尾插入新的数据
struct LinkNode * pTail = pHeader;
while (true)
{
//让用户初始化几个节点,如果用户输入的是-1,代表插入结束
printf("请输入数据,输入-1停止\n");
scanf("%d", &a);
if (a == -1)
{
break;
}
struct LinkNode * pADD= (struct LinkNode *)malloc(sizeof(struct LinkNode));
pADD->m = a;
pADD->next = NULL;
//更改指针的指向
pTail->next = pADD;
//更新新的尾节点的指向
pTail = pADD;
}
return pHeader;
}
2. 遍历链表
顺序输出单向链表各项结点数据域中的内容:
//遍历链表
void Foreach_LinkList(struct LinkNode *pHeader)
{
if (pHeader == NULL)
{
return;
}
//指定第一个有真实数据的节点
struct LinkNode * pCurrent = pHeader->next;
while(pCurrent!= NULL)
{
printf("%d\n" , pCurrent->m);
pCurrent = pCurrent->next;
}
}
3. 插入结点
在指定值后面插入数据data,如果值val不存在,则在尾部插入。
//插入链表
void InsertByVal_LinkList(struct LinkNode *pHeader, int oldVal, int newVal)
{
if (pHeader == NULL)
{
return;
}
//创建两个临时的节点
struct LinkNode *pPrve = pHeader;
struct LinkNode *pCurrent = pHeader->next;
while(pCurrent != NULL)
{
if (pCurrent->m == oldVal)
{
break;
}
//如果没找到对应的位置,辅助指针向后移动
pPrve = pCurrent;
pCurrent = pCurrent->next;
}
struct LinkNode * pADD = (struct LinkNode *)malloc(sizeof(struct LinkNode));
pADD->m = newVal;
pADD->next = NULL;
//建立关系
pPrve->next = pADD;
pADD->next = pCurrent;
}
4. 删除节点
删除第一个值为val的结点。
//删除链表
void Delete_LinkList(struct LinkNode *pHeader, int Val)
{
if (pHeader == NULL)
{
return;
}
//创建两个临时的节点
struct LinkNode *pPrve = pHeader;
struct LinkNode *pCurrent = pHeader->next;
while (pCurrent->m != Val)
{
if (pCurrent == NULL)
{
printf("没有找到要删除\n");
return;
}
//如果没找到对应的位置,辅助指针向后移动
pPrve = pCurrent;
pCurrent = pCurrent->next;
}
//更改指针的指向进行删除
pPrve->next = pCurrent->next;
//删除掉待删除的节点
free(pCurrent);
pCurrent = NULL;
}
5. 清空链表
//清空链表
void Clean_LinkList(struct LinkNode *pHeader)
{
if (pHeader == NULL)
{
return;
}
//创建两个临时的节点
struct LinkNode *pPrve = pHeader;
struct LinkNode *pCurrent = pHeader->next;
while (pCurrent != NULL)
{
pPrve = pCurrent;
pCurrent = pCurrent->next;
free(pPrve);
pPrve = NULL;
}
pHeader->next = NULL;
}
6. 销毁链表
销毁链表,释放所有节点的空间.
//销毁链表
void destroy_LinkList(struct LinkNode *pHeader)
{
if (pHeader == NULL)
{
return;
}
//先清空链表
Clean_LinkList(pHeader);
//再释放头节点
free(pHeader);
pHeader = NULL;
}
7. 反转链表
//反转链表
void reverse_LinkList(struct LinkNode *pHeader)
{
if (pHeader == NULL)
{
return;
}
//创建三个个临时的节点
struct LinkNode *pPrve = NULL;
struct LinkNode *pCurrent = pHeader->next;
struct LinkNode *pNext = pCurrent->next;
while(1)
{
pCurrent->next = pPrve;
if (pNext == NULL)
{
break;
}
//移动三个结点
pPrve = pCurrent;
pCurrent = pNext;
pNext = pCurrent->next;
}
pHeader->next = pCurrent;
}
完整代码
listLink.h
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
struct LinkNode {
int m;
struct LinkNode * next;
};
//初始化链表
struct LinkNode * Init_LinkList();
//遍历链表
void Foreach_LinkList(struct LinkNode *pHeader);
//插入链表
void InsertByVal_LinkList(struct LinkNode *pHeader , int oldVal , int newVal);
//删除链表
void Delete_LinkList(struct LinkNode *pHeader , int Val);
//清空链表
void Clean_LinkList(struct LinkNode *pHeader);
//销毁链表
void destroy_LinkList(struct LinkNode *pHeader);
//反转链表
void reverse_LinkList(struct LinkNode *pHeader);
listLink.cpp
#include "listLink.h"
//初始化链表
struct LinkNode * Init_LinkList()
{
//待插入数据
int a;
//创建头节点
struct LinkNode * pHeader = (struct LinkNode *)malloc(sizeof(struct LinkNode));
//记录尾节点位置,方便尾插入新的数据
struct LinkNode * pTail = pHeader;
while (true)
{
//让用户初始化几个节点,如果用户输入的是-1,代表插入结束
printf("请输入数据,输入-1停止\n");
scanf("%d", &a);
if (a == -1)
{
break;
}
struct LinkNode * pADD= (struct LinkNode *)malloc(sizeof(struct LinkNode));
pADD->m = a;
pADD->next = NULL;
//更改指针的指向
pTail->next = pADD;
//更新新的尾节点的指向
pTail = pADD;
}
return pHeader;
}
//遍历链表
void Foreach_LinkList(struct LinkNode *pHeader)
{
if (pHeader == NULL)
{
return;
}
//指定第一个有真实数据的节点
struct LinkNode * pCurrent = pHeader->next;
while(pCurrent!= NULL)
{
printf("%d\n" , pCurrent->m);
pCurrent = pCurrent->next;
}
}
//插入链表
void InsertByVal_LinkList(struct LinkNode *pHeader, int oldVal, int newVal)
{
if (pHeader == NULL)
{
return;
}
//创建两个临时的节点
struct LinkNode *pPrve = pHeader;
struct LinkNode *pCurrent = pHeader->next;
while(pCurrent != NULL)
{
if (pCurrent->m == oldVal)
{
break;
}
//如果没找到对应的位置,辅助指针向后移动
pPrve = pCurrent;
pCurrent = pCurrent->next;
}
struct LinkNode * pADD = (struct LinkNode *)malloc(sizeof(struct LinkNode));
pADD->m = newVal;
pADD->next = NULL;
//建立关系
pPrve->next = pADD;
pADD->next = pCurrent;
}
//删除链表
void Delete_LinkList(struct LinkNode *pHeader, int Val)
{
if (pHeader == NULL)
{
return;
}
//创建两个临时的节点
struct LinkNode *pPrve = pHeader;
struct LinkNode *pCurrent = pHeader->next;
while (pCurrent->m != Val)
{
if (pCurrent == NULL)
{
printf("没有找到要删除\n");
return;
}
//如果没找到对应的位置,辅助指针向后移动
pPrve = pCurrent;
pCurrent = pCurrent->next;
}
//更改指针的指向进行删除
pPrve->next = pCurrent->next;
//删除掉待删除的节点
free(pCurrent);
pCurrent = NULL;
}
//清空链表
void Clean_LinkList(struct LinkNode *pHeader)
{
if (pHeader == NULL)
{
return;
}
//创建两个临时的节点
struct LinkNode *pPrve = pHeader;
struct LinkNode *pCurrent = pHeader->next;
while (pCurrent != NULL)
{
pPrve = pCurrent;
pCurrent = pCurrent->next;
free(pPrve);
pPrve = NULL;
}
pHeader->next = NULL;
}
//销毁链表
void destroy_LinkList(struct LinkNode *pHeader)
{
if (pHeader == NULL)
{
return;
}
//先清空链表
Clean_LinkList(pHeader);
//再释放头节点
free(pHeader);
pHeader = NULL;
}
//反转链表
void reverse_LinkList(struct LinkNode *pHeader)
{
if (pHeader == NULL)
{
return;
}
//创建三个个临时的节点
struct LinkNode *pPrve = NULL;
struct LinkNode *pCurrent = pHeader->next;
struct LinkNode *pNext = pCurrent->next;
while(1)
{
pCurrent->next = pPrve;
if (pNext == NULL)
{
break;
}
//移动三个结点
pPrve = pCurrent;
pCurrent = pNext;
pNext = pCurrent->next;
}
pHeader->next = pCurrent;
}
main.cpp
#include "listLink.h"
int main()
{
//初始化链表
struct LinkNode * pHeader = Init_LinkList();
printf("初始化遍历链表结果为:\n");
Foreach_LinkList(pHeader);
//插入链表
InsertByVal_LinkList(pHeader, 2, 101);
InsertByVal_LinkList(pHeader, 3, 102);
printf("插入遍历链表结果为:\n");
Foreach_LinkList(pHeader);
//反转链表
reverse_LinkList(pHeader);
printf("反转链表遍历链表结果为:\n");
Foreach_LinkList(pHeader);
//删除链表
Delete_LinkList(pHeader, 2);
printf("删除遍历链表结果为:\n");
Foreach_LinkList(pHeader);
//清空链表
Clean_LinkList(pHeader);
InsertByVal_LinkList(pHeader, 1, 1);
InsertByVal_LinkList(pHeader, 3, 3);
printf("清空遍历链表结果为:\n");
Foreach_LinkList(pHeader);
//销毁链表
destroy_LinkList(pHeader);
system("pause");
return -1;
}
推荐一个不错的学习网站https://ke.qq.com/course/417774?flowToken=1010783#term_id=100498433