用C语言的链表结构完成学生通讯录管理系统的四步,分别是1、创建链表2、在通讯录中按序号删除第i个成员3、按姓名删除通讯录成员4、按学号删除通讯录成员
时间: 2024-10-15 08:24:23 浏览: 68
在C语言中,我们可以使用链表数据结构来构建一个简单的学生通讯录管理系统。以下是四步操作的具体实现:
1. **创建链表**:
- 首先,我们需要定义一个结构体`Student`,包含学生的姓名(name)、学号(id)和下一个节点指针(next)。
```c
typedef struct Student {
char name[50];
int id;
struct Student* next;
} Student;
```
- 然后,我们创建一个全局链表头节点`head`并初始化它为NULL。
2. **在通讯录中按序号删除第i个成员**:
- 定义一个函数`delete_by_index(int index)`,遍历链表找到第i个节点,然后将其从链表中移除。
- 从头开始计数,当找到第i个节点时,更新其前一个节点的`next`指向第i+1个节点,如果索引过大导致越界,可以添加错误处理。
3. **按姓名删除通讯录成员**:
- 编写一个名为`delete_by_name(char* name)`的函数,遍历链表查找指定名字的节点。如果找到,将前一个节点的`next`跳过当前节点。
- 使用哈希表或自定义搜索算法提高查找速度,避免线性查找。
4. **按学号删除通讯录成员**:
- 类似地,定义`delete_by_id(int id)`函数,通过遍历链表,查找学号等于给定id的节点,并进行删除。
```c
void delete_by_index(int index) {
if (index < 1 || head == NULL) return; // ... 实现删除逻辑
}
void delete_by_name(char* name) {
Student* current = head;
while (current != NULL && strcmp(current->name, name) != 0) {
current = current->next;
}
// 如果找到了,则删除前一个节点指向的内容
if (current != NULL) {
if (current->next == NULL) {
head = current->next;
} else {
current->next = current->next->next;
}
}
}
void delete_by_id(int id) {
Student* current = head, *prev = NULL;
while (current != NULL) {
if (current->id == id) {
if (prev == NULL) { // 删除头节点
head = current->next;
} else {
prev->next = current->next;
}
free(current);
break;
}
prev = current;
current = current->next;
}
}
```
阅读全文