您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# C语言怎么实现单链表的基本功能
## 一、单链表概述
单链表(Singly Linked List)是最基础的数据结构之一,它通过指针将一组零散的内存块串联起来。每个节点(Node)包含两个部分:
- 数据域:存储实际数据
- 指针域:存储下一个节点的内存地址
### 1.1 单链表的特点
- 动态内存分配,不需要预先知道数据规模
- 插入/删除时间复杂度O(1)
- 随机访问效率低,时间复杂度O(n)
- 需要额外空间存储指针
### 1.2 与数组的对比
| 特性 | 数组 | 单链表 |
|------------|--------------|-------------|
| 内存连续性 | 连续 | 非连续 |
| 大小 | 固定 | 动态扩展 |
| 插入/删除 | O(n) | O(1) |
| 随机访问 | O(1) | O(n) |
## 二、单链表的基本实现
### 2.1 节点结构定义
```c
typedef struct Node {
int data; // 数据域(以int为例)
struct Node *next; // 指针域
} Node;
// 创建空链表
Node* createList() {
return NULL; // 返回空指针表示空链表
}
// 创建带头节点的链表
Node* createListWithHead() {
Node* head = (Node*)malloc(sizeof(Node));
head->next = NULL;
return head;
}
void insertAtHead(Node** head, int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = *head;
*head = newNode;
}
void insertAtTail(Node** head, int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
if (*head == NULL) {
*head = newNode;
return;
}
Node* current = *head;
while (current->next != NULL) {
current = current->next;
}
current->next = newNode;
}
void insertAtIndex(Node** head, int index, int data) {
if (index < 0) return;
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
if (index == 0) {
newNode->next = *head;
*head = newNode;
return;
}
Node* current = *head;
for (int i = 0; current != NULL && i < index - 1; i++) {
current = current->next;
}
if (current == NULL) {
free(newNode);
return;
}
newNode->next = current->next;
current->next = newNode;
}
void deleteAtHead(Node** head) {
if (*head == NULL) return;
Node* temp = *head;
*head = (*head)->next;
free(temp);
}
void deleteAtTail(Node** head) {
if (*head == NULL) return;
if ((*head)->next == NULL) {
free(*head);
*head = NULL;
return;
}
Node* current = *head;
while (current->next->next != NULL) {
current = current->next;
}
free(current->next);
current->next = NULL;
}
void deleteAtIndex(Node** head, int index) {
if (*head == NULL || index < 0) return;
if (index == 0) {
Node* temp = *head;
*head = (*head)->next;
free(temp);
return;
}
Node* current = *head;
for (int i = 0; current != NULL && i < index - 1; i++) {
current = current->next;
}
if (current == NULL || current->next == NULL) return;
Node* temp = current->next;
current->next = temp->next;
free(temp);
}
Node* searchByValue(Node* head, int value) {
Node* current = head;
while (current != NULL) {
if (current->data == value) {
return current;
}
current = current->next;
}
return NULL;
}
Node* searchByIndex(Node* head, int index) {
if (index < 0) return NULL;
Node* current = head;
for (int i = 0; current != NULL && i < index; i++) {
current = current->next;
}
return current;
}
void traverseList(Node* head) {
Node* current = head;
while (current != NULL) {
printf("%d -> ", current->data);
current = current->next;
}
printf("NULL\n");
}
int getLength(Node* head) {
int count = 0;
Node* current = head;
while (current != NULL) {
count++;
current = current->next;
}
return count;
}
Node* reverseList(Node* head) {
Node *prev = NULL, *current = head, *next = NULL;
while (current != NULL) {
next = current->next;
current->next = prev;
prev = current;
current = next;
}
return prev;
}
int hasCycle(Node* head) {
if (head == NULL) return 0;
Node *slow = head, *fast = head;
while (fast != NULL && fast->next != NULL) {
slow = slow->next;
fast = fast->next->next;
if (slow == fast) return 1;
}
return 0;
}
Node* mergeTwoLists(Node* l1, Node* l2) {
Node dummy = {0, NULL};
Node* tail = &dummy;
while (l1 && l2) {
if (l1->data <= l2->data) {
tail->next = l1;
l1 = l1->next;
} else {
tail->next = l2;
l2 = l2->next;
}
tail = tail->next;
}
tail->next = l1 ? l1 : l2;
return dummy.next;
}
void freeList(Node** head) {
Node* current = *head;
while (current != NULL) {
Node* temp = current;
current = current->next;
free(temp);
}
*head = NULL;
}
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
// [此处插入前面定义的所有函数]
int main() {
Node* list = createList();
// 插入测试
insertAtTail(&list, 1);
insertAtTail(&list, 2);
insertAtHead(&list, 0);
insertAtIndex(&list, 1, 9);
printf("Original List: ");
traverseList(list); // 输出: 0 -> 9 -> 1 -> 2 -> NULL
// 删除测试
deleteAtIndex(&list, 1);
deleteAtHead(&list);
printf("After deletion: ");
traverseList(list); // 输出: 1 -> 2 -> NULL
// 反转测试
list = reverseList(list);
printf("Reversed List: ");
traverseList(list); // 输出: 2 -> 1 -> NULL
freeList(&list);
return 0;
}
单链表作为基础数据结构,虽然简单但功能强大。掌握其C语言实现需要理解: - 指针操作和内存管理 - 边界条件处理 - 时间/空间复杂度分析 - 实际应用场景
通过不断练习,可以深入理解链表的特性和应用,为学习更复杂的数据结构打下坚实基础。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。