链式存储结构如何增删改查
时间: 2023-12-26 20:04:49 浏览: 16
链式存储结构是一种动态的数据结构,可以方便地进行增删改查操作。具体方法如下:
1. 增加操作:在链表末尾添加一个新节点,或在指定位置插入一个新节点。具体步骤如下:
- 在链表末尾添加新节点:先找到链表的尾节点,然后将新节点插入到尾节点的后面即可。
- 在指定位置插入新节点:先找到指定位置的前一个节点,然后将新节点插入到该节点的后面即可。
2. 删除操作:删除指定节点或删除链表中的某个位置。具体步骤如下:
- 删除指定节点:先找到要删除的节点,然后修改前一个节点的指针,使其指向要删除节点的下一个节点即可。
- 删除指定位置:先找到要删除位置的前一个节点,然后修改前一个节点的指针,使其指向要删除节点的下一个节点即可。
3. 修改操作:修改链表中的某个节点的值。具体步骤如下:
- 先找到要修改的节点,然后修改其值即可。
4. 查询操作:查找链表中的某个节点或查找链表中的所有节点。具体步骤如下:
- 查找指定节点:从链表头开始遍历链表,直到找到指定节点或遍历到链表末尾。
- 查找所有节点:从链表头开始遍历链表,依次输出每个节点的值即可。
相关问题
使用c语言的链式存储结构实现学生信息管理的增删改查
以下是使用C语言链式存储结构实现学生信息管理的增删改查的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义学生结构体
typedef struct student {
char name[20]; // 姓名
int age; // 年龄
char id[10]; // 学号
struct student *next;
} Student;
// 创建新的学生节点
Student *create_student() {
Student *new_student = (Student *)malloc(sizeof(Student));
printf("请输入学生姓名:");
scanf("%s", new_student->name);
printf("请输入学生年龄:");
scanf("%d", &(new_student->age));
printf("请输入学生学号:");
scanf("%s", new_student->id);
new_student->next = NULL;
return new_student;
}
// 添加学生
void add_student(Student **head) {
Student *new_student = create_student();
if (*head == NULL) {
*head = new_student;
} else {
Student *p = *head;
while (p->next != NULL) {
p = p->next;
}
p->next = new_student;
}
printf("添加成功!\n");
}
// 删除学生
void delete_student(Student **head) {
if (*head == NULL) {
printf("链表为空,无法删除!\n");
return;
}
char id[10];
printf("请输入要删除学生的学号:");
scanf("%s", id);
Student *p = *head;
if (strcmp(p->id, id) == 0) {
*head = p->next;
free(p);
printf("删除成功!\n");
return;
}
while (p->next != NULL) {
if (strcmp(p->next->id, id) == 0) {
Student *temp = p->next;
p->next = temp->next;
free(temp);
printf("删除成功!\n");
return;
}
p = p->next;
}
printf("未找到该学号的学生!\n");
}
// 修改学生信息
void modify_student(Student *head) {
if (head == NULL) {
printf("链表为空,无法修改!\n");
return;
}
char id[10];
printf("请输入要修改学生的学号:");
scanf("%s", id);
Student *p = head;
while (p != NULL) {
if (strcmp(p->id, id) == 0) {
printf("请输入新的学生姓名:");
scanf("%s", p->name);
printf("请输入新的学生年龄:");
scanf("%d", &(p->age));
printf("修改成功!\n");
return;
}
p = p->next;
}
printf("未找到该学号的学生!\n");
}
// 查找学生信息
void find_student(Student *head) {
if (head == NULL) {
printf("链表为空,无法查找!\n");
return;
}
char id[10];
printf("请输入要查找学生的学号:");
scanf("%s", id);
Student *p = head;
while (p != NULL) {
if (strcmp(p->id, id) == 0) {
printf("学生姓名:%s\n", p->name);
printf("学生年龄:%d\n", p->age);
printf("学生学号:%s\n", p->id);
return;
}
p = p->next;
}
printf("未找到该学号的学生!\n");
}
// 输出所有学生信息
void print_all_students(Student *head) {
if (head == NULL) {
printf("链表为空!\n");
return;
}
Student *p = head;
while (p != NULL) {
printf("学生姓名:%s\n", p->name);
printf("学生年龄:%d\n", p->age);
printf("学生学号:%s\n", p->id);
printf("\n");
p = p->next;
}
}
int main() {
Student *head = NULL; // 头节点
int choice;
while (1) {
printf("请选择操作:\n");
printf("1. 添加
使用c语言,使用链式存储结构,实现学生信息管理系统,实现功能增删改查
好的,以下是使用链式存储结构实现学生信息管理系统的代码(包含增删改查功能):
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 20
#define MAX_ID_LEN 10
typedef struct student {
char name[MAX_NAME_LEN];
char id[MAX_ID_LEN];
int age;
struct student *next;
} Student;
Student *head = NULL; // 学生信息链表头指针
// 函数声明
void add();
void delete();
void modify();
void search();
void print_all();
void clear_all();
int main() {
int op;
while (1) {
printf("\n");
printf("1. Add student\n");
printf("2. Delete student\n");
printf("3. Modify student\n");
printf("4. Search student\n");
printf("5. Print all students\n");
printf("6. Clear all students\n");
printf("0. Exit\n");
printf("Please select an operation: ");
scanf("%d", &op);
switch (op) {
case 1:
add();
break;
case 2:
delete();
break;
case 3:
modify();
break;
case 4:
search();
break;
case 5:
print_all();
break;
case 6:
clear_all();
break;
case 0:
printf("Goodbye!\n");
return 0;
default:
printf("Invalid operation!\n");
break;
}
}
}
// 添加学生信息
void add() {
Student *p = (Student *)malloc(sizeof(Student));
if (p == NULL) {
printf("Memory allocation failed!\n");
return;
}
printf("Please input student name: ");
scanf("%s", p->name);
printf("Please input student ID: ");
scanf("%s", p->id);
printf("Please input student age: ");
scanf("%d", &(p->age));
p->next = head;
head = p;
printf("Student added successfully!\n");
}
// 删除学生信息
void delete() {
char id[MAX_ID_LEN];
printf("Please input the ID of the student to be deleted: ");
scanf("%s", id);
Student *p = head;
Student *pre = NULL;
while (p != NULL && strcmp(p->id, id) != 0) {
pre = p;
p = p->next;
}
if (p == NULL) {
printf("Student with ID %s not found!\n", id);
return;
}
if (pre == NULL) {
head = p->next;
} else {
pre->next = p->next;
}
free(p);
printf("Student with ID %s deleted successfully!\n", id);
}
// 修改学生信息
void modify() {
char id[MAX_ID_LEN];
printf("Please input the ID of the student to be modified: ");
scanf("%s", id);
Student *p = head;
while (p != NULL && strcmp(p->id, id) != 0) {
p = p->next;
}
if (p == NULL) {
printf("Student with ID %s not found!\n", id);
return;
}
printf("Please input new student name (current name is %s): ", p->name);
scanf("%s", p->name);
printf("Please input new student age (current age is %d): ", p->age);
scanf("%d", &(p->age));
printf("Student with ID %s modified successfully!\n", id);
}
// 查找学生信息
void search() {
char id[MAX_ID_LEN];
printf("Please input the ID of the student to be searched: ");
scanf("%s", id);
Student *p = head;
while (p != NULL && strcmp(p->id, id) != 0) {
p = p->next;
}
if (p == NULL) {
printf("Student with ID %s not found!\n", id);
return;
}
printf("Student found:\n");
printf("Name: %s\n", p->name);
printf("ID: %s\n", p->id);
printf("Age: %d\n", p->age);
}
// 打印所有学生信息
void print_all() {
if (head == NULL) {
printf("No students to show!\n");
return;
}
printf("All students:\n");
Student *p = head;
while (p != NULL) {
printf("Name: %s, ID: %s, Age: %d\n", p->name, p->id, p->age);
p = p->next;
}
}
// 清空所有学生信息
void clear_all() {
Student *p = head;
while (p != NULL) {
head = p->next;
free(p);
p = head;
}
printf("All students cleared successfully!\n");
}
```
在上面的代码中,我们使用了一个结构体 `Student` 来表示每个学生的信息,包含姓名、学号、年龄和下一个学生信息的指针。我们使用了一个链表来存储所有学生的信息,链表的头指针为 `head`。
接下来,我们实现了增删改查和打印所有学生信息的功能,具体实现方式在代码注释中有说明。最后,我们还提供了清空所有学生信息的功能,以便在需要时清除所有数据。