From 722fb71bddef0c27bd814c618947af408a15aa28 Mon Sep 17 00:00:00 2001 From: sjinzh <99076655+sjinzh@users.noreply.github.com> Date: Fri, 13 Jan 2023 23:23:26 +0800 Subject: [PATCH] add zig codes for Section 'Hash Map' and 'Linear Search' --- codes/zig/build.zig | 14 +++++ codes/zig/chapter_searching/linear_search.zig | 55 +++++++++++++++++++ codes/zig/include/ListNode.zig | 14 +++++ codes/zig/include/include.zig | 6 +- 4 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 codes/zig/chapter_searching/linear_search.zig diff --git a/codes/zig/build.zig b/codes/zig/build.zig index a922ae868..4fae68efa 100644 --- a/codes/zig/build.zig +++ b/codes/zig/build.zig @@ -174,6 +174,20 @@ pub fn build(b: *std.build.Builder) void { const run_step_hash_map= b.step("run_hash_map", "Run hash_map"); run_step_hash_map.dependOn(&run_cmd_hash_map.step); + // Section: "Linear Search" + // Source File: "chapter_searching/linear_search.zig" + // Run Command: zig build run_linear_search + const exe_linear_search = b.addExecutable("linear_search", "chapter_searching/linear_search.zig"); + exe_linear_search.addPackagePath("include", "include/include.zig"); + exe_linear_search.setTarget(target); + exe_linear_search.setBuildMode(mode); + exe_linear_search.install(); + const run_cmd_linear_search = exe_linear_search.run(); + run_cmd_linear_search.step.dependOn(b.getInstallStep()); + if (b.args) |args| run_cmd_linear_search.addArgs(args); + const run_step_linear_search= b.step("run_linear_search", "Run linear_search"); + run_step_linear_search.dependOn(&run_cmd_linear_search.step); + // Section: "Bubble Sort" // Source File: "chapter_sorting/bubble_sort.zig" // Run Command: zig build run_bubble_sort diff --git a/codes/zig/chapter_searching/linear_search.zig b/codes/zig/chapter_searching/linear_search.zig new file mode 100644 index 000000000..a2e7c2a45 --- /dev/null +++ b/codes/zig/chapter_searching/linear_search.zig @@ -0,0 +1,55 @@ +// File: linear_search.zig +// Created Time: 2023-01-13 +// Author: sjinzh (sjinzh@gmail.com) + +const std = @import("std"); +const inc = @import("include"); + +// 线性查找(数组) +fn linearSearchList(comptime T: type, nums: std.ArrayList(T), target: T) T { + // 遍历数组 + for (nums.items) |num, i| { + // 找到目标元素, 返回其索引 + if (num == target) { + return @intCast(T, i); + } + } + // 未找到目标元素,返回 -1 + return -1; +} + +// 线性查找(链表) +pub fn linearSearchLinkedList(comptime T: type, node: ?*inc.ListNode(T), target: T) ?*inc.ListNode(T) { + var head = node; + // 遍历链表 + while (head != null) { + // 找到目标结点,返回之 + if (head.?.val == target) return head; + head = head.?.next; + } + return null; +} + +// Driver Code +pub fn main() !void { + var target: i32 = 3; + + // 在数组中执行线性查找 + var nums = std.ArrayList(i32).init(std.heap.page_allocator); + defer nums.deinit(); + try nums.appendSlice(&[_]i32{ 1, 5, 3, 2, 4, 7, 5, 9, 10, 8 }); + var index = linearSearchList(i32, nums, target); + std.debug.print("目标元素 3 的索引 = {}\n", .{index}); + + // 在链表中执行线性查找 + var mem_arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); + defer mem_arena.deinit(); + const mem_allocator = mem_arena.allocator(); + var head = try inc.ListUtil.listToLinkedList(i32, mem_allocator, nums); + var node = linearSearchLinkedList(i32, head, target); + std.debug.print("目标结点值 3 的对应结点对象为 {any}", .{node}); + + const getchar = try std.io.getStdIn().reader().readByte(); + _ = getchar; +} + diff --git a/codes/zig/include/ListNode.zig b/codes/zig/include/ListNode.zig index ae0246c09..f15ec6625 100644 --- a/codes/zig/include/ListNode.zig +++ b/codes/zig/include/ListNode.zig @@ -18,4 +18,18 @@ pub fn ListNode(comptime T: type) type { self.val = x; } }; +} + +// Generate a linked list with a list +pub fn listToLinkedList(comptime T: type, mem_allocator: std.mem.Allocator, list: std.ArrayList(T)) !?*ListNode(T) { + var dum = try mem_allocator.create(ListNode(T)); + dum.init(0); + var head = dum; + for (list.items) |val| { + var tmp = try mem_allocator.create(ListNode(T)); + tmp.init(val); + head.next = tmp; + head = head.next.?; + } + return dum.next; } \ No newline at end of file diff --git a/codes/zig/include/include.zig b/codes/zig/include/include.zig index 20dfca90f..42cd76cf1 100644 --- a/codes/zig/include/include.zig +++ b/codes/zig/include/include.zig @@ -3,5 +3,7 @@ // Author: sjinzh (sjinzh@gmail.com) pub const PrintUtil = @import("PrintUtil.zig"); -pub const ListNode = @import("ListNode.zig").ListNode; -pub const TreeNode = @import("TreeNode.zig").TreeNode; \ No newline at end of file +pub const ListUtil = @import("ListNode.zig"); +pub const ListNode = ListUtil.ListNode; +pub const TreeUtil = @import("TreeNode.zig"); +pub const TreeNode = TreeUtil.TreeNode; \ No newline at end of file