首页 > 其他分享 >记录C语言实现的单向链表

记录C语言实现的单向链表

时间:2023-11-11 20:11:20浏览次数:32  
标签:node OSMutex root void 单向 snode C语言 链表 data

利用C语言实现的单向链表接口函数。

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>



typedef void* OSMutex_t;

// duration: -1 forever; 0 no wait; n million seconds.
// return 0 if success.
static int OSMutex_lock(OSMutex_t mutex, int duration) {
    return 0;
}

static int OSMutex_unlock(OSMutex_t mutex) {
    return 0;
}


#if 1
struct snode {
    struct snode* next;
    void* data;
};


bool snode_append(struct snode** root, void* data, OSMutex_t mutex) {
    struct snode* node = malloc(sizeof(struct snode));
    if (NULL == node) {
        //assert(0);
        return false;
    }

    node->data = data;
    node->next = NULL;

    // -1: forever
    if (!OSMutex_lock(mutex, -1)) {
        while(*root) {
            root = &(*root)->next;
        }
        *root = node;
        OSMutex_unlock(mutex);
        return true;
    } else {
        free(node);
    }
    
    return false;
}

bool snode_insert_head(struct snode** root, void* data, OSMutex_t mutex) {
    struct snode* node = malloc(sizeof(struct snode));
    if (NULL == node) {
        //assert(0);
        return false;
    }

    node->data = data;

    // -1: forever
    if (!OSMutex_lock(mutex, -1)) {
        node->next = *root;
        *root = node;
        OSMutex_unlock(mutex);
        return true;
    } else {
        free(node);
    }
    
    return false;
}


bool snode_find_and_fetch(struct snode** root, int (*compare)(void* src, void* target), void* target, OSMutex_t mutex, void** pv) {
    struct snode* node = NULL;
    
    // -1: forever
    if (!OSMutex_lock(mutex, -1)) {
        while(*root) {
            if (!compare((*root)->data, target)) {
                node = *root;
                *root = node->next;
                node->next = NULL;
                break;
            }
            root = &(*root)->next;
        }
        OSMutex_unlock(mutex);
    }
    
    if (node) {
        if (pv) {
            *pv = node->data;
        }
        free(node);
        return true;
    }
    
    return false;
}

bool snode_free_list(struct snode** root, void (*callback)(void* node), OSMutex_t mutex) {
    struct snode* head;
    struct snode* node;
    
    // -1: forever
    if (!OSMutex_lock(mutex, -1)) {
        head = *root;
        *root = NULL;
        OSMutex_unlock(mutex);
        
        while(head) {
            node = head;
            head = node->next;

            if (callback) {
                callback(node->data);
            }
            free(node);
        }

        return true;
    }
    
    return false;
}

void snode_display(struct snode** root, void (*print)(void* data), OSMutex_t mutex) {
    // -1: forever
    if (!OSMutex_lock(mutex, -1)) {
        while(*root) {
            print((*root)->data);
            root = &(*root)->next;
        }
        OSMutex_unlock(mutex);
    }
}

#endif

#if 1
static void node_print(void* data)  {
    printf("%d ", (int)data);
}

static int node_compare(void* src, void* target) {
    return (int)src - (int)target;
}

static void node_free_callback(void* data) {
    printf("free node, data is %d.\n", (int)data);
}

void test(void) {
    const int node_max = 10;
    struct snode* list = NULL;
    OSMutex_t mutex = NULL;
    
    for (int i=0; i<node_max; i++) {
        printf("append node-%d with value %d ", i, i);
        if (snode_append(&list, (void*)i, mutex)) {
            printf("success.\n");
        } else {
            printf("failed.\n");
        }
    }
    printf("node list is: ");
    snode_display(&list, node_print, mutex);
    printf("\n");
    
    void* data;
    for (int i=0; i<node_max; i++) {
        if (i&0x01) {
            printf("remove node-%d ", i); 
            if (snode_find_and_fetch(&list, node_compare, (void*)i, mutex, &data)) {
                printf("success, value=%d.\n", (int)data);
            } else {
                printf("failed.\n");
            }
        }
    }
    printf("node list is: ");
    snode_display(&list, node_print, mutex);
    printf("\n");
    
    printf("insert 99 at list head.\n");
    snode_insert_head(&list, (void*)99, NULL);
    printf("insert 88 at list head.\n");
    snode_insert_head(&list, (void*)88, NULL);
    printf("insert 77 at list head.\n");
    snode_insert_head(&list, (void*)77, NULL);
    printf("insert 66 at list head.\n");
    snode_insert_head(&list, (void*)66, NULL);
    printf("node list is: ");
    snode_display(&list, node_print, mutex);
    printf("\n");
    
    printf("free node list.\n");
    snode_free_list(&list, node_free_callback, mutex);
    printf("node list is: ");
    snode_display(&list, node_print, mutex);
    printf("\n");
    
    printf("finish\n");
}
#endif

int main(void) {
    test();
    getchar();
}

 

 

C:\Users\xx\Desktop>tcc.exe -run snode.c
append node-0 with value 0 success.
append node-1 with value 1 success.
append node-2 with value 2 success.
append node-3 with value 3 success.
append node-4 with value 4 success.
append node-5 with value 5 success.
append node-6 with value 6 success.
append node-7 with value 7 success.
append node-8 with value 8 success.
append node-9 with value 9 success.
node list is: 0 1 2 3 4 5 6 7 8 9
remove node-1 success, value=1.
remove node-3 success, value=3.
remove node-5 success, value=5.
remove node-7 success, value=7.
remove node-9 success, value=9.
node list is: 0 2 4 6 8
insert 99 at list head.
insert 88 at list head.
insert 77 at list head.
insert 66 at list head.
node list is: 66 77 88 99 0 2 4 6 8
free node list.
free node, data is 66.
free node, data is 77.
free node, data is 88.
free node, data is 99.
free node, data is 0.
free node, data is 2.
free node, data is 4.
free node, data is 6.
free node, data is 8.
node list is:
finish
测试输出

 

不能在中断服务函数里面调用这些接口。

 

标签:node,OSMutex,root,void,单向,snode,C语言,链表,data
From: https://www.cnblogs.com/ssdq/p/17826253.html

相关文章

  • C语言:初识五大常量
    今天我们介绍的是C语言中的五大常量,分别是字面常量,const常量,#define定义的标识符常量,字符串常量以及枚举常量。以上的五大常量我都会依次介绍。1、字面常量字面常量也就是我们在程序中见到的数字,比如100,200之类,较为基础我们就简单带过,我们要重点了解下面的四种常量。2、const常量co......
  • C语言程序练习题10
    以下是一个示例的C语言程序代码,用于实现一个简单的计算器,可以进行加减乘除四则运算。#include<stdio.h>intmain(){floatnum1,num2;charoperator;printf("请输入第一个数字:");scanf("%f",&num1);printf("请输入运算符(+,-,*,/):");......
  • C语言之指针(中)
    动态内存分配动态变量所谓的动态变量是指:在写程序时无法确定它们的存在,只有当程序运行起来,随着程序的运行,根据程序的需求动态产生和消亡的变量。因此,动态变量的访问需要通过指向动态变量的指针变量来进行间接访问。当程序运行结束时,系统会自动回收指针占用的空间,但并不会回收指针指......
  • C语言入门:基本语法
    如果你刚刚接触到C语言,而且感到自己写不出代码,别灰心,这是正常的学习过程。学习编程是一个渐进的过程,不要急于求成。通过不断的实践和学习,你会发现编程变得越来越容易。当你刚开始学习C语言时,最好从一个简单的"Hello,World!"程序开始,这是学习任何编程语言的传统入门方式。以下是一......
  • 链表
    单链表插入从头开始遍历列表找到第i-1个节点将指针域指向第i-1个节点的next新建节点s值为data将next指向data单链表删除从头开始遍历列表找到第i-1个节点将指针域从第i-1个节点的next指向第i+1个节点释放第i个节点的内存空间代码参考资料C语言实现单链表的创建及......
  • C语言编程 C语言入门
    1.初识C语言(1){C语言程序设计教程笔记}1基础框架/*#include<stdio.h>//格式intmain()//输入{printf("helloworld\n");//打印system("pause");//显示return0;//返回}/2注释单行//整段/...*/或Ctrl+k+c注释Ctrl+k+u解除注释//char字符类型'W'字母int数字150float小数//%......
  • 数据结构入门 — 链表详解_双向链表
    前言数据结构入门—双向链表详解*关注博主,后期持续更新系列文章文章末尾有源码*****感谢观看,希望对你有所帮助*****系列文章第一篇:数据结构入门—链表详解_单链表第二篇:数据结构入门—链表详解_双向链表第三篇:数据结构入门—链表详解_循环链表文章目录前言系列文章什......
  • 利用快慢指针,求链表的中间结点,判断链表是否是环形链表
    前言(1)在学习数据结构链表部分的时候,老师给出了几个题目。其中两个题目采用了快慢指针的技术,感觉有意思,于是写一篇博客记录一下。快慢指针(1)我们先来介绍一下快慢指针技术。这个说起来其实很简单,就是龟兔赛跑问题。(2)兔子跑的比乌龟快,我们可以利用这个特性,来解决一些实际按理。求链表......
  • 看完C语言的发展历程对于Android的发展不在迷茫
    前言现在从事Android开发,前景怎么样呢?要是放在以前问起这个问题,我肯定拍胸脯的说赶紧来,狠狠赚上一笔!!!现在想想,移动互联网的发展不知不觉已经十多年了,MobileFirst也已经变成了AIFirst。换句话说,我们已经不再是“风口上的猪”。移动开发的光环和溢价开始慢慢消失,并且正在向AI、......
  • 链表
    链表单链表插入一个节点的伪代码算法:创建一个新节点newNode,将要插入的数据data存储在newNode中如果链表为空,则将newNode设为头节点,并将next指向NULL如果链表不为空,则将newNode插入到链表的末尾遍历链表,找到最后一个节点lastNode将lastNode的next指向newNode将newNode的n......