要求如下: 1.定义数据类型。(2分) 2.初始化创建单向循环链表,将4个支部成员信息添加到单链表中。(2分) 3.输出所有成员的信息。(2分) 4查找学习次数大于n的成员姓名和学号,并输出。(1分) 5.根据学号信息,修改指定成员的学习次数。(1分) 6.由于某支部成员关系转出,现需删除该成员信息。(1分) 7.由于关系转入,需要插入该成员信息到表中。(1分) 测试数据如下: 1.初始化构建单链表,存储下述表中信息,并输出。 支部名学号姓名次数支部1 001 张三15 支部1 A002 李四12 支部1 A005 王五20 支部1 A007 赵六13 2.查找学习次数大于15的数据,并输出学号和名字;
时间: 2023-05-29 20:07:49 浏览: 116
3.将学号为A002的成员学习次数修改为18,并输出修改后的信息; 4.删除学号为A005的成员信息,并输出删除后的链表; 5.添加学号为A008、姓名为钱七、学习次数为10的成员信息,并输出添加后的链表。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//定义支部成员结构体
typedef struct member {
char branch[10]; //支部名
char num[5]; //学号
char name[10]; //姓名
int count; //学习次数
struct member *next; //指向下一个成员的指针
}Member;
//初始化创建单向循环链表
Member *init() {
Member *head = (Member*)malloc(sizeof(Member)); //创建头结点
head->next = head; //头节点的next指向自己,即为一个空链表
return head;
}
//添加成员信息到链表中
void add(Member *head, char *branch, char *num, char *name, int count) {
Member *p = (Member*)malloc(sizeof(Member)); //创建新节点
strcpy(p->branch, branch);
strcpy(p->num, num);
strcpy(p->name, name);
p->count = count;
p->next = head->next; //新节点的next指向头节点的下一个节点
head->next = p; //头节点的next指向新节点
}
//输出所有成员信息
void print(Member *head) {
Member *p = head->next; //从第一个成员节点开始输出
while(p != head) { //当指针指向头结点时,表示链表已经输出完毕
printf("%s %s %s %d\n", p->branch, p->num, p->name, p->count);
p = p->next;
}
}
//查找学习次数大于n的成员姓名和学号,并输出
void search(Member *head, int n) {
Member *p = head->next;
int flag = 0; //标记是否有符合条件的成员
while(p != head) {
if(p->count > n) {
printf("%s %s\n", p->num, p->name);
flag = 1;
}
p = p->next;
}
if(!flag) {
printf("没有符合条件的成员\n");
}
}
//根据学号信息,修改指定成员的学习次数
void modify(Member *head, char *num, int count) {
Member *p = head->next;
int flag = 0; //标记是否找到指定的成员
while(p != head) {
if(strcmp(p->num, num) == 0) {
p->count = count;
flag = 1;
break;
}
p = p->next;
}
if(!flag) {
printf("没有找到该成员\n");
}
else {
printf("修改成功\n");
}
}
//删除指定学号的成员信息
void del(Member *head, char *num) {
Member *p = head->next;
Member *pre = head; //记录p的前一个节点,方便删除操作
int flag = 0; //标记是否找到指定的成员
while(p != head) {
if(strcmp(p->num, num) == 0) {
pre->next = p->next; //将p的前一个节点的next指向p的下一个节点
free(p); //释放p节点的空间
flag = 1;
break;
}
pre = p;
p = p->next;
}
if(!flag) {
printf("没有找到该成员\n");
}
else {
printf("删除成功\n");
}
}
//插入成员信息到链表中
void insert(Member *head, char *branch, char *num, char *name, int count) {
Member *p = head->next;
Member *pre = head; //记录p的前一个节点,方便插入操作
while(p != head) {
if(strcmp(p->num, num) > 0) { //找到第一个学号大于num的成员
break;
}
pre = p;
p = p->next;
}
Member *new_member = (Member*)malloc(sizeof(Member)); //创建新节点
strcpy(new_member->branch, branch);
strcpy(new_member->num, num);
strcpy(new_member->name, name);
new_member->count = count;
new_member->next = p; //新节点的next指向p
pre->next = new_member; //p的前一个节点的next指向新节点
}
int main() {
Member *head = init(); //创建头结点
//添加成员信息到链表中
add(head, "支部1", "001", "张三", 15);
add(head, "支部1", "A002", "李四", 12);
add(head, "支部1", "A005", "王五", 20);
add(head, "支部1", "A007", "赵六", 13);
//输出所有成员信息
printf("所有成员信息:\n");
print(head);
//查找学习次数大于15的成员姓名和学号
printf("\n学习次数大于15的成员姓名和学号:\n");
search(head, 15);
//修改学号为A002的成员学习次数为18
printf("\n修改后的成员信息:\n");
modify(head, "A002", 18);
print(head);
//删除学号为A005的成员信息
printf("\n删除学号为A005的成员信息:\n");
del(head, "A005");
print(head);
//添加学号为A008、姓名为钱七、学习次数为10的成员信息
printf("\n添加学号为A008、姓名为钱七、学习次数为10的成员信息:\n");
insert(head, "支部1", "A008", "钱七", 10);
print(head);
return 0;
}
阅读全文