续写代码:请用C语言编写一个完整的程序,使用链表实现以下操作: (1)产生20个1~200的随机整数,并依次保存到带头结点的单链表中。 (2)计算单链表的长度,并将结果存放在头结点的数据域中,然后输出单链表的所有元素。 (3)从单链表中删除与给定值x相等的所有结点,并输出结果。
时间: 2024-12-08 08:20:40 浏览: 45
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 定义链表节点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 随机生成1~200之间的整数并分配新节点
Node* createRandomList(int n) {
Node* head = (Node*)malloc(sizeof(Node));
head->data = 0; // 初始化头结点数据
head->next = NULL;
srand(time(0)); // 设置随机数种子
for (int i = 1; i <= n; i++) {
int random_num = rand() % 200 + 1;
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = random_num;
newNode->next = head->next;
head->next = newNode;
}
return head;
}
// 计算链表长度并更新头结点的数据域
void calculateLength(Node* head) {
int length = 0;
Node* temp = head;
while (temp != NULL) {
length++;
temp = temp->next;
}
head->data = length;
}
// 打印链表所有元素
void printList(Node* head) {
Node* temp = head;
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
// 删除链表中值等于x的节点
void deleteNodes(Node** head, int x) {
if (*head == NULL) return;
Node* prev = NULL;
Node* curr = *head;
while (curr != NULL) {
if (curr->data == x) {
if (prev == NULL) {
*head = curr->next;
} else {
prev->next = curr->next;
}
free(curr);
curr = NULL;
} else {
prev = curr;
curr = curr->next;
}
}
}
int main() {
int n = 20;
Node* listHead = createRandomList(n);
printf("Generated List:\n");
printList(listHead);
calculateLength(listHead);
printf("List Length is: %d\n", listHead->data);
printf("Updated List:\n");
printList(listHead);
int deleteValue = 50;
printf("Deleting all nodes with value %d:\n", deleteValue);
deleteNodes(&listHead, deleteValue);
printList(listHead);
return 0;
}
```
这个C语言程序首先创建了一个包含20个随机整数的链表,然后计算并存储链表长度,打印所有元素,最后删除所有值等于指定值的节点并再次打印链表。
阅读全文