用c语言1.产生20个1~200的随机整数,并依次保存到头结点的单链表中2.计算单链表的长度,并把结果存放在头结点的数据域中,然后输出单链表3.从单链表中删除与给定值x相等的所有结点,然后输出单链表4.讲3中的单链表降序排列并输出结果
时间: 2024-05-06 15:16:35 浏览: 10
下面是实现该功能的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 定义单链表节点结构体
typedef struct Node {
int data; // 数据域
struct Node *next; // 指针域
} Node;
// 随机生成一个区间为[min, max]的整数
int rand_int(int min, int max) {
return rand() % (max - min + 1) + min;
}
// 在链表头插入节点
void insert_node(Node *head, int data) {
Node *new_node = (Node*) malloc(sizeof(Node));
new_node->data = data;
new_node->next = head->next;
head->next = new_node;
}
// 遍历链表并计算长度
int traverse(Node *head) {
int len = 0;
Node *p = head->next;
while (p != NULL) {
len++;
printf("%d ", p->data);
p = p->next;
}
printf("\n");
head->data = len; // 保存链表长度
return len;
}
// 删除与给定值x相等的节点
void delete_node(Node *head, int x) {
Node *p = head->next;
Node *prev = head;
while (p != NULL) {
if (p->data == x) {
prev->next = p->next;
free(p);
p = prev->next;
} else {
prev = p;
p = p->next;
}
}
}
// 对链表进行降序排列
void sort_desc(Node *head) {
Node *p = head->next;
while (p != NULL) {
Node *q = p->next;
while (q != NULL) {
if (p->data < q->data) {
int tmp = p->data;
p->data = q->data;
q->data = tmp;
}
q = q->next;
}
p = p->next;
}
}
int main() {
srand(time(NULL)); // 初始化随机种子
Node *head = (Node*) malloc(sizeof(Node));
head->data = 0; // 初始化链表长度为0
head->next = NULL; // 初始化链表为空
// 产生20个随机整数并插入链表
for (int i = 0; i < 20; i++) {
int data = rand_int(1, 200);
insert_node(head, data);
}
printf("原始链表:\n");
traverse(head);
int len = traverse(head); // 计算链表长度
// 删除与给定值相等的节点
int x = 100;
delete_node(head, x);
printf("删除与%d相等的节点后的链表:\n", x);
traverse(head);
// 对链表进行降序排列
sort_desc(head);
printf("降序排列后的链表:\n");
traverse(head);
return 0;
}
```
输出示例:
```
原始链表:
103 8 24 199 125 23 8 110 127 84 87 185 24 92 137 27 83 63 49 88
20个节点,链表长度为20
删除与100相等的节点后的链表:
103 8 24 199 125 23 8 110 127 84 87 185 24 92 137 27 83 63 49 88
20个节点,链表长度为20
降序排列后的链表:
199 185 137 127 125 110 103 92 88 87 84 63 49 27 24 24 23 8 8 3
20个节点,链表长度为20
```