C语言基础(三十三)

1、链表排序之归并排序与线性搜索

测试代码:

cpp 复制代码
#include "date.h" 
#include <stdio.h>
#include <stdlib.h>

// 链表节点结构体
typedef struct Node {
    int data;
    struct Node *next;
} Node;

// 插入节点到链表末尾
Node* insertNode(Node *head, int data) {
    Node *newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = NULL;

    if (head == NULL) {
        head = newNode;
    } else {
        Node *current = head;
        while (current->next != NULL) {
            current = current->next;
        }
        current->next = newNode;
    }

    return head;
}

// 归并排序
Node* merge(Node *head) {
    if (head == NULL || head->next == NULL) {
        return head;
    }

    // 分割链表
    Node *slow = head, *fast = head->next;
    while (fast != NULL && fast->next != NULL) {
        slow = slow->next;
        fast = fast->next->next;
    }

    Node *head2 = slow->next;
    slow->next = NULL;

    // 合并排序
    head = merge(head);
    head2 = merge(head2);

    Node dummy;
    Node *ptr = &dummy;
    while (head != NULL && head2 != NULL) {
        if (head->data < head2->data) {
            ptr->next = head;
            head = head->next;
        } else {
            ptr->next = head2;
            head2 = head2->next;
        }
        ptr = ptr->next;
    }

    ptr->next = (head != NULL) ? head : head2;

    return dummy.next;
}

// 遍历链表
void printList(Node *head) {
    Node *current = head;
    while (current != NULL) {
        printf("Data: %d, Address: %p\n", current->data, (void*)current);
        current = current->next;
    }
}

// 线性搜索
int linearSearch(Node *head, int target, Node **foundNodes) {
    int count = 0;
    Node *current = head;
    while (current != NULL) {
        if (current->data == target) {
            foundNodes[count] = current;
            count++;
        }
        current = current->next;
    }
    return count;
}

int main() {
	int times = getTime();
    int n;
    printf("Enter the number of random numbers: ");
    scanf("%d", &n);

    Node *head = NULL;
    for (int i = 0; i < n; i++) {
        int randomNumber = rand() % 100; // 生成0-99范围内的随机数
        head = insertNode(head, randomNumber);
    }

    printf("Before sorting:\n");
    printList(head);

    head = merge(head);

    printf("After sorting:\n");
    printList(head);

    int target;
    printf("Enter the element to search for: ");
    scanf("%d", &target);

    Node *foundNodes[n];
    int count = linearSearch(head, target, foundNodes);

    if (count > 0) {
        printf("Found %d elements:\n", count);
        for (int i = 0; i < count; i++) {
            printf("Data: %d, Address: %p\n", foundNodes[i]->data, (void*)foundNodes[i]);
        }
    } else {
        printf("Element not found.\n");
    }

    return 0;
}

运行结果如下:

2、 链表排序之插入排序与二分搜索:

测试代码:

cpp 复制代码
#include "date.h" 
#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int data;
    struct Node* next;
} Node;

// 插入排序
void insertSort(Node** head) {
    if (*head == NULL || (*head)->next == NULL) {
        return;
    }
    
    Node* sorted = NULL;
    Node* current = *head;
    
    while (current != NULL) {
        Node* next = current->next;
        
        if (sorted == NULL || current->data < sorted->data) {
            current->next = sorted;
            sorted = current;
        } else {
            Node* temp = sorted;
            while (temp->next != NULL && temp->next->data < current->data) {
                temp = temp->next;
            }
            current->next = temp->next;
            temp->next = current;
        }
        
        current = next;
    }
    *head = sorted;
}

// 输出链表
void printList(Node* head) {
    Node* current = head;
    while (current != NULL) {
        printf("Data: %d, Address: %p\n", current->data, (void*)current);
        current = current->next;
    }
}

// 二分搜索
Node* binarySearch(Node* head, int target) {
    Node* left = head;
    Node* right = NULL;
    
    // 获取链表结尾
    for (Node* curr = head; curr != NULL; curr = curr->next) {
        right = curr;
    }
    
    while (left != right) {
        Node* mid = left;
        
        int len = 0;
        while (mid != right) {
            len++;
            mid = mid->next;
        }
        len /= 2;
        
        mid = left;
        for (int i = 0; i < len; i++) {
            mid = mid->next;
        }
        
        if (mid->data == target) {
            return mid;
        } else if (mid->data < target) {
            left = mid->next;
        } else {
            right = mid;
        }
    }
    return NULL;
}

int main() {
	int times = getTime();
    int n;
    printf("Enter the number of elements: ");
    scanf("%d", &n);
    
    Node* head = NULL;
    
    // 生成随机数并添加到链表
    for (int i = 0; i < n; i++) {
        Node* newNode = (Node*)malloc(sizeof(Node));
        newNode->data = rand();
        newNode->next = head;
        head = newNode;
    }
    
    printf("Unsorted List:\n");
    printList(head);
    
    // 对链表进行插入排序
    insertSort(&head);
    
    printf("\nSorted List:\n");
    printList(head);
    
    // 二分搜索指定的元素
    int target;
    printf("\nEnter the element to search: ");
    scanf("%d", &target);
    
    Node* result = binarySearch(head, target);
    if (result != NULL) {
        printf("Element found - Data: %d, Address: %p\n", result->data, (void*)result);
    } else {
        printf("Element not found\n");
    }
    
    return 0;
}

运行结果如下;

相关推荐
沐怡旸32 分钟前
【算法】【链表】328.奇偶链表--通俗讲解
算法·面试
掘金安东尼4 小时前
Amazon Lambda + API Gateway 实战,无服务器架构入门
算法·架构
码流之上4 小时前
【一看就会一写就废 指间算法】设计电子表格 —— 哈希表、字符串处理
javascript·算法
用户6120414922135 小时前
C语言做的文本词频数量统计功能
c语言·后端·敏捷开发
快手技术6 小时前
快手提出端到端生成式搜索框架 OneSearch,让搜索“一步到位”!
算法
CoovallyAIHub1 天前
中科大DSAI Lab团队多篇论文入选ICCV 2025,推动三维视觉与泛化感知技术突破
深度学习·算法·计算机视觉
NAGNIP1 天前
Serverless 架构下的大模型框架落地实践
算法·架构
moonlifesudo1 天前
半开区间和开区间的两个二分模版
算法
moonlifesudo1 天前
300:最长递增子序列
算法
CoovallyAIHub1 天前
港大&字节重磅发布DanceGRPO:突破视觉生成RLHF瓶颈,多项任务性能提升超180%!
深度学习·算法·计算机视觉