要求实现如下功能: (1)建立链表:自定义函数建立单链表来存放会员的信息,如果输入大写‘Y’字符则继续创建结点存储会员信息,否则按任意键结束输入。 (2)积分兑换:自定义函数按照编号查找会员,并为这个会员兑换积分,5000分兑换10元,输入要兑换的积分数,输出兑换了多少元和剩余积分。如果没有找到,输出此会员不存在。 (3)写自定义函数释放链表所占内存。 (在主函数依次调用各函数即可)
时间: 2024-02-23 13:00:11 浏览: 41
好的,我可以帮你实现这个功能。以下是代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义会员信息结构体
typedef struct Member {
int id; // 会员编号
char name[20]; // 会员姓名
int score; // 会员积分
struct Member *next; // 指向下一个会员的指针
} Member;
// 全局变量,指向链表头结点
Member *head = NULL;
// 函数声明
void create_list();
void exchange_score();
void release_list();
int main() {
create_list(); // 建立链表
exchange_score(); // 积分兑换
release_list(); // 释放链表所占内存
return 0;
}
// 建立链表
void create_list() {
Member *p, *q;
char ch = 'Y';
while (ch == 'Y') {
p = (Member *)malloc(sizeof(Member));
printf("请输入会员编号:");
scanf("%d", &(p->id));
printf("请输入会员姓名:");
scanf("%s", p->name);
printf("请输入会员积分:");
scanf("%d", &(p->score));
p->next = NULL;
if (head == NULL) {
head = p;
q = p;
} else {
q->next = p;
q = p;
}
printf("是否继续添加会员信息(Y/N)?");
getchar(); // 吃掉换行符
scanf("%c", &ch);
}
}
// 积分兑换
void exchange_score() {
int id, score;
Member *p = head;
printf("请输入要兑换积分的会员编号:");
scanf("%d", &id);
while (p != NULL) {
if (p->id == id) {
printf("请输入要兑换的积分数:");
scanf("%d", &score);
if (score > p->score) {
printf("兑换失败,积分不足!\n");
} else {
p->score -= score;
printf("兑换成功,兑换了%d元,剩余积分%d\n", score / 500, p->score);
}
break;
}
p = p->next;
}
if (p == NULL) {
printf("此会员不存在!\n");
}
}
// 释放链表所占内存
void release_list() {
Member *p = head, *q;
while (p != NULL) {
q = p->next;
free(p);
p = q;
}
head = NULL;
}
```
以上代码中,我们定义了一个会员信息的结构体`Member`,其中包括会员编号、姓名、积分以及指向下一个会员的指针。在`create_list()`函数中,我们通过不断循环向链表中添加新的会员信息,直到用户输入的字符不是大写的`Y`为止。在`exchange_score()`函数中,我们首先要求用户输入要兑换积分的会员编号,然后遍历链表查找该会员,如果找到则要求用户输入要兑换的积分数,根据积分数计算兑换了多少元并输出剩余积分;如果没有找到则输出此会员不存在。在`release_list()`函数中,我们通过遍历链表逐个释放结点所占内存来释放整个链表所占内存。
在`main()`函数中,我们按照顺序依次调用了`create_list()`、`exchange_score()`和`release_list()`函数。