c语言单链表排序z多种方法
时间: 2023-12-07 15:06:03 浏览: 141
以下是几种C语言单链表排序的方法:
1. 冒泡排序法:对于链表中的每个节点,比较其与后面节点的值大小,如果前面节点的值大于后面节点的值,则交换它们的值。重复以上步骤,直到链表中的所有节点都被排序。
2. 选择排序法:从链表的头节点开始,依次遍历每个节点,找到链表中最小的节点,然后将其与当前节点交换。重复以上步骤,直到链表中的所有节点都被排序。
3. 插入排序法:从链表的第二个节点开始,将这个节点与前面的节点进行比较,如果前面的节点的值大于这个节点的值,则将前面的节点后移一个位置,直到找到一个比这个节点小的节点,然后将这个节点插入到这个节点之后。重复以上步骤,直到链表中的所有节点都被排序。
注意,在使用这些排序算法时,需要考虑链表节点的指针操作,以确保节点的正确排序。同时,为了提高排序效率,可以选择合适的数据结构和算法,以及优化算法的实现。
相关问题
用单链表结构存放26个英文字母组成的线性表,写出C语言程序
在C语言中,我们可以创建一个链表结构来存储26个英文大写字母,每个节点代表一个字母。以下是一个简单的示例:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
char letter;
struct Node* next;
} LetterNode;
// 创建新节点
LetterNode* createNode(char letter) {
LetterNode* newNode = (LetterNode*)malloc(sizeof(LetterNode));
newNode->letter = letter;
newNode->next = NULL;
return newNode;
}
// 将字母插入链表头部
void insertAtHead(LetterNode** headRef, char letter) {
LetterNode* newNode = createNode(letter);
if (*headRef != NULL) {
newNode->next = *headRef;
}
*headRef = newNode;
}
// 插入排序后的字母表
void sortAndInsert(LetterNode** headRef) {
LetterNode* current = *headRef;
while (current != NULL && current->letter != 'A') {
current = current->next;
}
if (current == NULL || current->letter != 'A') {
insertAtHead(headRef, 'A');
} else {
for (char i = 'B'; i <= 'Z'; ++i) {
if (*headRef != NULL && (*headRef)->letter == i) {
insertAtHead(headRef, i);
}
}
}
}
// 打印链表
void printList(LetterNode* node) {
while (node != NULL) {
printf("%c ", node->letter);
node = node->next;
}
printf("\n");
}
int main() {
LetterNode* head = NULL;
// 添加字母到链表
for (char i = 'A'; i <= 'Z'; ++i) {
insertAtHead(&head, i);
}
// 对链表进行排序并打印
sortAndInsert(&head);
printList(head);
return 0;
}
```
这个程序首先定义了一个`LetterNode`结构体,用于表示链表中的每个字母节点。然后实现了创建节点、插入节点到链表头部以及对链表进行排序的功能。最后,在`main`函数中创建一个空链表,并填充26个字母,然后打印出排序后的链表。
用随机产生的10个英文字符,分别用rinsert和hinsert,建立单链表,输出结果 c语言
在C语言中,我们可以使用结构体来表示链表节点,并利用`rand()`函数生成随机英文字符。这里我将简要地展示如何创建两个插入操作的函数:`rinsert`(随机插入)和`hinsert`(按字母顺序插入),然后输出链表。
首先,定义链表节点结构:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
typedef struct Node {
char data;
struct Node* next;
} Node;
Node* createList(char* str) {
int len = strlen(str);
Node* head = (Node*)malloc(sizeof(Node));
head->data = *str++;
head->next = NULL;
for (int i = 1; i < len; ++i) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = *str++;
newNode->next = head->next;
head->next = newNode;
}
return head;
}
void rinsert(Node** head, Node** tail) {
srand(time(0)); // 初始化随机数种子
char random_char = 'a' + rand() % ('z' - 'a' + 1); // 随机英文字母
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = random_char;
newNode->next = NULL;
if (*tail == NULL) {
*head = newNode;
*tail = newNode;
} else {
newNode->next = *tail;
*tail = newNode;
}
}
void hinsert(Node** head, Node** tail, char key) {
Node* current = *head;
while (current != NULL && current->data < key) {
current = current->next;
}
if (current == NULL) {
newNode = (Node*)malloc(sizeof(Node));
newNode->data = key;
newNode->next = *head;
*head = newNode;
} else {
newNode = (Node*)malloc(sizeof(Node));
newNode->data = key;
newNode->next = current->next;
current->next = newNode;
}
}
void printList(Node* head) {
Node* temp = head;
while (temp != NULL) {
printf("%c -> ", temp->data);
temp = temp->next;
}
printf("NULL\n");
}
int main() {
char random_str[11] = "RandomString"; // 生成随机字符串示例
Node* list = createList(random_str);
Node* rtail = NULL;
for (int i = 0; i < 5; i++) {
rinsert(&list, &rtail);
}
printf("Random Insertion List:\n");
printList(list);
char hkey = random_str[strlen(random_str) / 2]; // 选择一个中间字符作为排序依据
hinsert(&list, &rtail, hkey);
printf("\nAlphabetically Sorted List with Key '%c':\n", hkey);
printList(list);
return 0;
}
```
这个程序首先创建一个包含随机字符的链表,然后用`rinsert`随机插入5个字符,接着使用`hinsert`按照字符顺序插入一个字符并打印最终链表。
阅读全文