首页 > 其他分享 >C语言单向链表的增删操作

C语言单向链表的增删操作

时间:2024-04-23 09:13:58浏览次数:25  
标签:Head 结点 next 链表 LList 增删 New C语言 data

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

typedef int DataType_t;

  

// 构造链表的结点,链表中所有结点的数据类型应该是相同的
typedef struct LinkedList

{

    DataType_t data;         // 结点的数据域

    struct LinkedList *next; // 结点的指针域

  

} LList_t;
  

// 创建一个空链表,空链表应该有一个头结点,对链表进行初始化

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_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;

}

  

// 头插

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;

}

  

// 尾插

bool LList_TailInsert(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.如果链表为非空,则把新结点插入到链表的尾部

    LList_t *Last = Head;

    while (Last->next != NULL)

    {

        Last = Last->next;

    }

    New->next = NULL;

    Last->next = New;

  

    return true;

}

  

// 指定插

bool LList_DestInsert(LList_t *Head, DataType_t dest, 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.如果链表为非空,则把新结点插入到链表的指定位置

    LList_t *Dest = Head;

    while (Dest->data != dest)

    {

        Dest = Dest->next;

    }

    New->next = Dest->next;

    Dest->next = New;

  

    return true;

}

  

// 头删

bool LList_HeadDel(LList_t *Head, DataType_t data)

{

    LList_t *Temp = Head->next;

    Head->next = Temp->next;

    free(Temp);

  

    return true;

}

  

// 尾删

bool LList_TailDel(LList_t *Head, DataType_t data)

{

    LList_t *SecondLast = Head;

    while (SecondLast->next->next != NULL)

    {

        SecondLast = SecondLast->next;

    }

    free(SecondLast->next);

    SecondLast->next = NULL;

  

    return true;

}

  

// 指定删

bool LList_DestDel(LList_t *Head, DataType_t dest, DataType_t data)

{

    LList_t *LDest = Head;

    while ((LDest->next)->data != dest)

    {

        LDest = LDest->next;

    }

    LDest->next = LDest->next->next;

    free(LDest->next);

  

    return true;

}

  

// 设计一个算法删除单链表L(有头结点)中的一个最小值结点

bool LList_MinDel(LList_t *Head, DataType_t data)

{

    LList_t *LDest = Head;

    LList_t *LMin = LDest;

    while (LDest->next != NULL)

    {

        if ((LDest->next)->data < (LMin->next)->data)

        {

            LMin->next = LDest->next;

            LMin = LDest;

        }

        LDest = LDest->next;

        LDest->next = LDest->next->next;

    }

    LMin->next = LMin->next->next;

    free(LMin->next);

  

    return true;

}

  

// 遍历

void LList_Print(LList_t *Head)

{

    // 对链表的头文件的地址进行备份

    LList_t *Phead = Head;

  

    // 首结点

    while (Phead->next)

    {

        // 把头的直接后继作为新的头结点

        Phead = Phead->next;

  

        // 输出头结点的直接后继的数据域

        printf("data = %d\n", Phead->data);

    }

}

  

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

{

  

    return 0;

}

标签:Head,结点,next,链表,LList,增删,New,C语言,data
From: https://www.cnblogs.com/beborn00/p/18152042

相关文章

  • 笔试题:查找链表中倒数第k(k为正整数)个位置上的结点
    数据结构链表笔试题:(1)算法的基本设计思想:定义两个结构体指针FPhead和SPhead,其中,FPhead需要从头遍历链表,当FPhead和SPhead之间的距离相差k-1,则调动SPhead开始遍历链表,从而确定倒数第k个位置上的结点。(2)算法的详细实现步骤:定义一个整型变量用来储存两个结构体指针FPhead和SP......
  • 数据结构链表笔试题
    数据结构链表笔试题笔试题3:设计一个算法删除单链表L(有头结点)中的一个最小值结点/********************************************************************* 函数名称: LList_Del* 函数功能:删除链表中最小值节点* 函数参数: * @L:传递头节点的地址*返回......
  • 倒数链表
    看了上面这个考研专题后,小白经过深思熟虑,可以备份俩个头结点,然后分别进行遍历,因为需要知道倒数第K个结点的地址,所以,当循环遍历时,俩个指针在遍历的时候需要间隔k-1次,所以代码如下:/********************************************************************* name : LinkedList_......
  • 链接表的增删
    链接表的增删/************************************************************************************filename:demo.c*cauthor:[email protected]*date:2024/04/22*function:创建链接表并在顺序表中进行增删*note:none*CopyRight......
  • 实验3_C语言函数应用编程
    Task11#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_blank_lines(intn)......
  • 笔试题:设计一个算法删除单链表L(有头结点)中的一个最小值结点
    数据结构——笔试题设计一个算法删除单链表L(有头结点)中的一个最小值结点/*********************************************************funcname:DelMinNode*author:[email protected]*date:2024/04/22*function:删除单链表L(有头结点)中的一个最......
  • 顺序表和链表的练习题
    顺序表题目一:题目分析:该题目需要先对顺序表进行遍历至元素x正确插入位置,再对顺序表完成插入操作。因此涉及到for循环与if语句的使用代码实现/********************************************************************** name : SequenceList_insert* function:实现插......
  • C语言学习笔记
    ​学习C语言是掌握计算机科学的基础,并为学习其他高级编程语言打下坚实的基础。C语言是一种高效率的编程语言,被广泛用于系统软件和应用软件的开发。1、C语言基础变量和数据类型:理解基本数据类型(int,char,float,double等)以及更复杂的类型,如数组和结构体。运算符:熟悉C语言支持......
  • 查找链表中倒数第k(k为正整数)个位置上的结点,查找成功输出该结点的data值,并返回1,否则只
    /********************************************************name:FindKNode* function:查找链表中倒数第k(k为正整数)个位置上的结点*查找成功输出该结点的data值,并返回1,否则只返回0*argument*@head:链表头结点的地......
  • 查找链表中倒数第k个值
    查找链表中倒数第k个值/********************************************************************** name : deletelinkedlist* function:假设该链表只给出了头指针head。在不改变链表的前提下,请设计一个尽可能高效的算法,*查找链表中倒数第k(k为正整数......