单链表的创建c语言主函数进行增删改查详细注释运行后可以用键盘读取数据
时间: 2023-05-30 19:05:14 浏览: 102
抱歉,我只是一名语言模型,无法提供运行代码。但我可以为您提供一个单链表的创建、增删改查的示例代码,并详细注释,供您参考。
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点的结构体
typedef struct node {
int data; // 数据域
struct node *next; // 指针域,用于指向下一个节点
} Node, *LinkedList;
// 创建链表
LinkedList createLinkedList() {
LinkedList head = (LinkedList)malloc(sizeof(Node)); // 创建头结点
head->next = NULL;
return head;
}
// 插入节点
void insertNode(LinkedList head, int data, int pos) {
int i = 0;
LinkedList p = head;
while (p != NULL && i < pos-1) { // 找到要插入位置的前一个节点
p = p->next;
i++;
}
if (p == NULL || i > pos-1) { // 未找到要插入位置的前一个节点,或插入位置不合法
printf("插入位置不合法\n");
return;
}
LinkedList newNode = (LinkedList)malloc(sizeof(Node)); // 创建新节点
newNode->data = data;
newNode->next = p->next;
p->next = newNode;
}
// 删除节点
void deleteNode(LinkedList head, int pos) {
int i = 0;
LinkedList p = head;
while (p != NULL && i < pos-1) { // 找到要删除位置的前一个节点
p = p->next;
i++;
}
if (p == NULL || p->next == NULL || i > pos-1) { // 未找到要删除位置的前一个节点,或删除位置不合法
printf("删除位置不合法\n");
return;
}
LinkedList q = p->next; // 要删除的节点
p->next = q->next;
free(q);
}
// 修改节点
void modifyNode(LinkedList head, int data, int pos) {
int i = 0;
LinkedList p = head->next;
while (p != NULL && i < pos-1) { // 找到要修改的节点
p = p->next;
i++;
}
if (p == NULL || i > pos-1) { // 未找到要修改的节点,或修改位置不合法
printf("修改位置不合法\n");
return;
}
p->data = data;
}
// 查找节点
int searchNode(LinkedList head, int data) {
int pos = 0;
LinkedList p = head->next;
while (p != NULL && p->data != data) { // 找到数据为data的节点
p = p->next;
pos++;
}
if (p == NULL) { // 未找到数据为data的节点
return -1;
}
return pos;
}
// 输出链表
void printLinkedList(LinkedList head) {
LinkedList p = head->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
LinkedList L = createLinkedList(); // 创建链表
int data, pos, choice;
while (1) {
printf("\n请选择要进行的操作:\n");
printf("1. 插入节点\n");
printf("2. 删除节点\n");
printf("3. 修改节点\n");
printf("4. 查找节点\n");
printf("5. 输出链表\n");
printf("6. 退出\n");
scanf("%d", &choice);
switch (choice) {
case 1: // 插入节点
printf("请输入要插入的数据和位置(用空格隔开):\n");
scanf("%d %d", &data, &pos);
insertNode(L, data, pos);
break;
case 2: // 删除节点
printf("请输入要删除的位置:\n");
scanf("%d", &pos);
deleteNode(L, pos);
break;
case 3: // 修改节点
printf("请输入要修改的数据和位置(用空格隔开):\n");
scanf("%d %d", &data, &pos);
modifyNode(L, data, pos);
break;
case 4: // 查找节点
printf("请输入要查找的数据:\n");
scanf("%d", &data);
pos = searchNode(L, data);
if (pos == -1) {
printf("未找到数据为%d的节点\n", data);
} else {
printf("数据为%d的节点在第%d个位置\n", data, pos+1);
}
break;
case 5: // 输出链表
printf("链表:");
printLinkedList(L);
break;
case 6: // 退出
exit(0);
default:
printf("输入不合法,请重新输入!\n");
break;
}
}
return 0;
}
```
阅读全文