请用C语言编写一个完整的程序,使用链表实现以下操作: (1)产生20个1~200的随机整数,并依次保存到带头结点的单链表中。 (2)计算单链表的长度,并将结果存放在头结点的数据域中,然后输出单链表的所有元素。 (3)从单链表中删除与给定值x相等的所有结点,并输出结果。
时间: 2024-12-08 20:18:56 浏览: 24
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 定义链表节点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 初始化链表的函数
Node* createList() {
Node* head = (Node*)malloc(sizeof(Node));
if (!head) {
printf("Memory allocation failed.\n");
return NULL;
}
head->data = 0; // 首节点通常置空
head->next = NULL;
return head;
}
// 向链表中添加新节点的函数
void insertNode(Node** head, int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (!newNode) {
printf("Memory allocation failed.\n");
return;
}
newNode->data = value;
newNode->next = *head;
*head = newNode;
}
// 生成并插入随机数到链表的函数
void generateAndInsert(Node** head, int size) {
srand(time(0));
for (int i = 0; i < size; i++) {
int randomNum = rand() % 200 + 1;
insertNode(head, randomNum);
printf("%d -> ", randomNum); // 打印临时链表
}
printf("\n"); // 结束打印
updateLength(head); // 更新链表长度
}
// 计算并更新链表长度的函数
void updateLength(Node** head) {
Node* temp = *head;
int length = 0;
while (temp != NULL) {
length++;
temp = temp->next;
}
(*head)->data = length; // 将长度存入头节点
printf("链表长度: %d\n", length);
}
// 删除所有等于给定值的节点的函数
void deleteNodes(Node** head, int x) {
Node* prev = NULL;
Node* current = *head;
while (current != NULL) {
if (current->data == x) {
if (prev == NULL) { // 如果当前节点就是头节点
*head = current->next;
} else {
prev->next = current->next;
}
free(current);
current = prev->next;
} else {
prev = current;
current = current->next;
}
}
}
// 输出链表元素的函数
void printList(Node* head) {
Node* temp = head;
while (temp != NULL) {
printf("%d -> ", temp->data);
temp = temp->next;
}
printf("NULL\n");
}
int main() {
Node* head = createList();
generateAndInsert(&head, 20);
int targetValue = 50; // 示例目标值
printf("原始链表:\n");
printList(head);
deleteNodes(&head, targetValue);
printf("删除了所有 %d 的节点后的链表:\n", targetValue);
printList(head);
return 0;
}
```
上述代码首先创建了一个链表,然后生成20个1到200之间的随机整数,并将它们插入链表。接着计算链表长度并将结果存储在头节点,最后删除所有等于给定值的节点,并打印处理后的链表。注意,这个例子使用的是全局变量`head`作为链表的入口。
阅读全文