【数据结构2】带头结点·单向链表实现

目录

一、带头结点单向链表

二、接口设计

三、接口实现

[3.1 创建链表](#3.1 创建链表)

[3.2 链表头插](#3.2 链表头插)

[3.3 任意合法位置插入](#3.3 任意合法位置插入)

[3.4 删除元素](#3.4 删除元素)

[3.5 遍历链表](#3.5 遍历链表)

[3.6 释放表和空间](#3.6 释放表和空间)


一、带头结点单向链表

由于后续还有带头指针单向链表,把节点结构定义在common.h中

复制代码
C

typedef int Element_t;
// 节点结构
typedef struct _node
{
    Element_t val;
    struct _node *next;    //节点的下一节点
}Node_t;

带头结点单向的链表头结构

复制代码
C

typedef struct
{
    Node_t head;  //定义一个空间
    int count;
}LinkList_t;

二、接口设计

1、创建链表

2、链表头插

3、链表任意合法位置插入

4、删除链表中某个元素

5、遍历链表中所有元素

6、释放表和空间

复制代码
C

LinkList_t *createLinkList();
void releaseLinkList(LinkList_t *table);

int insertLinkListHeader(LinkList_t * table,Element_t val);
int insertLinkListPos(LinkList_t * table,int pos,Element_t val);

int deleteLinkListElement(LinkList_t *table,Element_t val);

void showLinkList(const LinkList_t * table);

三、接口实现

3.1 创建链表
复制代码
C

LinkList_t *createLinkList()
{
    // 定义一个表
    LinkList_t *table = NULL; 
    // 堆上申请空间
    table = malloc(sizeof(LinkList_t));  
    if (table == NULL)
    {
        return NULL;
    }

    // 初始化
    table->head.val = 0;
    table->head.next = NULL;;
    table->count = 0;

    return table;
}
3.2 链表头插
复制代码
C

int insertLinkListHeader(LinkList_t* table, Element_t val)
{
    // 带头结点常用做法
    Node_t *p = &table->head;

    Node_t *new_node = malloc(sizeof(Node_t));
    if (new_node == NULL)
    {
        return -1;
    }
    new_node->val = val;

    //节点插入
    new_node->next = p->next;
    p->next = new_node;

    ++table->count;
    return 0;
}
3.3 任意合法位置插入
复制代码
C

int insertLinkListPos(LinkList_t* table, int pos, Element_t val)
{
    // 位置合法性判断
    if (pos < 0 || pos > table->count)
    {
        printf("insert pos invalid\n");
        return -1;
    }
    // 找到p == pos-1位置,插入位置的前一个位置
    Node_t *p = &table->head;
    int index = -1;
    while (index < pos-1)
    {
        p = p->next;
        ++index;
    }
    if (p == NULL)
    {
        return -1;
    }
    Node_t *new_node = malloc(sizeof(Node_t));
    new_node->val = val;
    // 节点插入
    new_node->next = p->next;
    p->next = new_node;

    ++table->count;

    return 0;
}
3.4 删除元素
复制代码
C

int deleteLinkListElement(LinkList_t* table, Element_t val)
{
    Node_t *p = &table->head; 
    while (p->next)
    {
        if (p->next->val == val)
        {
            break;
        }
        p = p->next;
    }

    if (p->next == NULL)
    {
        printf("not find\n");
        return -1;
    }
    // 删除元素
    Node_t* tmp = p->next;
    p->next = tmp->next;

    free(tmp);
    --table->count;

    return 0;
}
3.5 遍历链表
复制代码
C


void showLinkList(const LinkList_t* table)
{
    // 访问head下一个节点
    Node_t *p = table->head.next;
    printf("link list:%d\n",table->count);

    while (p)
    {
        printf("%d\t",p->val);
        p = p->next;
    }
    printf("\n");
}
3.6 释放表和空间
复制代码
C


void releaseLinkList(LinkList_t* table)
{
    if (table)
    {
        Node_t *p = &table->head;
        Node_t *tmp;
        while (p->next)
        {
            tmp = p->next;
            p->next = tmp->next;

            free(tmp);
            --table->count;
        }
        printf("table have %d element\n",table->count);
        free(table);    //相当于把表头也释放了
    }
}

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

相关推荐
小雨下雨的雨5 小时前
井字棋AI机器人实现详解 - Minimax算法实战-鸿蒙PC Electron框架完成
前端·人工智能·算法·华为·electron·鸿蒙
xieliyu.8 小时前
Java算法精讲:双指针(三)
java·开发语言·算法
一条小锦吕*8 小时前
基于Spring Boot + 数据可视化 + 协同过滤算法的推荐系统设计与实现(源码+论文+部署全讲解)
spring boot·算法·信息可视化
cfm_291410 小时前
Redis五大基本数据结构底层了解
数据结构·数据库·redis
如竟没有火炬10 小时前
最大矩阵——单调栈
数据结构·python·线性代数·算法·leetcode·矩阵
8Qi810 小时前
LeetCode 1143 & 718:最长公共子序列 / 最长重复子数组
算法·leetcode·职场和发展·动态规划
绿算技术11 小时前
万卡推理集群存储选型分析:从核心架构到应用视角
大数据·科技·算法·架构
想吃火锅100512 小时前
【leetcode】1.两数之和js版
javascript·算法·leetcode
net3m3312 小时前
一阶软件低通滤波器算法
人工智能·算法