C语言基础(三十二)

1、链表排序之插入排序:

测试代码:

#include "date.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// 定义链表结构
typedef struct Node {
    int data;
    struct Node *next;
} Node;

// 生成随机数
int generateRandomNumber() {
    return rand() % 100; // 生成0到99之间的随机数
}

// 将随机数添加到链表中
void appendToList(Node **head, int value) {
    Node *newNode = (Node *)malloc(sizeof(Node));
    newNode->data = value;
    newNode->next = NULL;

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

// 插入排序
void insertionSort(Node **head) {
    Node *sorted = NULL;
    Node *current = *head;

    while (current != NULL) {
        Node *next = current->next;

        if (sorted == NULL || sorted->data >= current->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;
    }
}

int main() {
	int times = getTime();
    int n;
    printf("请输入要生成的随机数的个数n:");
    scanf("%d", &n);

    srand(time(NULL)); // 设置随机数种子

    Node *head = NULL;

    // 生成n个随机数并添加到链表中
    for (int i = 0; i < n; i++) {
        int randomNumber = generateRandomNumber();
        appendToList(&head, randomNumber);
    }

    // 输出排序前的链表
    printf("排序前的链表:\n");
    printList(head);

    // 对链表进行插入排序
    insertionSort(&head);

    // 输出排序后的链表
    printf("\n排序后的链表:\n");
    printList(head);

    // 释放链表节点的内存
    Node *current = head;
    while (current != NULL) {
        Node *temp = current;
        current = current->next;
        free(temp);
    }
    return 0;
}

运行结果如下:

 

2、链表排序之归并排序:

测试代码:

#include "date.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 定义节点的结构体
typedef struct Node {
    int data;
    struct Node* next;
} Node;
// 创建新的节点,并将数据赋值给这个节点,然后返回创建的节点。
Node* createNode(int data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}
// 将这个节点的指针指向链表头部指针指向的节点,
// 将链表头部指针指向新创建的节点,新节点便插入到链表的头部。
void addToLinkedList(Node** head, int data) {
    Node* newNode = createNode(data);
    newNode->next = *head;
    *head = newNode;
}
// merge 函数归并排序,用于合并两个已排序的链表。
// 接收两个链表头指针 left 和 right,并返回合并后链表的头指针。 
Node* merge(Node* left, Node* right) {
    Node* result = NULL;

    if (left == NULL)
        return right;
    else if (right == NULL)
        return left;

    if (left->data <= right->data) {
        result = left;
        result->next = merge(left->next, right);
    } else {
        result = right;
        result->next = merge(left, right->next);
    }

    return result;
}
// split 函数用于将链表 source 分割成两个链表,front 指向前半部分,back 指向后半部分。
// “前半部分”和“后半部分”基于链表长度的中点划分。
void split(Node* source, Node** front, Node** back) {
    if (source == NULL || source->next == NULL) {
        *front = source;
        *back = NULL;
    } else {
        Node* slow = source;
        Node* fast = source->next;

        while (fast != NULL) {
            fast = fast->next;
            if (fast != NULL) {
                slow = slow->next;
                fast = fast->next;
            }
        }

        *front = source;
        *back = slow->next;
        slow->next = NULL;
    }
}
// mergeSort 函数接收一个指向链表头指针的指针(Node** head)。
// 在函数内部修改链表头指针,并将这些修改反映到函数外部。
void mergeSort(Node** head) {
    Node* current = *head;
    Node* left;
    Node* right;

    if (current == NULL || current->next == NULL) {
        return;
    }

    split(current, &left, &right);
    mergeSort(&left);
    mergeSort(&right);
    *head = merge(left, right);
}
// 打印链表中的数据和地址。 
void printLinkedList(Node* head) {
    Node* current = head;
    while (current != NULL) {
        printf("Data: %d, Address: %p\n", current->data, (void*)current);
        current = current->next;
    }
}

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 randNum = rand()%100;
        addToLinkedList(&head, randNum); 
    }
    // 打印排序前的链表 
    printf("Unsorted linked list:\n");
    printLinkedList(head);
    // 归并排序 
    mergeSort(&head);
    // 打印排序后的链表。 
    printf("\nSorted linked list:\n");
    printLinkedList(head);
    return 0;
}

运行结果如下:

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值