用c语言写单链表的创建、插入、删除、查找、显示
时间: 2023-05-31 21:01:40 浏览: 29
#include <stdio.h>
#include <stdlib.h>
// 定义一个单链表的节点
typedef struct node {
int data; // 数据域
struct node *next; // 指针域
} Node;
// 创建一个单链表
Node *createList() {
Node *head = NULL; // 定义头节点
Node *tail = NULL; // 定义尾节点
int data; // 定义节点数据
printf("请输入一个整数作为节点数据,输入-1结束:\n");
while (1) {
scanf("%d", &data);
if (data == -1) break; // 输入-1结束
Node *newNode = (Node *)malloc(sizeof(Node)); // 创建新节点
newNode->data = data; // 将数据存入新节点
newNode->next = NULL; // 新节点的指针域置空
if (head == NULL) { // 如果头节点为空,则新节点为头节点
head = newNode;
tail = newNode;
} else { // 否则将新节点插入到尾部
tail->next = newNode;
tail = newNode;
}
}
return head; // 返回头节点
}
// 在单链表的第pos个位置插入一个值为data的节点
void insertNode(Node *head, int pos, int data) {
Node *p = head;
int i = 1;
while (p != NULL && i < pos - 1) { // 寻找第pos-1个节点
p = p->next;
i++;
}
if (p == NULL || i > pos - 1) { // 插入位置非法,直接返回
printf("插入位置非法!\n");
return;
}
Node *newNode = (Node *)malloc(sizeof(Node)); // 创建新节点
newNode->data = data; // 将数据存入新节点
newNode->next = p->next; // 新节点的后继节点为p的后继节点
p->next = newNode; // p的后继节点为新节点
}
// 删除第pos个位置的节点
void deleteNode(Node *head, int pos) {
Node *p = head;
int i = 1;
while (p != NULL && i < pos - 1) { // 寻找第pos-1个节点
p = p->next;
i++;
}
if (p == NULL || i > pos - 1 || p->next == NULL) { // 删除位置非法,直接返回
printf("删除位置非法!\n");
return;
}
Node *q = p->next; // 定义待删除节点q
p->next = q->next; // p的后继节点为q的后继节点
free(q); // 释放q节点的内存
}
// 查找值为data的节点
int searchNode(Node *head, int data) {
Node *p = head;
int pos = 1;
while (p != NULL) {
if (p->data == data) { // 找到节点
printf("节点%d的值为%d\n", pos, data);
return pos;
}
p = p->next;
pos++;
}
printf("未找到值为%d的节点!\n", data);
return 0;
}
// 显示单链表中的所有节点
void displayList(Node *head) {
Node *p = head;
printf("单链表中的所有节点为:\n");
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
Node *head = createList(); // 创建单链表
displayList(head); // 显示单链表
insertNode(head, 2, 100); // 在第2个位置插入值为100的节点
displayList(head); // 显示单链表
deleteNode(head, 3); // 删除第3个位置的节点
displayList(head); // 显示单链表
searchNode(head, 50); // 查找值为50的节点
return 0;
}