利用C语言编写一个完整可运行的代码,要求实现以下功能: 1.键盘输入一组元素,建立一个带头结点的单向链表(无序)。 2.遍历单向链表。 3.把单向链表中元素逆置(不允许申请新的结点空间)。 4.在单向链表中删除所有的偶数元素结点。代码要有一定的注释
时间: 2025-01-01 09:35:49 浏览: 6
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct ListNode {
int data; // 节点存储的数据
struct ListNode* next; // 指向下一个节点的指针
} ListNode;
// 创建新节点并初始化
ListNode* createNode(int value) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
if (!newNode) {
printf("Memory allocation failed.\n");
return NULL;
}
newNode->data = value;
newNode->next = NULL;
return newNode;
}
// 添加节点到链表
void insertNode(ListNode** head, int value) {
ListNode* newNode = createNode(value);
if (*head == NULL) { // 链表为空,直接将新节点设为头节点
*head = newNode;
} else {
ListNode* current = *head;
while (current->next != NULL) {
current = current->next;
}
current->next = newNode;
}
}
// 遍历链表
void printList(ListNode* head) {
ListNode* temp = head;
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
// 逆置链表(原地操作)
void reverseList(ListNode** head) {
ListNode* prev = NULL;
ListNode* current = *head;
ListNode* nextTemp = NULL;
while (current != NULL) {
nextTemp = current->next;
current->next = prev;
prev = current;
current = nextTemp;
}
*head = prev; // 更新头节点
}
// 删除链表中所有偶数节点
void deleteEvenNodes(ListNode** head) {
ListNode* dummyHead = createNode(0); // 创建虚拟头节点,用于处理第一个节点的情况
dummyHead->next = *head;
ListNode* current = dummyHead;
while (current->next != NULL) {
if (current->next->data % 2 == 0) {
ListNode* toDelete = current->next;
current->next = toDelete->next;
free(toDelete);
} else {
current = current->next;
}
}
if (dummyHead->next != *head) { // 如果原头节点已被删除,更新实际头节点
*head = dummyHead->next;
}
free(dummyHead); // 回收虚拟头节点
}
int main() {
ListNode* head = NULL; // 初始化链表头节点
int num;
printf("Enter elements (end with a non-integer): ");
while (scanf("%d", &num) == 1 && num != -1) { // 输入元素直到遇到非整数
insertNode(&head, num);
}
printf("Original List: \n");
printList(head);
reverseList(&head);
printf("\nReversed List: \n");
printList(head);
deleteEvenNodes(&head);
printf("\nList after removing even numbers: \n");
printList(head);
return 0;
}
```
阅读全文