请设计一个单链表的存储结构,并实现单链表中以下基本运算算法,单链表的结构和算法存放在头文件中 (1)初始化单链表(带头结点) (2)单链表中当前结点后面插入一个新结点 (3)删除单链表当前结点 (4)输出单链表的元素和长度 (5)判断单链表是否为空 用c语言
时间: 2024-10-18 16:11:24 浏览: 40
在C语言中,我们可以设计一个简单的单链表数据结构,包含一个结构体`ListNode`表示节点,以及头指针`head`来管理整个链表。以下是结构体定义及相关的操作函数:
```c
// 头文件 single_linked_list.h
#ifndef SINGLE_LINKED_LIST_H
#define SINGLE_LINKED_LIST_H
typedef struct ListNode {
int data; // 节点的数据部分
struct ListNode* next; // 指向下一个节点的指针
} ListNode;
// 初始化一个空链表
ListNode* initializeList(void);
// 在链表末尾插入一个新节点
void insertNode(ListNode** head, int data);
// 删除链表中的某个节点
void deleteNode(ListNode** head, int key);
// 输出链表元素并返回长度
int printList(ListNode* head);
int listLength(ListNode* head);
// 判断链表是否为空
int isListEmpty(ListNode* head);
#endif // SINGLE_LINKED_LIST_H
```
现在我们分别实现每个函数:
```c
// 单链表.c
#include "single_linked_list.h"
// 初始化一个空链表
ListNode* initializeList() {
ListNode* head = (ListNode*)malloc(sizeof(ListNode));
head->data = 0;
head->next = NULL;
return head;
}
// 在链表末尾插入一个新节点
void insertNode(ListNode** head, int data) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->data = data;
newNode->next = *head;
*head = newNode;
}
// 删除链表中的某个节点
void deleteNode(ListNode** head, int key) {
if (*head == NULL) return;
if ((*head)->data == key) {
ListNode* temp = *head;
*head = (*head)->next;
free(temp);
return;
}
ListNode* current = *head;
while (current->next != NULL && current->next->data != key) {
current = current->next;
}
if (current->next != NULL) {
ListNode* temp = current->next;
current->next = current->next->next;
free(temp);
}
}
// 输出链表元素并返回长度
int printList(ListNode* head) {
int length = 0;
ListNode* temp = head;
while (temp != NULL) {
printf("%d ", temp->data);
length++;
temp = temp->next;
}
printf("\n");
return length;
}
// 判断链表是否为空
int isListEmpty(ListNode* head) {
return head == NULL;
}
// 获取链表长度
int listLength(ListNode* head) {
return printList(head);
}
```
使用这个结构和函数,你可以创建、操作和检查单链表了。例如:
```c
int main() {
ListNode* head = initializeList();
// 插入节点...
// 删除节点...
// 打印链表并获取长度...
// 判断是否为空...
return 0;
}
```
阅读全文