数据结构之链表1(单项链表)

本文详细介绍了链表的基本概念,包括其定义、时间复杂度及示例实现。通过C语言的具体实现,展示了如何创建链表节点、初始化链表、在头部或尾部添加元素等关键操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 链表的定义

  • 链表的时间复杂度(证明过程稍后补充)

    • 插入 - O(1),随机插入时复杂度为O(n)

    • 删除 - O(n)

    • 搜索 - O(n)

  • 示例实现

#ifndef LINKED_LIST_H_INCLUDED
#define LINKED_LIST_H_INCLUDED

struct _vslnode
{
    int val;
    struct _vslnode *next;
};
typedef struct _vslnode o_vslnode;

struct _vslist
{
    o_vslnode *head;
    o_vslnode *tail;
};
typedef struct _vslist o_vslist;

o_vslnode *malloc_vslnode(int val);
void free_vslnode(o_vslnode *node);
o_vslnode* vsl_add(o_vslist *p_vsl, int val, int flag /*0- head, 1-tail*/);
void init_vslist(o_vslist *p_list);
#endif // LINKED_LIST_H_INCLUDED

linked_list.c

#include <memory.h>
#include <assert.h>

#include "linked_list.h"

o_vslnode *malloc_vslnode(int val)
{
    o_vslnode *p_node = (o_vslnode*)malloc(sizeof(o_vslnode));
    p_node->val = val;
    return p_node;
}

void free_vslnode(o_vslnode *node)
{
    if (NULL != node)
        free(node);
}

o_vslnode* vsl_add(o_vslist *p_vsl, int val, int flag /*0- head, 1-tail*/)
{
    o_vslnode *p_node;

    assert(NULL != p_vsl);
    assert((0 == flag) || (1 == flag));

    p_node = malloc_vslnode(val);
    if(NULL == p_vsl->head)
        return (p_vsl->head = p_vsl->tail = p_node);
    if (0 == flag)
    {
        p_node->next = p_vsl->head;
        p_vsl->head = p_node;
    }
    else if (1 == flag)
    {
        p_vsl->tail->next = p_node;
        p_vsl->tail = p_node;
    }
    else
    {
        free_vslnode(p_node);
        p_node = NULL;
    }

    return p_node;
}

void init_vslist(o_vslist *p_list)
{
    assert(NULL != p_list);
    p_list->head = p_list->tail = NULL;
}

main.c

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

#include "linked_list.h"

int main()
{
    o_vslist sl;

    init_vslist(&sl);
    vsl_add(&sl, 0, 0);

    printf("Add to empty linked list\n"
           "sl.head:%0x,%d;"
           "sl.tail:%0x,%d.\n",
           (int)(sl.head),sl.head->val, (int)(sl.tail), sl.tail->val);

    vsl_add(&sl, 13, 0);

    printf("Add to linked list head\n"
           "sl.head:%0x,%d;"
           "sl.tail:%0x,%d.\n",
           (int)(sl.head),sl.head->val, (int)(sl.tail), sl.tail->val);

    vsl_add(&sl, 13, 1);

    printf("Add to linked list tail\n"
           "sl.head:%0x,%d;"
           "sl.tail:%0x,%d.\n",
           (int)(sl.head),sl.head->val, (int)(sl.tail), sl.tail->val);

    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值