快速利用c语言搭建一个链表(linklist)

    链表是一种基础且重要的数据结构,在c语言中是必须熟练掌握的知识。现我们通过编写一个自己的链表程序,熟悉c语言如何创建和调用链表。

一、声明

    我们先创建一个linklist.h头文件,声明一个LinkList结构体,并声明其中需要用到的方法:

#ifndef TEST1_LINKLIST_H
#define TEST1_LINKLIST_H

struct LinkList
{
    int data;
    struct LinkList *next;
};

typedef struct LinkList linkList;

linkList* linkListInit();

int linkListDelElem(linkList *,int elem);

int linkListInsertSort(linkList **,int data);

int linkListInsertElem(linkList *,int index,int data);

int freeLinkList(linkList *);

void printLinkList(linkList *);

#endif //TEST1_LINKLIST_H

二、实现

2.1,初始化方法实现

    我这边使用的方法比较笨拙,动态申请初始化了一个未存储数据的结构体对象作为头(大家可以通过传入一个指针的指针,这个方法更好)。

linkList* linkListInit()
{
    linkList *head = (linkList*)malloc(sizeof(linkList)); //动态申请堆空间,初始化一个链表头
    if(!head)
    {
        printf("linkList init failed,exit.....");
        exit(0);
    }
    head->next = NULL;//链表头的下一个元素指向为null
    return head;//返回链表头
}

2.2,插入元素方法

    这里链表插入数据方法我设置了指定位置可以插入链表元素。

int linkListInsertElem(linkList *head,int index,int data)
{

    linkList *linkNode,*curNode;//定义两个链表元素指针

    curNode = head;//获取传入的链表
    int j = 0;

    while(curNode&&j<index-1)//如果插入位置满足在链表长度范围内,进行插入
    {
        curNode = curNode->next;
        j++;
    }

    if(!curNode||j>index) //大家其实可以设置如果插入位置大于链表,则在末尾插入
    {
        printf("error insert index!\n");
        exit(0);
    }


    linkNode = (linkList *)malloc(sizeof(linkList));//申请新的堆空间
    if(!linkNode)
    {
        printf("linkNode malloc failed");
        return 0;
    }

    linkNode->data = data;//新增链表元素设置值

    linkNode->next = curNode->next;//插入操作
    curNode->next = linkNode;//插入操作

    return 1;

}

2.3,排序插入方法

int linkListInsertSort(linkList **mp,int data)
{
    linkList *linkNode,*curNode;

    curNode = (*mp)->next;

    while(curNode&&data>curNode->data)//判断值大小
    {
        mp = &curNode->next;
        curNode = *mp;//存入当前元素地址
    }
    linkNode = (linkList *)malloc(sizeof(linkList));
    if(!linkNode)
    {
        printf("linkNode malloc failed");
        return 0;
    }
    linkNode->data = data;//元素插入
    linkNode->next = curNode;//元素插入
    *mp = linkNode;


    return 1;

}

2.4,根据值删除元素

int linkListDelElem(linkList *head,int elem)
{
    linkList *linkNode,*curNode;
    curNode = head;
    bool flag = false;
    while(curNode)
    {
        if(curNode->data==elem) //判断值是否相等
        {
            flag = true;
            head = curNode->next;//删除元素节点
            free(curNode);//释放堆空间
            break;
        }
        curNode = curNode->next;
    }
    if(flag)
    {
        return 1;
    } else
    {
        printf("the link list not have this node data\n");
        return 0;
    }

}

2.5,输出列表方法

void printLinkList(linkList *head)
{

    linkList *curNode = head->next;

    while(curNode)
    {

        printf("%d\n",curNode->data);
        curNode = curNode->next;
    }


}

2.6,释放内存方法

int freeLinkList(linkList *head)
{
    linkList *linkNode = head;
    linkList *curNode;

    while(linkNode){
        curNode = linkNode->next;
        free(linkNode);
        linkNode = curNode;
    }
    return 1;
}

三、测试输出

    我们运行测试程序,输出如下:

int main() {

    linkList *l = linkListInit();
    linkListInsertElem(l,1,100);
    linkListInsertElem(l,1,300);
    printLinkList(l);
    freeLinkList(l);
    linkList *p = linkListInit();
    linkListInsertElem(p,1,10);
    linkListInsertSort(&p, 200);
    linkListInsertSort(&p, 100);
    linkListInsertSort(&p, 90);
    printLinkList(p);
    freeLinkList(p);
    return 0;
}

上一篇:Ubuntu24.04安装Anaconda3+Pycharm-二、安装 Anaconda


下一篇:开源项目低代码表单设计器FcDesigner扩展右侧组件的配置规则