IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> [数据结构] 二.单链表及其C语言实现 -> 正文阅读

[数据结构与算法][数据结构] 二.单链表及其C语言实现

单链表也是线性表的一种物理结构(储存结构)

它的特点是逻辑上相邻的元素物理位置上并不一定相邻, 所以单链表不需要一块连续的内存, 可以更好地利用内存

它利用指针去指向下一个节点, 因此它的缺点是不能随机访问, 只能由前一个节点找到后一个节点,
而且指针也会占用额外的内存

算法时间复杂度:

  • 找到某个索引的节点: O(n), (不能随机访问,只能从头开始找)
  • 在头部/尾部插入节点: O(1)

  • 在中间某位置插入节点: O(n) (因为需要找到节点的位置)
  • 删除头部/尾部节点(如果有尾指针): O(1)

  • 删除中间某位置的节点: O(n) (也是因为需要找到节点位置)

C语言实现:

/**
 * @file linked_list.c
 * @author xiaoxiao (you@domain.com)
 * @brief 单链表
 * @version 0.1
 * @date 2022-03-01
 * 
 * @copyright Copyright (c) 2022
 * 
 */
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef struct Node {
    struct Node * next;
    int data;
}Node;

typedef Node* PNode;

/**
 * @brief 初始化表头(无数据)
 * 
 * @return PNode 表头
 */
PNode initalList(){
    /** 表头不存储数据*/ 
    PNode pHead = (PNode) malloc(sizeof(Node));
    pHead -> next = NULL;
    return pHead;
}

/**
 * @brief 在尾部插入一个元素
 * 
 * @param pHead 链表头
 * @param data 数据值
 */
void insertInTail(PNode pHead, int data){
    
    PNode pCurrent = pHead;
    while(pCurrent -> next != NULL){
        pCurrent = pCurrent -> next;
    }
    pCurrent -> next = (PNode)(malloc(sizeof(Node)));
    pCurrent -> next -> next = NULL;
    pCurrent -> next -> data = data;
}

/**
 * @brief 在任意索引插入一个元素
 * 1是在表头后面(第一个元素)插入
 * 
 * @param pHead 链表头 
 * @param index 索引
 * @param data 数据值
 */
bool insertByIndex(PNode pHead, int index, int data){
    PNode pCurrent = pHead;
    int i = 1;
    while(pCurrent != NULL){
        if(i == index){
            PNode pNewNode = (PNode)malloc(sizeof(Node)); // 新节点
            pNewNode -> data = data;
            pNewNode -> next = pCurrent -> next;
            pCurrent -> next = pNewNode;
            return true;
        }
        pCurrent = pCurrent -> next;
        i ++;
    }
    printf("索引大于链表长度+1\n");
    return false;
}

/**
 * @brief 删除尾部元素
 * 
 * @param pHead 链表头
 */
void deleteTail(PNode pHead){
    PNode pCurrent = pHead;
    PNode pPrev = NULL;
    while(pCurrent -> next != NULL){
        pPrev = pCurrent;
        pCurrent = pCurrent -> next;
    }
    pPrev -> next = NULL;
    free(pCurrent);
}

bool deleteByIndex(PNode pHead, int index){
    PNode pCurrent = pHead;
    for(int i = 1; i < index; i++){
        if(pCurrent -> next != NULL){
            pCurrent = pCurrent -> next;
        }
        else{
            printf("索引大于链表长度\n");
            return false;
        }
        // pCurrent是要删除的前一个节点
    }
    if(pCurrent -> next == NULL){ // 这就是最后一个节点
        printf("索引大于链表长度\n");
        return false;
    }
    PNode pNext = pCurrent -> next -> next;
    free(pCurrent -> next);
    pCurrent -> next = pNext;
    return true;
}

/**
 * @brief 打印链表
 * 
 * @param pHead 链表头
 */
void printList(PNode pHead){
    PNode pCurrent = pHead -> next;
    printf("打印链表: ");
    while(pCurrent != NULL){
        printf("%d ", pCurrent -> data);
        pCurrent = pCurrent -> next;
    }   
}

int main(){
    printf("----------------\n");
    PNode pHead = initalList();
    insertInTail(pHead, 2);
    insertInTail(pHead, 4);
    insertInTail(pHead, 10);
    insertByIndex(pHead, 10, 7);
    deleteByIndex(pHead, 2);
    printList(pHead);
    printf("\n----------------\n");
    return 0;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-04 15:50:05  更:2022-03-04 15:52:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 16:52:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码