当前位置:首页 > 编程笔记 > 正文
已解决

Linux 链表示例 LIST_INIT LIST_INSERT_HEAD

来自网友在路上 159859提问 提问时间:2023-09-26 09:08:20阅读次数: 59

最佳答案 问答题库598位专家为你答疑解惑

list(3) — Linux manual page

用Visual Studio 2022创建CMake项目

* CmakeLists.txt

# CMakeList.txt : Top-level CMake project file, do global configuration
# and include sub-projects here.
#
cmake_minimum_required (VERSION 3.12)project ("llist")# Include sub-projects.
add_subdirectory ("llist")

* llist/CMakeLists.txt

# CMakeList.txt : CMake project for llist, include source and define
# project specific logic here.
#
cmake_minimum_required (VERSION 3.12)# Add source to this project's executable.
add_executable (llist "llist.c" "llist.h")if (CMAKE_VERSION VERSION_GREATER 3.12)set_property(TARGET llist PROPERTY CXX_STANDARD 11)
endif()# TODO: Add tests and install targets if needed.

* llist/llist.h

// llist.h : Include file for standard system include files,
// or project specific include files.#pragma once#ifndef NULL
#define NULL (void *)0
#endif
/** List definitions.*/
#define LIST_HEAD(name, type)                                           \
struct name {                                                           \struct type *lh_first;  /* first element */                     \
}#define LIST_HEAD_INITIALIZER(head)                                     \{ NULL }#define LIST_ENTRY(type)                                                \
struct {                                                                \struct type *le_next;   /* next element */                      \struct type **le_prev;  /* address of previous next element */  \
}/** List functions.*/
#define LIST_INIT(head) do {                                            \(head)->lh_first = NULL;                                        \
} while (/*CONSTCOND*/0)#define LIST_INSERT_AFTER(listelm, elm, field) do {                     \if (((elm)->field.le_next = (listelm)->field.le_next) != NULL)  \(listelm)->field.le_next->field.le_prev =               \&(elm)->field.le_next;                              \(listelm)->field.le_next = (elm);                               \(elm)->field.le_prev = &(listelm)->field.le_next;               \
} while (/*CONSTCOND*/0)#define LIST_INSERT_BEFORE(listelm, elm, field) do {                    \(elm)->field.le_prev = (listelm)->field.le_prev;                \(elm)->field.le_next = (listelm);                               \*(listelm)->field.le_prev = (elm);                              \(listelm)->field.le_prev = &(elm)->field.le_next;               \
} while (/*CONSTCOND*/0)#define LIST_INSERT_HEAD(head, elm, field) do {                         \if (((elm)->field.le_next = (head)->lh_first) != NULL)          \(head)->lh_first->field.le_prev = &(elm)->field.le_next;\(head)->lh_first = (elm);                                       \(elm)->field.le_prev = &(head)->lh_first;                       \
} while (/*CONSTCOND*/0)#define LIST_REMOVE(elm, field) do {                                    \if ((elm)->field.le_next != NULL)                               \(elm)->field.le_next->field.le_prev =                   \(elm)->field.le_prev;                               \*(elm)->field.le_prev = (elm)->field.le_next;                   \
} while (/*CONSTCOND*/0)#define LIST_FOREACH(var, head, field)                                  \for ((var) = ((head)->lh_first);                                \(var);                                                  \(var) = ((var)->field.le_next))/** List access methods.*/
#define LIST_EMPTY(head)                ((head)->lh_first == NULL)
#define LIST_FIRST(head)                ((head)->lh_first)
#define LIST_NEXT(elm, field)           ((elm)->field.le_next)// TODO: Reference additional headers your program requires here.

llist/llist.c

/* llist.c : Defines the entry point for the application.* /
/* #include <sys/queue.h> */
#include <stdio.h>
#include <stdlib.h> /* malloc, free */
#include <string.h> /* strcpy */
#include "llist.h"struct entry {char s[256];LIST_ENTRY(entry) entries;
};
LIST_HEAD(listhead, entry);int main()
{struct listhead head;struct entry* n1, * n2, * np;/* Initialize the list */LIST_INIT(&head);/* Insert at the head */n1 = malloc(sizeof(struct entry));strcpy_s(n1->s, 256, "line#1");LIST_INSERT_HEAD(&head, n1, entries);/* Insert after */n2 = malloc(sizeof(struct entry));strcpy_s(n2->s, 256, "line#2");LIST_INSERT_AFTER(n1, n2, entries);struct entry* n3;n3 = malloc(sizeof(struct entry));strcpy_s(n3->s, 256, "line#3");LIST_INSERT_BEFORE(n2, n3, entries);LIST_FOREACH(np, &head, entries) {printf("%s\n", np->s);}LIST_REMOVE(n2, entries);free(n2);LIST_FOREACH(np, &head, entries) {printf("%s\n", np->s);}/* Destroy */while (LIST_FIRST(&head) != NULL) {LIST_REMOVE(LIST_FIRST(&head), entries);free(LIST_FIRST(&head));}return 0;
}

选择最外层的CMakeLists.txt 右键Build

CMakePresets.json

{"version": 3,"configurePresets": [{"name": "windows-base","hidden": true,"generator": "Ninja","binaryDir": "${sourceDir}/out/build/${presetName}","installDir": "${sourceDir}/out/install/${presetName}","cacheVariables": {"CMAKE_C_COMPILER": "cl.exe","CMAKE_CXX_COMPILER": "cl.exe"},"condition": {"type": "equals","lhs": "${hostSystemName}","rhs": "Windows"}},{"name": "x64-debug","displayName": "x64 Debug","inherits": "windows-base","architecture": {"value": "x64","strategy": "external"},"cacheVariables": {"CMAKE_BUILD_TYPE": "Debug"}},{"name": "x64-release","displayName": "x64 Release","inherits": "x64-debug","cacheVariables": {"CMAKE_BUILD_TYPE": "Release"}},{"name": "x86-debug","displayName": "x86 Debug","inherits": "windows-base","architecture": {"value": "x86","strategy": "external"},"cacheVariables": {"CMAKE_BUILD_TYPE": "Debug"}},{"name": "x86-release","displayName": "x86 Release","inherits": "x86-debug","cacheVariables": {"CMAKE_BUILD_TYPE": "Release"}},{"name": "linux-debug","displayName": "Linux Debug","generator": "Ninja","binaryDir": "${sourceDir}/out/build/${presetName}","installDir": "${sourceDir}/out/install/${presetName}","cacheVariables": {"CMAKE_BUILD_TYPE": "Debug"},"condition": {"type": "equals","lhs": "${hostSystemName}","rhs": "Linux"},"vendor": {"microsoft.com/VisualStudioRemoteSettings/CMake/1.0": {"sourceDir": "$env{HOME}/.vs/$ms{projectDirName}"}}},{"name": "macos-debug","displayName": "macOS Debug","generator": "Ninja","binaryDir": "${sourceDir}/out/build/${presetName}","installDir": "${sourceDir}/out/install/${presetName}","cacheVariables": {"CMAKE_BUILD_TYPE": "Debug"},"condition": {"type": "equals","lhs": "${hostSystemName}","rhs": "Darwin"},"vendor": {"microsoft.com/VisualStudioRemoteSettings/CMake/1.0": {"sourceDir": "$env{HOME}/.vs/$ms{projectDirName}"}}}]
}

See also: SysTutorials LIST_INSERT_AFTER (3) - Linux Manuals

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"Linux 链表示例 LIST_INIT LIST_INSERT_HEAD":http://eshow365.cn/6-13850-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!