运用C语言基于单链表,用头插法建表,实现某班学生姓名数据的建表、展示、查找、定位、插入、删除、判定表空,求表长等操作
时间: 2023-10-19 18:03:43 浏览: 62
好的,我明白了。以下是使用C语言基于单链表,用头插法建表,实现某班学生姓名数据的建表、展示、查找、定位、插入、删除、判定表空,求表长等操作的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LENGTH 20 // 最大姓名长度
// 学生结构体,包含学生姓名和指向下一个学生的指针
typedef struct student {
char name[MAX_NAME_LENGTH];
struct student *next;
} student_t;
// 初始化链表
student_t* init_list() {
student_t *head = (student_t*) malloc(sizeof(student_t));
if (head == NULL) {
printf("初始化链表失败:无法分配内存\n");
exit(1);
}
head->next = NULL;
return head;
}
// 头插法建表
void create_list(student_t *head) {
char name[MAX_NAME_LENGTH];
printf("请输入学生姓名(输入 exit 结束输入):\n");
while (1) {
scanf("%s", name);
if (strcmp(name, "exit") == 0) {
break;
}
student_t *new = (student_t*) malloc(sizeof(student_t));
if (new == NULL) {
printf("无法创建新的学生结构体:无法分配内存\n");
exit(1);
}
strcpy(new->name, name);
new->next = head->next;
head->next = new;
}
}
// 展示链表
void show_list(student_t *head) {
if (head->next == NULL) {
printf("链表为空\n");
return;
}
printf("链表中的学生姓名为:\n");
student_t *p = head->next;
while (p != NULL) {
printf("%s\n", p->name);
p = p->next;
}
}
// 查找学生姓名并返回其指针
student_t* find_name(student_t *head, char *name) {
student_t *p = head->next;
while (p != NULL) {
if (strcmp(p->name, name) == 0) {
return p;
}
p = p->next;
}
return NULL;
}
// 定位某个学生结构体的位置并返回其指针
student_t* locate_list(student_t *head, int pos) {
student_t *p = head->next;
int i = 1;
while (p != NULL && i < pos) {
p = p->next;
i++;
}
if (p == NULL) {
return NULL;
}
return p;
}
// 在指定位置插入新的学生结构体
void insert_list(student_t *head, int pos) {
student_t *p = locate_list(head, pos);
if (p == NULL) {
printf("无法在指定位置插入新的学生结构体:位置无效\n");
return;
}
char name[MAX_NAME_LENGTH];
printf("请输入要插入的学生姓名:\n");
scanf("%s", name);
student_t *new = (student_t*) malloc(sizeof(student_t));
if (new == NULL) {
printf("无法创建新的学生结构体:无法分配内存\n");
exit(1);
}
strcpy(new->name, name);
new->next = p->next;
p->next = new;
}
// 删除指定位置的学生结构体
void delete_list(student_t *head, int pos) {
student_t *p = locate_list(head, pos - 1);
if (p == NULL || p->next == NULL) {
printf("无法删除指定位置的学生结构体:位置无效\n");
return;
}
student_t *tmp = p->next;
p->next = p->next->next;
free(tmp);
}
// 判定表空
int is_empty(student_t *head) {
return head->next == NULL;
}
// 求表长
int list_len(student_t *head) {
int len = 0;
student_t *p = head->next;
while (p != NULL) {
len++;
p = p->next;
}
return len;
}
int main() {
student_t *head = init_list();
create_list(head);
show_list(head);
insert_list(head, 2);
show_list(head);
delete_list(head, 3);
show_list(head);
printf("表长为:%d\n", list_len(head));
printf("表%s空\n", is_empty(head) ? "" : "不");
return 0;
}
```
这段代码通过头插法建立单链表,实现了建表、展示、查找、定位、插入、删除、判定表空和求表长等操作。如果还有其他问题,请继续提问。
阅读全文