首页 > 其他分享 >C语言实现链表增删减改

C语言实现链表增删减改

时间:2024-04-22 20:37:23浏览次数:15  
标签:Head 结点 next 链表 LList 减改 C语言 data

/*******************************************************************
*

  • file name: main.c
  • author : [email protected]
  • date : 2024/04/22
  • function : 实现对链表的增删改查
  • note : None
  • CopyRight (c) 2023-2024 [email protected] All Right Reseverd
  • *****************************************************************/

include <stdio.h>

include <stdbool.h>

include <stdlib.h>

// 指的是单向链表中的结点有效数据类型,用户可以根据需要进行修改
typedef int DataType_t;

// 构造链表的结点,链表中所有结点的数据类型应该是相同的
typedef struct LinkedList
{
DataType_t data; // 结点的数据域
struct LinkedList *next; // 结点的指针域

} LList_t;

/*******************************************************************
*

  • 函数名称: LList_Create

  • 函数功能: 输出两个整数中较大的整数

  • 函数参数: void

  • 返回结果: 创建链表地址

  • 注意事项: None

  • 函数作者: [email protected]

  • 创建日期: 2024/04/22

  • 修改历史:

  • 函数版本: V1.0

  • *****************************************************************/
    // 创建一个空链表,空链表应该有一个头结点,对链表进行初始化
    LList_t *LList_Create(void)
    {
    // 1.创建一个头结点并对头结点申请内存
    LList_t *Head = (LList_t *)calloc(1, sizeof(LList_t));
    if (NULL == Head)
    {
    perror("Calloc memory for Head is Failed");
    exit(-1);
    }

    // 2.对头结点进行初始化,头结点是不存储有效内容的!!!
    Head->next = NULL;

    // 3.把头结点的地址返回即可
    return Head;
    }

/*******************************************************************
*

  • 函数名称: LList_NewNode

  • 函数功能: 创建新的结点,并对新结点进行初始化(数据域 + 指针域)

  • 函数参数: data

  • 返回结果: 新节点地址

  • 注意事项: None

  • 函数作者: [email protected]

  • 创建日期: 2024/04/22

  • 修改历史:

  • 函数版本: V1.0

  • *****************************************************************/
    LList_t *LList_NewNode(DataType_t data)
    {
    // 1.创建一个新结点并对新结点申请内存
    LList_t *New = (LList_t *)calloc(1, sizeof(LList_t));
    if (NULL == New)
    {
    perror("Calloc memory for NewNode is Failed");
    return NULL;
    }

    // 2.对新结点的数据域和指针域进行初始化
    New->data = data;
    New->next = NULL;

    return New;
    }

/*******************************************************************
*

  • 函数名称: LList_HeadInsert

  • 函数功能: 实现对链表头部插入

  • 函数参数: data

  • 返回结果: 插入成功或否

  • 注意事项: None

  • 函数作者: [email protected]

  • 创建日期: 2024/04/22

  • 修改历史:

  • 函数版本: V1.0

  • *****************************************************************/
    bool LList_HeadInsert(LList_t *Head, DataType_t data)
    {
    // 1.创建新的结点,并对新结点进行初始化
    LList_t *New = LList_NewNode(data);
    if (NULL == New)
    {
    printf("can not insert new node\n");
    return false;
    }

    // 2.判断链表是否为空,如果为空,则直接插入即可
    if (NULL == Head->next)
    {
    Head->next = New;
    return true;
    }

    // 3.如果链表为非空,则把新结点插入到链表的头部
    New->next = Head->next;
    Head->next = New;

    return true;
    }
    /*******************************************************************

  • 函数名称: LList_TailInsert

  • 函数功能: 实现对链表尾部插入

  • 函数参数: LList_t *Head, DataType_t data

  • 返回结果: 插入成功或否

  • 注意事项: None

  • 函数作者: [email protected]

  • 创建日期: 2024/04/22

  • 修改历史:

  • 函数版本: V1.0

  • */
    bool LList_TailInsert(LList_t Head, DataType_t data)
    {
    LList_t New = LList_NewNode(data);
    if (NULL == New)
    {
    printf("can not insert new node\n");
    return false;
    }
    LList_t Phead = Head;
    while (Phead->next)
    {
    Phead = Phead->next;
    }
    Phead->next = New;
    New->next = NULL;
    return true;
    }
    /

  • 函数名称: LList_DestInsert

  • 函数功能: 实现对链表任意位置插入

  • 函数参数: LList_t *Head, DataType_t dest, DataType_t data

  • 返回结果: 插入成功或否

  • 注意事项: None

  • 函数作者: [email protected]

  • 创建日期: 2024/04/22

  • 修改历史:

  • 函数版本: V1.0

  • *****************************************************************/
    bool LList_DestInsert(LList_t *Head, DataType_t dest, DataType_t data)
    {
    LList_t *New = LList_NewNode(data);
    if (NULL == New)
    {
    printf("can not insert new node\n");
    return false;
    }

    LList_t *Phead1 = Head;
    LList_t *Phead2 = Head;
    for (int i = 0; i < dest; i++)
    {
    Phead1 = Phead1->next;
    }
    for (int j = 0; j <= dest; j++)
    {
    New->next = Phead2;
    Phead1->next = New;
    }
    Phead2->next = New;
    }

/*******************************************************************
*

  • 函数名称: LList_Print

  • 函数功能: 遍历链表输出

  • 函数参数: LList_t *Head

  • 返回结果: 插入成功或否

  • 注意事项: None

  • 函数作者: [email protected]

  • 创建日期: 2024/04/22

  • 修改历史:

  • 函数版本: V1.0

  • *****************************************************************/
    void LList_Print(LList_t *Head)
    {
    // 对链表的头文件的地址进行备份
    LList_t *Phead = Head;

    // 首结点
    while (Phead->next)
    {
    // 把头的直接后继作为新的头结点
    Phead = Phead->next;

     // 输出头结点的直接后继的数据域
     printf("data = %d\n", Phead->data);
    

    }
    }

/*******************************************************************
*

  • 函数名称: LList_HeadDelate
  • 函数功能: 链表头部删除
  • 函数参数: LList_t *Head, DataType_t data
  • 返回结果: 删除成功或否
  • 注意事项: None
  • 函数作者: [email protected]
  • 创建日期: 2024/04/22
  • 修改历史:
  • 函数版本: V1.0
  • *****************************************************************/
    bool LList_HeadDelate(LList_t *Head, DataType_t data)
    {
    LList_t *Phead = Head->next;
    if (NULL == Head->next)
    {
    return false;
    }
    Head->next = Head->next->next;
    Head->next->next = NULL;
    free(Phead);
    }

/*******************************************************************
*

  • 函数名称: LList_TailDelate

  • 函数功能: 链表尾部删除

  • 函数参数: LList_t *Head, DataType_t data

  • 返回结果: 删除成功或否

  • 注意事项: None

  • 函数作者: [email protected]

  • 创建日期: 2024/04/22

  • 修改历史:

  • 函数版本: V1.0

  • *****************************************************************/
    bool LList_TailDelate(LList_t *Head, DataType_t data)
    {
    // 判断链表是否为空
    if (NULL == Head->next)
    {
    return false;
    }
    // 对链表的头文件的地址进行备份
    LList_t *Phead1 = Head;
    LList_t *Phead2 = Head;

    // 首结点开始进行遍历
    int count = 0;
    while (Phead1->next)
    {
    Phead1 = Phead1->next;
    // 计数器
    count++;
    }
    // 通过计数器遍历到倒数第二个结点的为止
    for (int i = 0; i < count - 1; i++)
    {
    Phead2 = Phead2->next;
    }

    Phead2->next = NULL;
    // 释放所删除结点占用空间
    free(Phead1);
    return true;
    }
    /*******************************************************************

  • 函数名称: LList_DestDelate

  • 函数功能: 链表任意位置删除

  • 函数参数: LList_t *Head, DataType_t data

  • 返回结果: 删除成功或否

  • 注意事项: None

  • 函数作者: [email protected]

  • 创建日期: 2024/04/22

  • 修改历史:

  • 函数版本: V1.0

  • *****************************************************************/
    bool LList_DestDelate(LList_t *Head, DataType_t data)
    {
    LList_t *Phead1 = Head->next;
    LList_t *Phead2 = Head->next;
    int count = 0;
    // 判断链表是否为空
    if (NULL == Head)
    {
    perror("Calloc memory for Head is Failed");
    exit(-1);
    }
    // 第一次遍历找到data所在位置
    while (Phead1)
    {
    Phead1 = Phead1->next;
    // 用计数器记录遍历次数
    count++;
    if (Phead1->data == data)
    break;
    }
    // 通过计数器使第二次遍历到所删结点的直接前驱结点
    for (int i = 0; i < count - 1; i++)
    {
    Phead2 = Phead2->next;
    }
    Phead2->next = Phead1->next;
    free(Phead1);
    return true;
    }

int main(int argc, char const *argv[])
{

return 0;

}

标签:Head,结点,next,链表,LList,减改,C语言,data
From: https://www.cnblogs.com/zeratul/p/18151442

相关文章

  • 单向顺序链表的创建,增,删,减,查
    单向顺序链表的创建,增,删,减,查/********************************************************************* filename: 单向顺序链表的创建,增,删,减,查* author :[email protected]* date : 2024-4-22* function:* note :None** CopyRight(c)20241764......
  • 对链表中最小数据项对应的结点删除
    //指的是顺序表中的元素的数据类型,用户可以根据需要进行修改typedefintDataType_t;//构造链表SeqList—_t的结点,结点中包含数据域和指针域,并且所有结点中的数据应该相同typedefstructSeqList{DataType_tData;structSeqList*next;}LinkList_t;//创建......
  • 设计一个算法删除单链表L(有头结点)中的一个最小值结点。
    思路1:定义一个变量=遍历每一个当前地址下面的数据和下一个作比较,谁小把谁的值给这个变量,同时记录这个小值的位置i,依次遍历比较,得到最小值和最小值的结点i的值,然后删除这个结点。思路2:给两个指针,p1,p2开始都指向第一个,然后p2指向下一个地址,和p1下的data作比较,得到的小值的p不动......
  • 基于C语言的顺序表的建立,及各类功能函数实现
    常规链表建立列举常见的顺序表功能实现函数,进行编程练习常规顺序表(sequeue)建立定义一个顺序表的大小,结构体中采用数组而不是另一个堆内存空间表示存储的数据信息。typedefintdata_t;//定义顺序表中数据元素的数据类型#defineN20//定义顺序表的容量typed......
  • 实验3 C语言函数应用编程
    实验任务11#include<stdio.h>2#include<stdlib.h>3#include<time.h>4#include<windows.h>5#defineN8067voidprint_text(intline,intcol,chartext[]);//函数声明8voidprint_spaces(intn);//函数声明9voidprint......
  • C语言——函数基本知识
    什么是函数函数的定义函数就是程序中独立的功能。(简单来说就是把代码打包成整体,起个名字,方便以后使用)函数的使用定义函数的格式格式:返回值类型函数名(形参1,形参2,...){ 函数体; return返回值;}例子:intmax(intnum1,intnum2){ inta; if(num1>num2)......
  • c语言程序设计——实验报告六
    c语言程序设计——实验报告六实验项目名称:实验项目类型:验证性实验日期:一、实验目的熟练掌握三种循环语句并能正确运用;能够用循环实现一些常用算法,如穷举法,迭代法,递推法等;进一步学习程序调试;了解中国算法,百钱买百鸡。二、实验硬、软件环境Windows计算机、Devc6.0......
  • C语言程序设计-实验报告6
    实验项目名称:实验6循环结构程序设计(for语句的应用)实验项目类型:验证性实验日期:2024年4月15日一、实验目的1.熟练掌握三种循环语句并能正确运用;2.能够用循环实现一些常用算法,如穷举法,迭代法,递推法等;3.进一步学习程序调试;4.了解中国算法,百钱买百鸡。二、实验硬、软件环境......
  • C语言程序设计-实验报告5
    实验项目名称:实验5循环结构程序设计(while、do-while语句的应用)实验项目类型:验证性实验日期:2024年4月11日一、实验目的1.熟练掌握三种循环语句并能正确运用;2.能够用循环实现一些常用算法,如穷举法,迭代法,递推法等;3.进一步学习程序调试;4.了解中国算法,百钱买百鸡。二、实验......
  • 在C语言中如何找到字符串的长度
    在C语言中处理字符串时,你需要知道如何找到它们的长度。在许多情况下,找到C语言中字符串的长度都是至关重要的。你可能需要执行字符串操作,而许多字符串操作函数都需要字符串的长度作为参数。你可能还需要验证用户输入、比较两个字符串,或者动态管理和分配内存。在本文中,你将学习在......