mirror of
				https://github.com/krahets/hello-algo.git
				synced 2025-11-04 06:07:20 +08:00 
			
		
		
		
	add zig codes for Section 'Hash Map' and 'Linear Search'
This commit is contained in:
		@ -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");
 | 
					        const run_step_hash_map= b.step("run_hash_map", "Run hash_map");
 | 
				
			||||||
        run_step_hash_map.dependOn(&run_cmd_hash_map.step);
 | 
					        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"
 | 
					    // Section: "Bubble Sort"
 | 
				
			||||||
        // Source File: "chapter_sorting/bubble_sort.zig"
 | 
					        // Source File: "chapter_sorting/bubble_sort.zig"
 | 
				
			||||||
        // Run Command: zig build run_bubble_sort
 | 
					        // Run Command: zig build run_bubble_sort
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										55
									
								
								codes/zig/chapter_searching/linear_search.zig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								codes/zig/chapter_searching/linear_search.zig
									
									
									
									
									
										Normal file
									
								
							@ -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;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -19,3 +19,17 @@ pub fn ListNode(comptime T: type) type {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 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;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -3,5 +3,7 @@
 | 
				
			|||||||
// Author: sjinzh (sjinzh@gmail.com)
 | 
					// Author: sjinzh (sjinzh@gmail.com)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub const PrintUtil = @import("PrintUtil.zig");
 | 
					pub const PrintUtil = @import("PrintUtil.zig");
 | 
				
			||||||
pub const ListNode = @import("ListNode.zig").ListNode;
 | 
					pub const ListUtil = @import("ListNode.zig");
 | 
				
			||||||
pub const TreeNode = @import("TreeNode.zig").TreeNode;
 | 
					pub const ListNode = ListUtil.ListNode;
 | 
				
			||||||
 | 
					pub const TreeUtil = @import("TreeNode.zig");
 | 
				
			||||||
 | 
					pub const TreeNode = TreeUtil.TreeNode;
 | 
				
			||||||
		Reference in New Issue
	
	Block a user