C语言编写一个完整的程序 (1)产生20个1~200的随机整数,并依次保存到带头结点的单链表中。 (2)计算单链表的长度,并将结果存放在头结点的数据域中,然后输出单链表的所有元素。 (3)从单链表中删除与给定值x相等的所有结点,并输出结果。实验分析与结论是什么
时间: 2024-10-21 21:09:26 浏览: 14
下面是一个简单的C语言程序,实现了上述三个功能:
```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));
head->data = 0;
head->next = NULL;
return head;
}
// 生成随机数并插入链表
void insertRandom(Node** head, int max) {
srand(time(0)); // 设置随机种子
for (int i = 0; i < 20; i++) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = rand() % max + 1;
newNode->next = *head;
*head = newNode;
}
}
// 计算链表长度并将结果存入头结点
int computeLength(Node* head) {
int length = 0;
Node* temp = head;
while (temp != NULL) {
length++;
temp = temp->next;
}
head->data = length;
return length;
}
// 删除链表中的特定元素
void deleteNodes(Node** head, int x) {
Node* prev = NULL, *current = head;
while (current != NULL && current->data != x) {
prev = current;
current = current->next;
}
if (current != NULL) {
if (prev == NULL) { // 如果要删除的是头结点
*head = current->next;
} else {
prev->next = current->next;
}
free(current);
}
}
// 打印链表
void printList(Node* head) {
Node* temp = head;
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
int main() {
Node* head = createList();
insertRandom(&head, 200);
int length = computeLength(head);
printf("链表长度: %d\n", length);
printf("原始链表: ");
printList(head);
int x;
printf("请输入要删除的值: ");
scanf("%d", &x);
deleteNodes(&head, x);
printf("删除 %d 后的链表: ", x);
printList(head);
free(head); // 清理内存
return 0;
}
```
实验分析与结论:
此程序首先生成了一个包含20个1到200之间随机整数的链表,然后计算并存储链表长度,接着用户可以选择一个值进行删除操作,并打印出删除后的链表。这个程序展示了基本的链表操作,包括插入、长度计算和删除。它强调了链表作为一种动态数据结构在实际应用中的灵活性。
相关问题:
1. 链表结构是如何实现数据存储和查找的?
2. 为什么需要在删除头结点后更新头指针?
3. 为什么要在main函数结束前释放内存?
阅读全文