帮我写一个C语言创建链表以及链表的增删改查
时间: 2023-07-25 20:41:25 浏览: 99
好的,以下是一个简单的C语言示例,演示如何创建链表以及链表的增删改查操作。
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct node {
int data;
struct node* next;
} Node;
// 创建链表
Node* createList() {
Node* head = NULL; // 链表头指针
Node* tail = NULL; // 链表尾指针
Node* newNode = NULL; // 新节点指针
int data = 0;
// 循环读入数据,直到输入0为止
do {
printf("请输入一个整数(输入0结束):");
scanf("%d", &data);
if (data != 0) {
// 创建新节点
newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
// 如果链表为空,则新节点为头节点和尾节点
if (head == NULL) {
head = newNode;
tail = newNode;
} else {
// 否则将新节点插入到链表尾部
tail->next = newNode;
tail = newNode;
}
}
} while (data != 0);
return head;
}
// 遍历链表
void traverseList(Node* head) {
Node* p = head;
printf("链表元素为:");
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
// 查找链表节点
Node* searchNode(Node* head, int data) {
Node* p = head;
while (p != NULL) {
if (p->data == data) {
return p;
}
p = p->next;
}
return NULL;
}
// 向链表中插入节点
void insertNode(Node** head, int data, int position) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
if (*head == NULL) {
// 如果链表为空,则直接将新节点设置为头节点
newNode->next = NULL;
*head = newNode;
} else {
// 找到插入位置的前一个节点
Node* p = *head;
int i = 1;
while (p->next != NULL && i < position - 1) {
p = p->next;
i++;
}
// 将新节点插入到链表中
newNode->next = p->next;
p->next = newNode;
}
}
// 从链表中删除节点
void deleteNode(Node** head, int data) {
Node* p = *head;
Node* prev = NULL;
while (p != NULL) {
if (p->data == data) {
if (prev == NULL) {
// 如果要删除的节点是头节点,则将头节点指针指向下一个节点
*head = p->next;
} else {
// 否则将前一个节点的next指针指向下一个节点
prev->next = p->next;
}
free(p);
return;
}
prev = p;
p = p->next;
}
}
// 修改链表节点的值
void updateNode(Node* head, int oldData, int newData) {
Node* p = head;
while (p != NULL) {
if (p->data == oldData) {
p->data = newData;
return;
}
p = p->next;
}
}
int main() {
Node* head = NULL;
int choice = 0;
int data = 0;
int position = 0;
do {
printf("\n请选择操作:\n");
printf("1. 创建链表\n");
printf("2. 遍历链表\n");
printf("3. 查找节点\n");
printf("4. 插入节点\n");
printf("5. 删除节点\n");
printf("6. 修改节点\n");
printf("0. 退出\n");
scanf("%d", &choice);
switch (choice) {
case 1:
head = createList();
break;
case 2:
traverseList(head);
break;
case 3:
printf("请输入要查找的元素:");
scanf("%d", &data);
if (searchNode(head, data) == NULL) {
printf("元素 %d 不存在\n", data);
} else {
printf("元素 %d 存在\n", data);
}
break;
case 4:
printf("请输入要插入的元素:");
scanf("%d", &data);
printf("请输入要插入的位置:");
scanf("%d", &position);
insertNode(&head, data, position);
break;
case 5:
printf("请输入要删除的元素:");
scanf("%d", &data);
deleteNode(&head, data);
break;
case 6:
printf("请输入要修改的元素:");
scanf("%d", &data);
printf("请输入要修改成的元素:");
scanf("%d", &position);
updateNode(head, data, position);
break;
case 0:
break;
default:
printf("无效的选择,请重新输入\n");
break;
}
} while (choice != 0);
return 0;
}
```
这个示例程序实现了创建链表、遍历链表、查找节点、插入节点、删除节点和修改节点等操作。你可以根据自己的需要进行修改或扩展。
阅读全文