编写c语言程序依次实现如下功能: 初始化单链表 依次采用尾插法插入a,b,c,d,e元素 输出单链表 输出单链表的长度 判断单链表是否为空 输出单链表的第三个元素 输出元素a的位置 在第4个元素的位置上插入f元素 输出单链表 删除单链表的第 3个元素 输出单链表
时间: 2024-12-16 19:27:57 浏览: 21
在 C 语言中,我们首先需要定义一个结构体 `Node` 来表示链表节点,然后创建相应的函数来实现所需的功能:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构
typedef struct Node {
int data;
struct Node* next;
} Node;
// 初始化链表
Node* initList() {
Node* head = (Node*)malloc(sizeof(Node));
if (head == NULL) {
printf("Memory allocation failed.\n");
return NULL;
}
head->next = NULL;
return head;
}
// 尾插法插入元素
void insertTail(Node** head, int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL) {
printf("Memory allocation failed.\n");
return;
}
newNode->data = value;
newNode->next = NULL;
if (*head == NULL) {
*head = newNode;
} else {
Node* temp = *head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newNode;
}
}
// 显示链表
void displayList(Node* head) {
if (head == NULL) {
printf("List is empty.\n");
} else {
Node* temp = head;
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
}
// 计算链表长度
int listLength(Node* head) {
int count = 0;
Node* temp = head;
while (temp != NULL) {
count++;
temp = temp->next;
}
return count;
}
// 判断链表是否为空
int isEmpty(Node* head) {
return head == NULL;
}
// 获取指定位置的元素
int getElementAtPosition(Node* head, int position) {
if (position < 1 || isEmpty(head)) {
printf("Invalid position.\n");
return -1; // 返回错误值
}
int index = 1;
Node* temp = head;
while (index < position && temp != NULL) {
temp = temp->next;
index++;
}
return temp ? temp->data : -1; // 如果到达了链表尾部则返回 -1
}
// 在指定位置插入元素
void insertAtPosition(Node** head, int position, int value) {
if (isEmpty(*head) || position <= 0) {
printf("Invalid operation.\n");
return;
}
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL) {
printf("Memory allocation failed.\n");
return;
}
newNode->data = value;
newNode->next = NULL;
Node* prev = *head;
int idx = 1;
while (idx < position && prev->next != NULL) {
prev = prev->next;
idx++;
}
if (prev->next != NULL) { // 插入到中间
newNode->next = prev->next;
prev->next = newNode;
} else { // 插入到尾部
newNode->next = NULL;
prev->next = newNode;
}
}
// 删除指定位置的元素
void deleteElement(Node** head, int position) {
if (isEmpty(*head) || position <= 0) {
printf("Invalid operation.\n");
return;
}
Node* temp = *head;
int idx = 1;
while (idx < position && temp != NULL) {
temp = temp->next;
idx++;
}
if (temp == NULL) { // 元素不存在
printf("Element not found at the specified position.\n");
return;
}
if (temp->next == NULL) { // 删除最后一个元素
Node* last = temp;
temp = *head;
while (temp->next != NULL) {
last = temp;
temp = temp->next;
}
free(last);
} else { // 删除中间元素
Node* prev = temp;
prev->next = temp->next;
free(temp);
}
}
int main() {
Node* head = initList();
// 插入元素
insertTail(&head, 'a');
insertTail(&head, 'b');
insertTail(&head, 'c');
insertTail(&head, 'd');
insertTail(&head, 'e');
// 输出链表、长度等信息
displayList(head);
printf("List length: %d\n", listLength(head));
// ...其他操作...
return 0;
}
```
阅读全文