数据结构C语言链表的实现介绍

目录
  • 前言
  • 函数
    • 1. 链表初始化
    • 2. 计算链表长度
    • 3. 打印链表
    • 4.计算链表长度
    • 5. 删除链表中指定位置节点
    • 6. 向链表中指定位置插入节点
    • 7. 全代码+运行效果

前言

需要用到的函数库

#include<stdio.h>
#include<malloc.h>

malloc函数用来动态分配空间,相当于Java中new的作用

先是需要创建一个节点的结构体

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

函数

1. 链表初始化

void iniLinkList(linkNode *fp){//初始化链表传入一个头节点
    linkNode *point = fp;//定义一个指针指向头节点
    for(int i=0;i<5;i++){
        linkNode *node = malloc(sizeof(linkNode));
        node->data=i;
        node->next=NULL;
        point->next = node;
        point=point->next;
    }
}

2. 计算链表长度

int countListLength(linkNode *fp){//fp:链表头节点
    linkNode *point = fp;//定义指针指向头节点
    int sum = 0;         //用来计算链表节点个数
    while(point->next){
        sum++;
        point=point->next;
    }
    return sum;
}

3. 打印链表

void printLinkList(linkNode *fp){//传入链表头节点
    linkNode *point = fp;//定义指针指向头节点
    printf("链表内容如下:\n");
    while(point->next){
        linkNode *node = point->next;
        printf("%d\t",node->data);
        point=point->next;
    }
    printf("\n");
}

4.计算链表长度

int countListLength(linkNode *fp){//fp:链表头节点
    linkNode *point = fp;//定义指针指向头节点
    int sum = 0;         //用来计算链表节点个数
    while(point->next){
        sum++;
        point=point->next;
    }
    return sum;
}

5. 删除链表中指定位置节点

int deleteNode(int index,linkNode *fp){//index:链表中节点的下标,fp:链表头节点
    linkNode *point = fp;//定义指针指向头节点
    if(index<0||index>(countListLength(fp)-1)){//判断index是否有效(在链表长度范围内)
        printf("下标不在链表内!");
        return 1;                           //返回1表示删除失败
    }else{
        for(int i=0;i<index;i++){           //遍历找到下标前一个位置
            point=point->next;
        }
        linkNode *node = point->next;
        point->next=node->next;             //删除下标位置节点
        return 0;                           //返回0表示删除成功
    }
}

6. 向链表中指定位置插入节点

void insertLinkNode(linkNode *fp,int index,int data){//index:链表中节点的下标,fp:链表头节点,data:插入的新数据
    linkNode *point = fp;//定义指针指向头节点
    if(index<0||index>(countListLength(fp)-1)){//判断index是否有效(在链表长度范围内)
        printf("下标不在链表内!");
        return;
    }else{
        for (int i=0;i<index;i++)
        point=point->next;                  //找到下标位置前一个节点

        linkNode *node = malloc(sizeof(linkNode));
        node->data=data;                    //创建新节点
        node->next=point->next;             //将下标前一个节点的next赋值给node的next
        point->next = node;                 //将新创建的节点的地址给下标位置前一个节点
    }
}

7. 全代码+运行效果

#include<stdio.h>
#include<malloc.h>
typedef struct{
    int data;
    struct linkNode* next;
}linkNode;
//初始化链表
void iniLinkList(linkNode *fp){//初始化链表传入一个头节点
    linkNode *point = fp;//定义一个指针指向头节点
    for(int i=0;i<5;i++){
        linkNode *node = malloc(sizeof(linkNode));
        node->data=i;
        node->next=NULL;
        point->next = node;
        point=point->next;
    }
}
//向链表中指定位置插入节点
void insertLinkNode(linkNode *fp,int index,int data){//index:链表中节点的下标,fp:链表头节点,data:插入的新数据
    linkNode *point = fp;//定义指针指向头节点
    if(index<0||index>(countListLength(fp)-1)){//判断index是否有效(在链表长度范围内)
        printf("下标不在链表内!");
        return;
    }else{
        for (int i=0;i<index;i++)
        point=point->next;                  //找到下标位置前一个节点

        linkNode *node = malloc(sizeof(linkNode));
        node->data=data;                    //创建新节点
        node->next=point->next;             //将下标前一个节点的next赋值给node的next
        point->next = node;                 //将新创建的节点的地址给下标位置前一个节点
    }
}
//删除链表中指定位置节点
int deleteNode(int index,linkNode *fp){//index:链表中节点的下标,fp:链表头节点
    linkNode *point = fp;//定义指针指向头节点
    if(index<0||index>(countListLength(fp)-1)){//判断index是否有效(在链表长度范围内)
        printf("下标不在链表内!");
        return 1;                           //返回1表示删除失败
    }else{
        for(int i=0;i<index;i++){           //遍历找到下标前一个位置
            point=point->next;
        }
        linkNode *node = point->next;
        point->next=node->next;             //删除下标位置节点
        return 0;                           //返回0表示删除成功
    }
}
//计算链表长度
int countListLength(linkNode *fp){//fp:链表头节点
    linkNode *point = fp;//定义指针指向头节点
    int sum = 0;         //用来计算链表节点个数
    while(point->next){
        sum++;
        point=point->next;
    }
    return sum;
}
//打印链表
void printLinkList(linkNode *fp){//传入链表头节点
    linkNode *point = fp;//定义指针指向头节点
    printf("链表内容如下:\n");
    while(point->next){
        linkNode *node = point->next;
        printf("%d\t",node->data);
        point=point->next;
    }
    printf("\n");
}
int main(){
    linkNode *linkList = malloc(sizeof(linkNode));//创建一个头节点
    iniLinkList(linkList);
    printLinkList(linkList);
    deleteNode(3,linkList);
    printf("删除后");
    printLinkList(linkList);
    insertLinkNode(linkList,3,7);
    printf("插入后");
    printLinkList(linkList);
    return 0;
}
//	链表内容如下:
//	0       1       2       3       4
//	删除后链表内容如下:
//	0       1       2       4
//	插入后链表内容如下:
//	0       1       2       7       4

到此这篇关于数据结构C语言链表的实现介绍的文章就介绍到这了,更多相关C语言链表实现内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解C语言之单链表

    目录 一.思路步骤 1. 定义结构体 2.初始化 3.求当前数据元素的个数 4.插入 5.删除 6.释放内存空间 二.代码 总结 一.思路步骤 1. 定义结构体 a.数据域:用来存放数据 b.指针域:用来存放下一个数据的位置 2.初始化 申请头结点,并将其初始化为空 3.求当前数据元素的个数 a.设置一个指针变量p指向头结点和计数变量size等于0 b.循环判断p->next是否为空,如果不为空,就让指针p指向它的直接后继结点,并让size自增 c.返回size 4.插入 a.设置两个指针,一个

  • C语言实现循环双链表

    本文实例为大家分享了C语言实现循环双链表的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<stdlib.h> #include<stdbool.h> typedef int DataType; typedef struct Node { DataType data; // 数据域 struct Node * prior; // 前趋指针 struct Node * next; // 后继指针 }LinkList; LinkLis

  • C语言实现单链表的基本功能详解

    1.首先简单了解一下链表的概念: 要注意的是链表是一个结构体实现的一种线性表,它只能从前往后,不可以从后往前(因为next只保存下一个节点的地址).在实现单链表的操作时,需要用指针来操作.很简单,注释写的很详细,欢迎大家指正哈哈哈哈~之前写的太烂了重新写了一下..... 2.代码展示: #include <stdio.h> #include <assert.h> #include <stdlib.h> typedef struct linklist { int data

  • 老生常谈C语言链表小结

    目录 链表的概念及结构 概念 结构 链表的分类 单链表的实现(无头) 双向链表的实现 总结:链表和顺序表的区别 链表的概念及结构 概念 链表是一种物理存储结构上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 . 结构 代码 struct Slist { int* a; struct Slist* next; }; 逻辑结构: 物理结构: 注意: 从上图可以看出,链式结构在逻辑上是连续的,但是在物理上是不一定是连续的. 这些结点一般是从堆上申请出来的. 从堆上申请的空

  • 数据结构C语言链表的实现介绍

    目录 前言 函数 1. 链表初始化 2. 计算链表长度 3. 打印链表 4.计算链表长度 5. 删除链表中指定位置节点 6. 向链表中指定位置插入节点 7. 全代码+运行效果 前言 需要用到的函数库 #include<stdio.h> #include<malloc.h> malloc函数用来动态分配空间,相当于Java中new的作用 先是需要创建一个节点的结构体 typedef struct{ int data; struct linkNode* next; }linkNode;

  • C语言数据结构之单向链表详解分析

    链表的概念:链表是一种动态存储分布的数据结构,由若干个同一结构类型的结点依次串连而成. 链表分为单向链表和双向链表. 链表变量一般用指针head表示,用来存放链表首结点的地址. 每个结点由数据部分和下一个结点的地址部分组成,即每个结点都指向下一个结点.最后一个结点称为表尾,其下一个结点的地址部分的值为NULL(表示为空地址). 特别注意:链表中的各个结点在内存中是可以不连续存放的,具体存放位置由系统分配. 例如:int *ptr ; 因此不可以用ptr++的方式来寻找下一个结点. 使用链表的优点

  • C语言数据结构之复杂链表的拷贝

    题目: 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点. 构造这个链表的 深拷贝. 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值.新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态.复制链表中的指针都不应指向原链表中的节点 . 例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y

  • C语言数据结构之单链表的实现

    目录 一.为什么使用链表 二.链表的概念 三.链表的实现 3.1 创建链表前须知 3.2 定义结构体 3.3 申请一个节点 3.4 链表的头插 3.5 链表的尾插 3.6 链表的尾删 3.7 链表的头删 3.8 寻找某节点 3.9 在指定节点前插入节点 3.10 删除指定节点前的节点 3.11 链表的销毁 一.为什么使用链表 在学习链表以前,我们存储数据用的方式就是数组.使用数组的好处就是便于查找数据,但缺点也很明显. 使用前需声明数组的长度,一旦声明长度就不能更改 插入和删除操作需要移动大量的

  • C语言数据结构之单链表的查找和建立

    目录 单链表的查找 按位查找 按值查找 单链表的建立 尾插法 头插法建立单链表 单链表的查找 其实在单链表的插入和删除中,我们已经使用过单链表的查找方法,因为插入和删除的前提都是先找到对应的结点,所以这里就不再多解释 按位查找 GetElem(L, i):按位查找操作.获取表 L 中第 i 个位置的元素的值 //按位查找 LNode * GetElem(LinkList L, int i) { if (i < 0) return false; LNode *p; //指针p指向当前扫描到的结点

  • 数据结构 C语言实现循环单链表的实例

    数据结构 C语言实现循环单链表的实例 实例代码: //=========杨鑫========================// //循环单链表的实现 #include <stdio.h> #include <stdlib.h> typedef int ElemType; //定义结点类型 typedef struct Node { ElemType data; struct Node *next; }Node,*LinkedList; int count = 0; //1.单循环

  • C语言数据结构之使用链表模拟栈的实例

    C语言数据结构之使用链表模拟栈的实例 以下是"使用链表模拟栈"的简单示例: 1. 用C语言实现的版本 #include<stdio.h> #include<stdlib.h> typedef char datatype; typedef struct node{ datatype data; struct node *next; } stack; stack* m_stack = NULL; /* 创建链表,从表头插入新元素 */ void creat(void

  • C语言实现通用数据结构之通用链表

    本文实例为大家分享了c语言实现通用数据结构之通用链表的具体代码,供大家参考,具体内容如下 忽然想起来,大概在两年之前学习C语言的时候,曾经用C语言写过一些通用的数据结构.主要也就实现了链表.队列.椎.HashSet,还有HashMap.当时只是知道标准的C语言中没有这方面的类库,后来才知道有很多第三方的类似这样的类库.废话不多说,先把代码粘过来. 下面实现的是通用链表,注意链表中只存储了指针,没有储存实际的数据. 头文件 /************************* *** File m

  • C语言数据结构之单链表与双链表的增删改查操作实现

    目录 前言 单链表的增删改查 定义结构体以及初始化 增加结点 删除结点 查找修改结点 移除结点 最终效果 双链表的基本操作 初始化建表 遍历双链表 指定位置插入结点 指定位置删除结点 查找结点位置 最终效果 结语 前言 上篇博客分享了创建链表传入二级指针的细节,那么今天就分享几个c语言课程实践设计吧.这些程序设计搞懂了的话相当于链表的基础知识牢牢掌握了,那么再应对复杂的链表类的题也就能慢慢钻研了.学习是一个积累的过程,想要游刃有余就得勤学苦练! 单链表的增删改查 (1)项目需求 构造带有头结点的

  • C语言数据结构之单链表存储详解

    目录 1.定义一个链表结点 2.初始化单链表 3.输出链表数据 4.完整代码 如果说,顺序表的所占用的内存空间是连续的,那么链表则是随机分配的不连续的,那么为了使随机分散的内存空间串联在一起形成一种前后相连的关系,指针则起到了关键性作用. 单链表的基本结构: 头指针:永远指向链表第一个节点的位置. 头结点:不存任何数据的空节点,通常作为链表的第一个节点.对于链表来说,头节点不是必须的,它的作用只是为了方便解决某些实际问题. 首元结点:首个带有元素的结点. 其他结点:链表中其他的节点. 1.定义一

随机推荐