生成建立单链表,查找单链表,删除单链表,插入单链表的C语言代码
时间: 2025-05-22 16:30:57 浏览: 23
### 单链表操作的 C 语言代码实现
以下是单链表创建、查找、删除和插入功能的完整 C 语言代码示例:
#### 节点结构定义
```c
#include <stdio.h>
#include <stdlib.h>
// 定义节点结构体
typedef struct Node {
int data; // 数据域
struct Node* next; // 指针域,指向下一个节点
} Node;
```
---
#### 创建单链表
通过尾插法创建单链表。
```c
Node* createList() {
Node *head = NULL, *tail = NULL; // 头指针和尾指针
int value;
printf("请输入链表数据(输入-1结束): ");
while (scanf("%d", &value), value != -1) { // 输入直到遇到-1为止
Node* newNode = (Node*)malloc(sizeof(Node)); // 动态分配内存给新节点
if (!newNode) {
printf("内存分配失败\n");
exit(EXIT_FAILURE);
}
newNode->data = value; // 初始化新节点的数据部分
newNode->next = NULL; // 新节点的next初始为空
if (!head) { // 如果链表为空,则设置头结点
head = tail = newNode;
} else { // 否则追加到链表末尾
tail->next = newNode;
tail = newNode;
}
}
return head; // 返回链表头指针
}
```
---
#### 查找指定值的节点位置
返回第一个匹配节点的位置索引(从0开始),如果未找到则返回-1。
```c
int findElement(Node* head, int target) {
int index = 0;
Node* current = head;
while (current != NULL) { // 遍历链表寻找目标值
if (current->data == target) {
return index; // 找到目标值,返回其索引
}
current = current->next; // 移动到下一节点
index++;
}
return -1; // 若未找到,返回-1
}
```
---
#### 删除指定值的第一个节点
成功删除返回1,否则返回0。
```c
int deleteElement(Node** head_ref, int key) {
Node* temp = *head_ref; // 当前节点
Node* prev = NULL; // 上一节点
if (temp != NULL && temp->data == key) { // 如果要删除的是头节点
*head_ref = temp->next; // 更新头指针
free(temp); // 释放原头节点内存
return 1; // 成功删除标志
}
while (temp != NULL && temp->data != key) { // 寻找待删除节点
prev = temp;
temp = temp->next;
}
if (temp == NULL) { // 到达链表末尾仍未找到
return 0; // 删除失败标志
}
prev->next = temp->next; // 将prev跳过temp连接至后续节点
free(temp); // 释放被删除节点的内存
return 1; // 成功删除标志
}
```
---
#### 插入节点到指定位置
在第 `index` 位之前插入新节点。如果超出范围,则将新节点附加到最后。
```c
void insertAtPosition(Node** head_ref, int newData, int position) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (!newNode) {
printf("内存分配失败\n");
return;
}
newNode->data = newData;
if (position == 0) { // 插入作为新的头节点
newNode->next = *head_ref;
*head_ref = newNode;
return;
}
Node* current = *head_ref;
int i = 0;
while (i < position - 1 && current != NULL) { // 找到插入位置之前的节点
current = current->next;
i++;
}
if (current == NULL) { // 如果超出了有效范围,将其添加到末尾
while (*head_ref != NULL) {
head_ref = &((*head_ref)->next);
}
*head_ref = newNode;
newNode->next = NULL;
} else { // 正常情况下的插入
newNode->next = current->next;
current->next = newNode;
}
}
```
---
#### 测试主程序
展示如何使用以上函数完成单链表的基本操作。
```c
void displayList(Node* head) {
Node* current = head;
while (current != NULL) {
printf("%d -> ", current->data);
current = current->next;
}
printf("NULL\n");
}
int main() {
Node* head = NULL;
head = createList(); // 创建链表
printf("原始链表: "); displayList(head);
int searchValue = 5;
int result = findElement(head, searchValue);
if (result >= 0) {
printf("元素 %d 的位置是:%d\n", searchValue, result)[^1];
} else {
printf("元素 %d 不在链表中。\n", searchValue);
}
int delValue = 7;
if (deleteElement(&head, delValue)) {
printf("已删除元素 %d\n", delValue)[^2];
} else {
printf("无法删除不存在的元素 %d\n", delValue)[^2];
}
printf("更新后的链表: "); displayList(head);
int insData = 8, pos = 2;
insertAtPosition(&head, insData, pos);
printf("在位置 %d 插入元素 %d 后:\n", pos, insData)[^3];
printf("最终链表: "); displayList(head);
return 0;
}
```
---
阅读全文
相关推荐


















