当前位置: 首页 > news >正文

数据结构-链表

数据结构-链表


头文件:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

主函数:

//主函数
int main(int argc, const char *argv[])
{LkList_t *LkList = LkListCreate();              //初始化 printf("%#x\n",LkList);                         //打印地址LkListHeadInsert(LkList,10);                    //头节点后添加节点LkListHeadInsert(LkList,20);                    //头节点后添加节点LkListDestInsert(LkList,20,15);                 //指定节点后添加节点LkListTailInsert(LkList,9);                     //尾节点后添加节点LkListTailInsert(LkList,8);                     //尾节点后添加节点LkListTailInsert(LkList,7);                     //尾节点后添加节点LkListPrint(LkList);                            //20,15,10,9,8,7                               LkListHeadDel(LkList);                          //头节点后删除节点LkListTailDel(LkList);                          //删除尾节点LkListDestDel(LkList,10);                       //删除指定节点printf("\n");                                   LkListPrint(LkList);                            //15,9,8}

定义结构体

typedef int DataType_t;           //用户自定义指针类型//定义结构体
typedef struct LinkedList   
{DataType_t Data;              //数据域 struct LinkedList *Next;      //指针域 }LkList_t;                        //别名  

初始化

//创建头节点
LkList_t *LkListCreate(void)
{LkList_t *Head = (LkList_t *)calloc(1,sizeof(LkList_t));//判断申请堆内存是否成功   if (NULL == Head){perror("Calloc memory for Head failed");exit(-1);}Head->Next=NULL;return Head;
}

创建独立节点

//创建独立节点
LkList_t *LkListNewNode(DataType_t Data)
{LkList_t *New = (LkList_t *)calloc(1,sizeof(LkList_t));//判断申请堆内存是否成功if (NULL == New){perror("Calloc memory for New is failed");return NULL;}New->Data = Data;New->Next = NULL;return New;}

插入节点

1.头节点后插入节点

2.尾节点后插入节点

3.指定位置插入节点

//头节点后插入节点
bool LkListHeadInsert(LkList_t *Head , DataType_t Data)
{LkList_t *New = LkListNewNode(Data);    //调用函数创建新节点//判断是否创建成功if (NULL == New){return false;}//如果为空链表,将头节点的Next指向新创建的节点    if (NULL == Head->Next){Head->Next = New;return true;}else{New->Next = Head->Next;Head->Next = New;}
}//尾节点后插入节点
bool LkListTailInsert(LkList_t *Head , DataType_t Data)
{LkList_t *New = LkListNewNode(Data);    //调用函数创建新节点//判断是否创建成功if (NULL == New){return false;}//如果为空链表,将头节点的Next指向新创建的节点if (NULL == Head->Next){Head->Next = New;return true;}//非空链表else{LkList_t *p = Head;             //将头节点地址赋值给p指针while (p->Next != NULL){p = p->Next;}p->Next = New;   }
}//指定位置插入节点
bool LkListDestInsert(LkList_t *Head , DataType_t Dest , DataType_t Data)
{LkList_t *New = LkListNewNode(Data);    //调用函数创建新节点//判断是否创建成功if (NULL == New){return false;}//如果为空链表,将头节点的Next指向新创建的节点    if (NULL == Head->Next){Head->Next = New;return true;}//非空链表else{LkList_t *p = Head;             //将头节点地址赋值给p指针while (p->Data != Dest){p = p->Next;}New->Next = p->Next;p->Next = New;   }
}

删除节点

1.删除首节点

2.删除尾节点

3.删除指定节点

//删除首节点
bool LkListHeadDel(LkList_t *Head)
{//判断是否为空链表if (NULL == Head->Next){return false;}else{  LkList_t *p;                        p = Head->Next;Head->Next = p->Next;               //头节点的Next指向第二个节点p->Next = NULL;                     //首节点的Next赋值为NULLfree(p);                            //释放首节点return true;}
}//删除尾节点
bool LkListTailDel(LkList_t *Head)
{//判断是否为空链表if (NULL == Head->Next){return false;}else{  LkList_t *p1 = Head;                //记录尾节点的前一个地址  LkList_t *p2 = Head->Next;          //记录尾节点的地址while (p2->Next != NULL){p1 = p2;p2 = p2->Next;}p1->Next = NULL;                    //当前倒数第二个节点指向NULL,成为尾节点free(p2);                           //释放尾节点return true;}
}//指定位置删除节点
bool LkListDestDel(LkList_t *Head , DataType_t Dest)
{//判断是否为空链表if (NULL == Head->Next){return false;}else{LkList_t *p1 = Head;                //记录前一个节点的地址LkList_t *p2 = Head->Next;          //记录删除节点的地址//判断是否p->Data == Destwhile (p2->Data != Dest){p1 = p2;                        p2 = p2->Next;}p1->Next = p2->Next;                //将删除节点的Next,赋值给前一个节点p2->Next = NULL;                    //将删除节点的Next指向空free(p2);                           //释放该节点return true;}
}

遍历链表

//遍历链表
void LkListPrint(LkList_t *Head)
{LkList_t *p = Head;                 //打印整个链表while (p->Next != NULL){p = p->Next;printf("Data=%d\n",p->Data);}}
http://www.hskmm.com/?act=detail&tid=27539

相关文章:

  • 重组抗体技术:从原理到应用,解锁高效可控的新一代抗体研发
  • P13690 [CEOI 2025] boardgames
  • CSS
  • 关于jinja2的ssti模版注入的学习+过滤
  • WPF Epplus export 10M+ items in excel with multiple sheets batch by batch
  • [EGOI 2023] Guessing Game
  • CF2152G Query Jungle
  • [ROI 2018] Addition without carry
  • [THUPC 2025 决赛] Im Here
  • 解码Linux基础命令
  • 基于 C++ 的高雷诺数湍流直接数值模拟求解器设计与性能优化 - 实践
  • 由等概率(a,b)生成等概率(c,d)
  • AI/LLM应用安全与合规产品(AI安全网关|AI安全围栏|AI应用防火墙) 2025最新推荐
  • 10.8 CSP-S模拟27 改题记录
  • 《可复制的领导力》
  • 经营分析会 - 智慧园区
  • 自动评估问答模型的技术突破
  • Ivanti EPM移动版12.5.0.0身份验证绕过漏洞分析与利用
  • 运行Udacity的MPC控制项目指南(project_10)在Ubuntu 18.04环境下
  • 深入解析:Java 将 PDF 转换为 PDF/A:数字文档归档的基石
  • 入门正当时!MQTT协议轻量简洁,但应用绝不简单
  • 英语阅读
  • CF1832D2 Red-Blue Operations (Hard Version) 模拟赛题目分析
  • 网络流最小割,无向图建图法,求最小割点转换求最小割边
  • 实验1 C语言开发环境使用和数据类型、运算符、表达式
  • 深度学习概述 - -一叶知秋
  • 烧录神器来了!量产工具使用教程,新手也能秒懂
  • 看论文随笔Incendio: Priority-Based Scheduling for Alleviating Cold Start in Serverless Computing
  • C#性能优化基础:内存诊断(dump)
  • 2025年企业级LLM内容安全防护指南:鉴冰AI FENCE流式网关技术深度解析