#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>
#define MAXSIZE 1000
typedef struct Student {
wchar_t name[20];
int num;
wchar_t sex[10];
wchar_t dianhua[20];
wchar_t place[20];
} Student;
typedef struct {
Student elem[MAXSIZE];
int last;
} SeqList;
void InList(SeqList *L, int i) {
int x;
printf("请输入学生数量:");
scanf("%d", &x);
L->last = x;
for (i = 1; i <= x; i++) {
printf("第%d位学生信息\n", i);
printf("———————————————\n");
printf("姓名:");
scanf("%ls", L->elem[i].name);
printf("———————————————\n");
printf("学号:");
scanf("%d", &L->elem[i].num);
printf("———————————————\n");
printf("性别:");
scanf("%ls", L->elem[i].sex);
printf("———————————————\n");
printf("电话:");
scanf("%ls", L->elem[i].dianhua);
printf("———————————————\n");
printf("籍贯:");
scanf("%ls", L->elem[i].place);
}
printf("\n");
}
void PrintList(SeqList *L, int i) {
for (i = 1; i <= L->last; i++) {
printf("姓名:%ls 学号:%d 性别:%ls 电话:%ls 籍贯:%ls\n", L->elem[i].name, L->elem[i].num, L->elem[i].sex, L->elem[i].dianhua, L->elem[i].place);
}
}
void Find(SeqList *L) {
int i = 1;
int n;
if (L->last < 1) {
printf("没有该同学\n");
return;
}
printf("输入要查找学生的学号\n");
scanf("%d", &n);
while (i <= L->last && L->elem[i].num != n) {
i++;
}
if (i <= L->last) {
printf("该学生姓名为:%ls 学号为:%d 性别为:%ls 电话为:%ls 籍贯为:%ls\n", L->elem[i].name, L->elem[i].num, L->elem[i].sex, L->elem[i].dianhua, L->elem[i].place);
return;
}
if (i > L->last) {
printf("学号错误,未查询到该学生\n");
return;
}
}
int Delete(SeqList *L, int i) {
int j;
int k;
int error;
printf("请输入要删除的学生学号:");
scanf("%d", &i);
if (L->last < 1) {
printf("空表!");
return error;
}
for (k = 1; k <= L->last; k++) {
if (L->elem[k].num == i)
break;
}
if (k > L->last) {
printf("未找到该学生!\n");
return error;
} else {
for (j = k; j <= L->last; j++)
L->elem[j] = L->elem[j + 1];
L->last--;
return 1;
}
}
int Insert(SeqList *L, int i, Student e) {
int j;
if (L->last == MAXSIZE) {
printf("表满\n");
return 0;
}
if (i < 1 || i > L->last + 2) {
printf("位序不合法\n");
return 0;
}
for (j = L->last; j >= i - 1; j--)
L->elem[j + 1] = L->elem[j];
L->elem[i] = e;
L->last++;
return 1;
}
void CountAllPlaces(SeqList *L) {
wchar_t places[MAXSIZE][20];
int count[MAXSIZE] = {0};
int uniqueCount = 0;
for (int i = 1; i <= L->last; i++) {
int found = 0;
for (int j = 0; j < uniqueCount; j++) {
if (wcscmp(L->elem[i].place, places[j]) == 0) {
count[j]++;
found = 1;
break;
}
}
if (!found) {
wcscpy(places[uniqueCount], L->elem[i].place);
count[uniqueCount]++;
uniqueCount++;
}
}
for (int i = 0; i < uniqueCount; i++) {
printf("%ls %d\n", places[i], count[i]);
}
}
int main() {
setlocale(LC_ALL, "");
int N = 1, i, j;
SeqList L;
Student e, g, q;
int renshu, a;
printf("**********************\n");
printf("*------选择操作------*\n");
printf("*------1 登记--------*\n");
printf("*------2 输出--------*\n");
printf("*------3 查询--------*\n");
printf("*------4 删除--------*\n");
printf("*------5 插入--------*\n");
printf("*------6 统计所有生源----*\n");
printf("*------0 退出--------*\n");
printf("**********************\n");
while (N) {
printf("请选择操作\n");
scanf("%d", &N);
if (N == 1) {
InList(&L, i);
} else if (N == 2) {
PrintList(&L, i);
} else if (N == 3) {
Find(&L);
} else if (N == 4) {
if (Delete(&L, j)) {
renshu--;
printf("删除成功\n");
} else {
printf("删除失败\n");
}
} else if (N == 5) {
printf("请输入要插入的位置:");
scanf("%d", &a);
printf("请输入学生姓名:");
scanf("%ls", g.name);
printf("请输入学生学号:");
scanf("%d", &g.num);
printf("请输入学生性别:");
scanf("%ls", g.sex);
printf("请输入学生电话:");
scanf("%ls", g.dianhua);
printf("请输入学生籍贯:");
scanf("%ls", g.place);
if (Insert(&L, a, g)) {
renshu++;
printf("插入成功\n");
} else {
printf("插入失败\n");
}
} else if (N == 6) {
CountAllPlaces(&L);
} else if (N == 0) {
printf("退出成功,按任意键结束\n");
exit(0);
}
}
return 0;
}

