千家信息网

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

发表于:2025-01-24 作者:千家信息网编辑
千家信息网最后更新 2025年01月24日,LinkList.h#ifndef LINK_LIST_H#define LINK_LIST_H//链表节点typedef struct _LinkListNode{ struct _LinkL
千家信息网最后更新 2025年01月24日【C语言数据结构】单链表

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;}


0