1570af302Sopenharmony_ci/** 2570af302Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 3570af302Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4570af302Sopenharmony_ci * you may not use this file except in compliance with the License. 5570af302Sopenharmony_ci * You may obtain a copy of the License at 6570af302Sopenharmony_ci * 7570af302Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8570af302Sopenharmony_ci * 9570af302Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10570af302Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11570af302Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12570af302Sopenharmony_ci * See the License for the specific language governing permissions and 13570af302Sopenharmony_ci * limitations under the License. 14570af302Sopenharmony_ci */ 15570af302Sopenharmony_ci#include <stdio.h> 16570af302Sopenharmony_ci#include <stdlib.h> 17570af302Sopenharmony_ci#include <string.h> 18570af302Sopenharmony_ci#include <sys/queue.h> 19570af302Sopenharmony_ci#include "test.h" 20570af302Sopenharmony_ci#include "functionalext.h" 21570af302Sopenharmony_ci 22570af302Sopenharmony_ci#define NODE_TEN 10 23570af302Sopenharmony_ci#define NODE_TWENTY 20 24570af302Sopenharmony_ci#define NODE_THIRTY 30 25570af302Sopenharmony_ci 26570af302Sopenharmony_ci// 定义链表节点结构 27570af302Sopenharmony_cistruct Node { 28570af302Sopenharmony_ci int data; 29570af302Sopenharmony_ci LIST_ENTRY(Node) entries; 30570af302Sopenharmony_ci}; 31570af302Sopenharmony_ci 32570af302Sopenharmony_ci// 定义链表头结构 33570af302Sopenharmony_ciLIST_HEAD(Head, Node) head = LIST_HEAD_INITIALIZER(head); 34570af302Sopenharmony_ci 35570af302Sopenharmony_ci// 插入节点到链表 36570af302Sopenharmony_civoid insert_node(int data) 37570af302Sopenharmony_ci{ 38570af302Sopenharmony_ci struct Node *new_node = (struct Node*)malloc(sizeof(struct Node)); 39570af302Sopenharmony_ci EXPECT_PTRNE("insert_node", new_node, NULL); 40570af302Sopenharmony_ci new_node->data = data; 41570af302Sopenharmony_ci LIST_INSERT_HEAD(&head, new_node, entries); 42570af302Sopenharmony_ci} 43570af302Sopenharmony_ci 44570af302Sopenharmony_ci// 删除节点 45570af302Sopenharmony_civoid delete_node(int data) 46570af302Sopenharmony_ci{ 47570af302Sopenharmony_ci struct Node *node; 48570af302Sopenharmony_ci LIST_FOREACH(node, &head, entries) { 49570af302Sopenharmony_ci if (node->data == data) { 50570af302Sopenharmony_ci LIST_REMOVE(node, entries); 51570af302Sopenharmony_ci free(node); 52570af302Sopenharmony_ci return; 53570af302Sopenharmony_ci } 54570af302Sopenharmony_ci } 55570af302Sopenharmony_ci} 56570af302Sopenharmony_ci 57570af302Sopenharmony_ci// 遍历链表并返回所有节点值的字符串 58570af302Sopenharmony_civoid traverse_list(char *result, size_t result_len) 59570af302Sopenharmony_ci{ 60570af302Sopenharmony_ci struct Node *node; 61570af302Sopenharmony_ci char buffer[20]; 62570af302Sopenharmony_ci size_t pos = 0; 63570af302Sopenharmony_ci LIST_FOREACH(node, &head, entries) { 64570af302Sopenharmony_ci int res = snprintf(buffer, sizeof(buffer), "%d ", node->data); 65570af302Sopenharmony_ci EXPECT_GTE("traverse_list -> snprintf", res, 0); 66570af302Sopenharmony_ci size_t len = strlen(buffer); 67570af302Sopenharmony_ci if (pos + len < result_len) { 68570af302Sopenharmony_ci strcpy(result + pos, buffer); 69570af302Sopenharmony_ci pos += len; 70570af302Sopenharmony_ci } 71570af302Sopenharmony_ci } 72570af302Sopenharmony_ci} 73570af302Sopenharmony_ci 74570af302Sopenharmony_ci// C 测试用例 75570af302Sopenharmony_civoid slist_0100() 76570af302Sopenharmony_ci{ 77570af302Sopenharmony_ci char result[100]; 78570af302Sopenharmony_ci 79570af302Sopenharmony_ci // 插入节点到链表 80570af302Sopenharmony_ci insert_node(NODE_TEN); 81570af302Sopenharmony_ci insert_node(NODE_TWENTY); 82570af302Sopenharmony_ci insert_node(NODE_THIRTY); 83570af302Sopenharmony_ci 84570af302Sopenharmony_ci // 验证链表内容是否符合预期 85570af302Sopenharmony_ci traverse_list(result, sizeof(result)); 86570af302Sopenharmony_ci EXPECT_STREQ("slist_0100", result, "30 20 10 "); 87570af302Sopenharmony_ci 88570af302Sopenharmony_ci // 删除节点并验证链表内容 89570af302Sopenharmony_ci delete_node(NODE_TWENTY); 90570af302Sopenharmony_ci traverse_list(result, sizeof(result)); 91570af302Sopenharmony_ci EXPECT_STREQ("slist_0100", result, "30 10 "); 92570af302Sopenharmony_ci} 93570af302Sopenharmony_ci 94570af302Sopenharmony_ciint main() 95570af302Sopenharmony_ci{ 96570af302Sopenharmony_ci slist_0100(); 97570af302Sopenharmony_ci return t_status; 98570af302Sopenharmony_ci} 99