使用C语言实现双向循环链表从大到小的链表指针排序
时间: 2023-07-10 20:35:38 浏览: 141
双向循环链表的C语言实现
5星 · 资源好评率100%
好的,这是一个比较具体的问题。以下是一个示例代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
/* 定义双向循环链表节点结构体 */
typedef struct node {
int data;
struct node *prev;
struct node *next;
} Node;
/* 定义链表头指针 */
Node *head = NULL;
/* 创建新节点 */
Node *new_node(int data) {
Node *node = (Node *)malloc(sizeof(Node));
node->data = data;
node->prev = NULL;
node->next = NULL;
return node;
}
/* 插入节点到链表尾部 */
void insert_node_to_end(int data) {
Node *node = new_node(data);
if (head == NULL) {
head = node;
head->prev = head;
head->next = head;
} else {
Node *tail = head->prev;
tail->next = node;
node->prev = tail;
node->next = head;
head->prev = node;
}
}
/* 打印链表中的元素 */
void print_list() {
if (head == NULL) {
printf("List is empty.\n");
} else {
Node *cur = head;
do {
printf("%d ", cur->data);
cur = cur->next;
} while (cur != head);
printf("\n");
}
}
/* 交换两个节点的数据 */
void swap_node_data(Node *node1, Node *node2) {
int temp = node1->data;
node1->data = node2->data;
node2->data = temp;
}
/* 对双向循环链表进行从大到小的排序 */
void sort_list_desc() {
if (head == NULL || head->next == head) {
return;
}
Node *cur1 = head;
do {
Node *cur2 = cur1->next;
do {
if (cur1->data < cur2->data) {
swap_node_data(cur1, cur2);
}
cur2 = cur2->next;
} while (cur2 != head);
cur1 = cur1->next;
} while (cur1 != head);
}
int main() {
insert_node_to_end(5);
insert_node_to_end(2);
insert_node_to_end(8);
insert_node_to_end(1);
insert_node_to_end(9);
printf("Original List: ");
print_list();
sort_list_desc();
printf("Sorted List (Descending Order): ");
print_list();
return 0;
}
```
这段代码实现了一个双向循环链表,包括节点的创建、插入、打印等基本操作,以及按照从大到小的顺序对链表进行排序。你可以通过调用 `insert_node_to_end` 函数向链表中添加节点,然后调用 `sort_list_desc` 函数对链表进行排序,最后调用 `print_list` 函数打印链表中的元素。
阅读全文