【数据结构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);    //相当于把表头也释放了
    }
}

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

相关推荐
没落之王6 分钟前
三易五行看宋朝的三界确立
大数据·人工智能·算法
坤坤子吖41 分钟前
算法学习——单调队列
开发语言·c++·笔记·学习·算法
Js.Tx2 小时前
【具体数学 Concrete Mathematics】2.1.5 一般性的方法
算法·具体数学
秋天的怀念_David4 小时前
算法一千零一夜 · 作品相关:版权与致谢声明
程序人生·算法·学习方法
图灵-M4 小时前
【数据结构】静态 & 动态顺序表
c语言·数据结构·笔记
揽星河..4 小时前
【C语言】数组
c语言·开发语言·算法
careathers4 小时前
【数据结构】基于比较的排序算法 - 选择排序
数据结构·算法·排序算法
听风若依4 小时前
C++模板初阶
c++·算法
纪念 2295 小时前
C++ 算法(模拟)
开发语言·c++·算法
揽星河..5 小时前
【C语言】函数
c语言·算法