热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【C语言数据结构】单链表

LinkList.h#ifndefLINK_LIST_H#defineLINK_LIST_H链表节点typedefstruct_LinkListNode{struct

LinkList.h

#ifndef LINK_LIST_H#define LINK_LIST_H

//链表节点
typedef struct _LinkListNode
{
    struct _LinkListNode *next;

}LinkListNode;


//单链表
typedef void LinkList;



/*
 * 创建单链表
 * @return 返回单链表的指针
 */
LinkList* LinkList_Create();

/*
 * 销毁单链表
 * @param list 单链表的指针
 */
void LinkList_Destroy(LinkList *list);

/*
 * 清空单链表
 * @param list 单链表的指针
 */
void LinkList_Clear(LinkList *list);

/*
 * 向单链表pos位置处插入元素
 * @param list 单链表指针
 * @param node 元素指针
 * @param pos 插入的索引
 */
int LinkList_Insert(LinkList *list,LinkListNode *node,int pos);

/*
 * 获取单链表中索引位置处的元素
 * @param list   单链表指针
 * @param pos   单链表索引值
 * @param return 元素指针
 */
LinkListNode* LinkList_Get(LinkList *list,int pos);

/*
 * 删除单链表中索引位置处的值
 * @param list 单链表的指针
 * @param pos   单链表索引
 * @param return 非0表示删除成功
 */
int LinkList_Remove(LinkList *list,int pos);

/*
 * 获取单链表当前已存储元素的个数
 * @param list 单链表的指针
 * @return 单链表中已存储元素的个数
 */
int LinkList_Length(LinkList *list);


#endif // LINKLIST_H

LinkLink.c

#include "Linklist.h"#include //单链表typedef struct _LinkList{   LinkListNode header;//链表头节点   int length;//链表长度}TLinkList;/* * 创建单链表 * @return 返回单链表的指针 */LinkList* LinkList_Create(){    TLinkList * list = (TLinkList *)malloc(sizeof(LinkList));    if(list != 0)    {        list->header.next = 0;  //初始化头结点的后继指针为空        list->length = 0;    }    return list;}/* * 销毁单链表 * @param list 单链表的指针 */void LinkList_Destroy(LinkList *list){    free(list);}/* * 清空单链表 * @param list 单链表的指针 */void LinkList_Clear(LinkList *list){    if(list != 0)    {        TLinkList* l_list = (TLinkList *)list;        l_list->header.next = 0;        l_list->length = 0;    }}/* * 向单链表pos位置处插入元素 * @param list 单链表指针 * @param node 元素指针 * @param pos 插入的索引 */int LinkList_Insert(LinkList *list,LinkListNode *node,int pos){    //类型转换    TLinkList* l_list = (TLinkList *)list;    //判断链表指针和节点指针不能为空,当前插入的位置是否合法    int ret = ((list != 0) && (node != 0) && (pos >= 0) && (pos <= l_list->length));    if(ret)    {        LinkListNode* current = (LinkList *)l_list;        int i;        //移动到需要插入的位置的前驱        for(i = 0; i < pos;i++)        {            current = current->next;        }        node->next = current->next;   //被插入节点的后继指针指向前驱节点的后继指针        current->next = node;         //前驱节点的后继指针指向被插入节点        l_list->length++;    }    return ret;}/* * 获取单链表中索引位置处的元素 * @param list   单链表指针 * @param pos   单链表索引值 * @param return 元素指针 */LinkListNode* LinkList_Get(LinkList *list,int pos){    LinkListNode* node = 0;    TLinkList * l_list = (TLinkList *)list;    //判断链表指针不为空,且获取的索引合法    if( (l_list != 0) && (pos >= 0) && (pos < l_list->length) )    {        LinkListNode* current = (LinkList *)l_list;        int i;        for(i = 0; i < pos; i++)        {            current = current->next;        }        node = current->next;    }    return node;}/* * 删除单链表中索引位置处的值 * @param list 单链表的指针 * @param pos   单链表索引 * @param return 非0表示删除成功 */int LinkList_Remove(LinkList *list,int pos){    TLinkList * l_list = (TLinkList *)list;    int ret = ((l_list != 0) && (pos >= 0) && (pos < l_list->length));    if(ret)    {        LinkListNode* current = (LinkList *)l_list;        int i;        for(i = 0; i < pos; i++)        {            current = current->next;        }        //被删除元素的前驱元素的后继指针,指向被删除元素的后继指针        current->next = current->next->next;        l_list->length--;    }    return ret;}/* * 获取单链表当前已存储元素的个数 * @param list 单链表的指针 * @return 单链表中已存储元素的个数 */int LinkList_Length(LinkList *list){    int ret = -1;    if(list != 0)    {        TLinkList * l_list = (TLinkList *)list;        ret = l_list->length;    }    return ret;}

测试代码

#include #include "Linklist.h"typedef struct _node{    LinkListNode node;    int v;}Node;int main(void){   int i;   Node n[5];   Node *node;   for(i = 0;i < 5;i++)   {       n[i].v = i;   }   LinkList *list = LinkList_Create();   for(i = 0; i < 5;i++)   {        LinkList_Insert(list,(LinkListNode *)&(n[i]),0);   }   LinkList_Remove(list,2);   for(i = 0; i < LinkList_Length(list);i++)   {       node = (Node *)LinkList_Get(list,i);       printf("%d\n",node->v);   }   return 0;}



推荐阅读
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 如何在跨函数中使用内存?
    本文介绍了在跨函数中使用内存的方法,包括使用指针变量、动态分配内存和静态分配内存的区别。通过示例代码说明了如何正确地在不同函数中使用内存,并提醒程序员在使用动态分配内存时要手动释放内存,以防止内存泄漏。 ... [详细]
author-avatar
仔田
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有