请用C语言编写一个完整的程序,使用链表实现以下操作:(1)产生20个1~200的随机整数,并依次保存到带头结点的单链表中。(2)计算单链表的长度,并将结果存放在头结点的数据域中,然后输出单链表的所有元素。(3)从单链表中删除与给定值x相等的所有结点,并输出
时间: 2024-10-21 11:04:30 浏览: 18
```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; // 初始化头结点为0
head->next = NULL;
srand(time(0)); // 设置随机种子
for (int i = 1; i <= 20; i++) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (!newNode) {
printf("Memory allocation failed for node %d.\n", i);
break;
}
newNode->data = rand() % 200 + 1; // 生成1~200的随机数
newNode->next = head->next;
head->next = newNode;
}
return head;
}
// 计算链表长度并更新头结点数据
void calculateLength(Node* head) {
Node* temp = head;
int length = 0;
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) {
Node* prev = *head;
Node* curr = *head->next;
while (curr != NULL) {
if (curr->data == x) {
if (prev == NULL) {
*head = curr->next;
} else {
prev->next = curr->next;
}
free(curr);
} else {
prev = curr;
}
curr = curr->next;
}
}
int main() {
Node* listHead = createList();
if (listHead != NULL) {
printf("Chain List Before Deletion:\n");
printList(listHead);
calculateLength(listHead);
printf("Chain List Length: %d\n", listHead->data);
int deleteValue = 15; // 示例值
printf("Deleting nodes with value %d...\n", deleteValue);
deleteNodes(&listHead, deleteValue);
printf("Chain List After Deletion:\n");
printList(listHead);
}
return 0;
}
```
这个C语言程序实现了题目所描述的操作:
1. 生成了20个1~200的随机整数并将它们存储在一个单链表中。
2. 计算了链表的长度,并将其设置为头结点的数据。
3. 删除了链表中所有值为`deleteValue`的节点,这里我们设为15。
在`main`函数中,首先创建链表,然后打印、计算长度、删除节点,最后再次打印链表。运行此程序会看到相关的输出。
阅读全文