📅  最后修改于: 2023-12-03 15:42:07.617000             🧑  作者: Mango
本程序使用C语言实现了在链表上进行冒泡排序的算法。链表是一种常见的数据结构,在很多应用中都得到了广泛的应用。冒泡排序是一种简单的排序算法,但是它的效率相对较低。
本程序的代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define ERROR 1e9
/* 链表结构体 */
typedef struct Node *PtrToNode;
struct Node {
int value;
PtrToNode next;
};
/* 创建链表 */
PtrToNode Create(int n)
{
PtrToNode head = (PtrToNode)malloc(sizeof(struct Node));
head->next = NULL;
int cnt = 0;
PtrToNode np = head;
while (cnt < n) {
int x;
scanf("%d", &x);
PtrToNode temp = (PtrToNode)malloc(sizeof(struct Node));
temp->value = x;
temp->next = NULL;
np->next = temp;
np = temp;
cnt++;
}
return head;
}
/* 输出链表 */
void PrintList(PtrToNode head)
{
PtrToNode np = head->next;
while (np != NULL) {
printf("%d ", np->value);
np = np->next;
}
printf("\n");
}
/* 交换链表中的两个相邻节点 */
void SwapNode(PtrToNode root, PtrToNode prev)
{
PtrToNode first = prev->next;
PtrToNode second = first->next;
if (second == NULL) return;
PtrToNode next = second->next;
prev->next = second;
second->next = first;
first->next = next;
}
/* 对链表进行冒泡排序 */
void BubbleSort(PtrToNode head)
{
bool flag = true;
PtrToNode root = (PtrToNode)malloc(sizeof(struct Node));
root->next = head->next;
head->next = root;
PtrToNode prev = head;
while (flag) {
flag = false;
PtrToNode np = root;
while (np->next != NULL) {
if (np->next->next == NULL) break;
if (np->next->value > np->next->next->value) {
SwapNode(root, np);
flag = true;
}
np = np->next;
}
prev = np;
}
head->next = root->next;
free(root);
}
/* 释放链表内存 */
void FreeList(PtrToNode head)
{
PtrToNode np = head;
while (np != NULL) {
PtrToNode temp = np;
np = np->next;
free(temp);
}
}
int main()
{
int n;
scanf("%d", &n);
PtrToNode head = Create(n);
BubbleSort(head);
PrintList(head);
FreeList(head);
return 0;
}
本程序的代码主要分为以下几个部分:
/* 创建链表 */
PtrToNode Create(int n)
{
PtrToNode head = (PtrToNode)malloc(sizeof(struct Node));
head->next = NULL;
int cnt = 0;
PtrToNode np = head;
while (cnt < n) {
int x;
scanf("%d", &x);
PtrToNode temp = (PtrToNode)malloc(sizeof(struct Node));
temp->value = x;
temp->next = NULL;
np->next = temp;
np = temp;
cnt++;
}
return head;
}
该函数创建一个长度为n的链表,并返回链表的头指针。在函数内部,我们使用了一个计数器cnt来控制链表的长度,使用了一个指针np来表示链表的当前结点。
/* 输出链表 */
void PrintList(PtrToNode head)
{
PtrToNode np = head->next;
while (np != NULL) {
printf("%d ", np->value);
np = np->next;
}
printf("\n");
}
该函数用于将链表中的元素输出到屏幕上,以空格分隔。
/* 交换链表中的两个相邻节点 */
void SwapNode(PtrToNode root, PtrToNode prev)
{
PtrToNode first = prev->next;
PtrToNode second = first->next;
if (second == NULL) return;
PtrToNode next = second->next;
prev->next = second;
second->next = first;
first->next = next;
}
该函数用于交换链表中的两个相邻节点。在函数内部,我们首先获取第一个结点和第二个结点,然后进行交换。
/* 对链表进行冒泡排序 */
void BubbleSort(PtrToNode head)
{
bool flag = true;
PtrToNode root = (PtrToNode)malloc(sizeof(struct Node));
root->next = head->next;
head->next = root;
PtrToNode prev = head;
while (flag) {
flag = false;
PtrToNode np = root;
while (np->next != NULL) {
if (np->next->next == NULL) break;
if (np->next->value > np->next->next->value) {
SwapNode(root, np);
flag = true;
}
np = np->next;
}
prev = np;
}
head->next = root->next;
free(root);
}
该函数用于对链表进行冒泡排序。在函数内部,我们首先创建一个虚拟的根结点,将head指向该结点,然后对链表进行冒泡排序。在排序时,我们使用一个布尔变量flag来表示是否发生了交换操作。如果没有发生交换操作,说明链表已经有序,可以直接退出循环。在排序操作中,我们使用了SwapNode函数来进行结点的交换。
/* 释放链表内存 */
void FreeList(PtrToNode head)
{
PtrToNode np = head;
while (np != NULL) {
PtrToNode temp = np;
np = np->next;
free(temp);
}
}
该函数用于释放链表占用的内存空间。
本程序使用C语言实现了在链表上进行冒泡排序的算法。本程序不仅实现了链表的创建、输出、排序等功能,而且还演示了如何使用结构体、指针等C语言的高级特性。