单链表的插入删除查找代码实现
时间: 2023-06-01 17:01:50 浏览: 111
单链表的插入删除操作
单链表的插入删除查找代码实现如下:
```
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构体
typedef struct Node {
int data; // 数据域
struct Node* next; // 指针域
} Node;
// 创建链表
Node* createList() {
Node* head = (Node*)malloc(sizeof(Node)); // 创建头结点
head->data = 0; // 头结点不存储数据
head->next = NULL; // 头结点指向 NULL
return head;
}
// 插入结点
void insertNode(Node* head, int data, int pos) {
Node* p = head; // 定义指针 p 指向头结点
int i = 0;
while (p && i < pos - 1) { // 找到指定位置的前一个结点
p = p->next;
i++;
}
if (!p || i > pos - 1) { // 指定位置不存在
printf("插入位置错误!\n");
return;
}
Node* newNode = (Node*)malloc(sizeof(Node)); // 创建新结点
newNode->data = data; // 存储数据
newNode->next = p->next; // 新结点指向原来的下一个结点
p->next = newNode; // 前一个结点指向新结点
}
// 删除结点
void deleteNode(Node* head, int pos) {
Node* p = head; // 定义指针 p 指向头结点
int i = 0;
while (p && i < pos - 1) { // 找到指定位置的前一个结点
p = p->next;
i++;
}
if (!p || !(p->next) || i > pos - 1) { // 指定位置不存在或该结点不存在
printf("删除位置错误!\n");
return;
}
Node* delNode = p->next; // 定义指针 delNode 指向要删除的结点
p->next = delNode->next; // 前一个结点指向要删除的结点的下一个结点
free(delNode); // 释放要删除的结点的内存空间
}
// 查找结点
Node* findNode(Node* head, int data) {
Node* p = head->next; // 定义指针 p 指向第一个结点
while (p && p->data != data) { // 查找结点
p = p->next;
}
if (!p) { // 结点不存在
printf("结点不存在!\n");
return NULL;
}
return p; // 返回找到的结点
}
// 输出链表
void printList(Node* head) {
Node* p = head->next; // 定义指针 p 指向第一个结点
while (p) { // 循环输出结点
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
// 主函数
int main() {
Node* head = createList(); // 创建链表
insertNode(head, 1, 1); // 在第 1 个位置插入结点 1
insertNode(head, 2, 2); // 在第 2 个位置插入结点 2
insertNode(head, 3, 2); // 在第 2 个位置插入结点 3
printList(head); // 输出链表:1 3 2
deleteNode(head, 3); // 删除第 3 个结点
printList(head); // 输出链表:1 3
Node* node = findNode(head, 3); // 查找数据为 3 的结点
printf("%d\n", node->data); // 输出查找到的结点的数据
return 0;
}
```
阅读全文