定义一个包含学生信息(学号,姓名,成绩)的的顺序表和链表,使其具有如下功能:(1) 根据指定学生个数,逐个输入学生信息;(2) 逐个显示学生表中所有学生的相关信息;(3) 根据姓名进行查找,返回此学生
时间: 2023-05-31 09:19:16 浏览: 1804
### 回答1:
的学号和成绩;(4) 根据学号进行查找,返回此学生的姓名和成绩;(5) 根据成绩进行排序,从高到低或从低到高输出学生表中所有学生的相关信息。
顺序表和链表都是一种数据结构,用于存储一系列数据。顺序表是一种线性结构,通过数组实现,可以随机访问元素;链表是一种非线性结构,通过指针实现,只能顺序访问元素。
定义一个包含学生信息的顺序表,可以使用数组来存储学生信息。每个学生信息包含学号、姓名和成绩三个字段,可以定义一个结构体来表示:
struct Student {
int id; // 学号
char name[20]; // 姓名
float score; // 成绩
};
然后定义一个数组来存储学生信息:
#define MAX_SIZE 100 // 最大容量
struct SeqList {
Student data[MAX_SIZE]; // 学生信息数组
int length; // 当前长度
};
接下来可以定义一些函数来实现上述功能:
// 初始化顺序表
void InitList(SeqList &L) {
L.length = 0;
}
// 插入学生信息
bool InsertList(SeqList &L, Student s) {
if (L.length >= MAX_SIZE) {
return false; // 容量已满,插入失败
}
L.data[L.length++] = s; // 插入到末尾
return true;
}
// 显示学生信息
void ShowList(SeqList L) {
for (int i = 0; i < L.length; i++) {
printf("学号:%d,姓名:%s,成绩:%.2f\n", L.data[i].id, L.data[i].name, L.data[i].score);
}
}
// 根据姓名查找学生信息
Student FindByName(SeqList L, char *name) {
for (int i = 0; i < L.length; i++) {
if (strcmp(L.data[i].name, name) == 0) {
return L.data[i]; // 找到了,返回学生信息
}
}
Student s = {0, "", 0}; // 没找到,返回空学生信息
return s;
}
// 根据学号查找学生信息
Student FindById(SeqList L, int id) {
for (int i = 0; i < L.length; i++) {
if (L.data[i].id == id) {
return L.data[i]; // 找到了,返回学生信息
}
}
Student s = {0, "", 0}; // 没找到,返回空学生信息
return s;
}
// 按成绩排序
void SortList(SeqList &L, bool asc) {
for (int i = 0; i < L.length - 1; i++) {
for (int j = i + 1; j < L.length; j++) {
if ((asc && L.data[i].score > L.data[j].score) || (!asc && L.data[i].score < L.data[j].score)) {
Student temp = L.data[i];
L.data[i] = L.data[j];
L.data[j] = temp;
}
}
}
}
定义一个包含学生信息的链表,可以使用指针来存储学生信息。每个学生信息包含学号、姓名和成绩三个字段,可以定义一个结构体来表示:
struct Student {
int id; // 学号
char name[20]; // 姓名
float score; // 成绩
Student *next; // 指向下一个学生的指针
};
然后定义一个头指针来表示链表的头部:
struct LinkList {
Student *head; // 头指针
int length; // 当前长度
};
接下来可以定义一些函数来实现上述功能:
// 初始化链表
void InitList(LinkList &L) {
L.head = NULL;
L.length = 0;
}
// 插入学生信息
bool InsertList(LinkList &L, Student s) {
Student *p = new Student;
p->id = s.id;
strcpy(p->name, s.name);
p->score = s.score;
p->next = NULL;
if (L.head == NULL) {
L.head = p; // 链表为空,插入到头部
} else {
Student *q = L.head;
while (q->next != NULL) {
q = q->next; // 找到链表末尾
}
q->next = p; // 插入到末尾
}
L.length++;
return true;
}
// 显示学生信息
void ShowList(LinkList L) {
Student *p = L.head;
while (p != NULL) {
printf("学号:%d,姓名:%s,成绩:%.2f\n", p->id, p->name, p->score);
p = p->next;
}
}
// 根据姓名查找学生信息
Student FindByName(LinkList L, char *name) {
Student *p = L.head;
while (p != NULL) {
if (strcmp(p->name, name) == 0) {
return *p; // 找到了,返回学生信息
}
p = p->next;
}
Student s = {0, "", 0, NULL}; // 没找到,返回空学生信息
return s;
}
// 根据学号查找学生信息
Student FindById(LinkList L, int id) {
Student *p = L.head;
while (p != NULL) {
if (p->id == id) {
return *p; // 找到了,返回学生信息
}
p = p->next;
}
Student s = {0, "", 0, NULL}; // 没找到,返回空学生信息
return s;
}
// 按成绩排序
void SortList(LinkList &L, bool asc) {
for (int i = 0; i < L.length - 1; i++) {
Student *p = L.head;
for (int j = 0; j < L.length - i - 1; j++) {
Student *q = p->next;
if ((asc && p->score > q->score) || (!asc && p->score < q->score)) {
// 交换相邻两个节点的数据
int temp_id = p->id;
p->id = q->id;
q->id = temp_id;
char temp_name[20];
strcpy(temp_name, p->name);
strcpy(p->name, q->name);
strcpy(q->name, temp_name);
float temp_score = p->score;
p->score = q->score;
q->score = temp_score;
}
p = p->next;
}
}
}
这样就可以定义一个包含学生信息的顺序表和链表,并实现上述功能了。
### 回答2:
顺序表和链表都是常用的数据结构,能够编写出包含学生信息的顺序表和链表,使其具备以下功能:
1. 根据指定学生个数,逐个输入学生信息
对于顺序表,我们可以通过以下方式实现:
```c
#define MAXSIZE 100 // 定义最大容量为100
typedef struct {
int num;
char name[20];
double score;
}Student;
typedef struct {
Student data[MAXSIZE]; // 用数组存放数据
int length; // 记录当前顺序表的长度
}SqList;
void inputStudent(SqList *L, int n) {
for(int i = 0; i < n; i++) {
printf("请输入第%d个学生的信息(学号, 姓名, 分数):\n", i+1);
scanf("%d %s %lf", &L->data[i].num, L->data[i].name, &L->data[i].score);
L->length++; // 每次插入一个元素,长度加1
}
}
```
对于链表,我们可以通过以下方式实现:
```c
typedef struct {
int num;
char name[20];
double score;
struct Node *next;
}Node, *LinkList;
void inputStudent(LinkList *L, int n) {
for(int i = 0; i < n; i++) {
Node *s = (Node*)malloc(sizeof(Node)); // 动态分配空间
printf("请输入第%d个学生的信息(学号, 姓名, 分数):\n", i+1);
scanf("%d %s %lf", &s->num, s->name, &s->score);
s->next = L->next; // 将新节点插入链表头
L->next = s;
}
}
```
2. 逐个显示学生表中所有学生的相关信息
对于顺序表,我们可以通过以下方式实现:
```c
void printStudent(SqList L) {
printf("学号\t姓名\t分数\n");
for(int i = 0; i < L.length; i++) {
printf("%d\t%s\t%.1f\n", L.data[i].num, L.data[i].name, L.data[i].score);
}
}
```
对于链表,我们可以通过以下方式实现:
```c
void printStudent(LinkList L) {
printf("学号\t姓名\t分数\n");
Node *p = L->next;
while(p != NULL) {
printf("%d\t%s\t%.1f\n", p->num, p->name, p->score);
p = p->next;
}
}
```
3. 根据姓名进行查找,返回此学生。
对于顺序表,我们可以通过以下方式实现:
```c
int searchStudent(SqList L, char *name) {
for(int i = 0; i < L.length; i++) {
if(strcmp(L.data[i].name, name) == 0) {
return i; // 找到该学生,返回下标
}
}
return -1; // 没有找到该学生
}
```
对于链表,我们可以通过以下方式实现:
```c
Node* searchStudent(LinkList L, char *name) {
Node *p = L->next;
while(p != NULL) {
if(strcmp(p->name, name) == 0) {
return p; // 找到该学生,返回节点指针
}
p = p->next;
}
return NULL; // 没有找到该学生
}
```
总结:通过上述代码可以看出,使用顺序表和链表都能实现包含学生信息的数据结构,实现了插入、遍历和搜索等常用操作。而且顺序表和链表各有优缺点,具体使用哪种数据结构,需要根据具体情况进行选择。
### 回答3:
顺序表和链表都是数据结构中常用的储存序列类型的数据结构,可以用来储存学生信息(学号,姓名,成绩)。以下是两种数据结构的实现方式和实现代码。
顺序表实现:
定义一个包含学生信息的结构体:
struct Student {
int student_id;
char *name;
float score;
};
定义一个包含学生信息的顺序表:
struct Student_List {
struct Student *student;
int list_size;
int max_size;
};
定义一个函数初始化顺序表:
void Init_Student_List(struct Student_List *list, int max) {
list->list_size = 0;
list->max_size = max;
list->student = malloc(max * sizeof(struct Student));
}
定义一个函数向顺序表中添加学生信息:
void Add_Student(struct Student_List *list, struct Student *stu) {
if(list->list_size < list->max_size) {
list->student[list->list_size].student_id = stu->student_id;
list->student[list->list_size].name = stu->name;
list->student[list->list_size].score = stu->score;
list->list_size++;
} else {
printf("List is full!");
}
}
定义一个函数显示顺序表中所有学生信息:
void Show_Student_List(struct Student_List *list) {
for(int i = 0; i < list->list_size; i++) {
printf("ID: %d, Name: %s, Score: %.2f\n", list->student[i].student_id, list->student[i].name, list->student[i].score);
}
}
定义一个函数根据姓名查找学生信息:
struct Student *Find_Student(struct Student_List *list, char *name) {
struct Student *result = NULL;
for(int i = 0; i < list->list_size; i++) {
if(strcmp(list->student[i].name, name) == 0) {
result = &(list->student[i]);
break;
}
}
return result;
}
链表实现:
定义一个包含学生信息的结构体:
struct Student {
int student_id;
char *name;
float score;
struct Student *next;
};
定义一个指向链表头的指针:
struct Student *head = NULL;
定义一个函数向链表中添加学生信息:
void Add_Student(int id, char *name, float score) {
struct Student *new_student = malloc(sizeof(struct Student));
new_student->student_id = id;
new_student->name = name;
new_student->score = score;
new_student->next = NULL;
if(head == NULL) {
head = new_student;
} else {
struct Student *temp = head;
while(temp->next != NULL) {
temp = temp->next;
}
temp->next = new_student;
}
}
定义一个函数显示链表中所有学生信息:
void Show_Student_List() {
struct Student *temp = head;
while(temp != NULL) {
printf("ID: %d, Name: %s, Score: %.2f\n", temp->student_id, temp->name, temp->score);
temp = temp->next;
}
}
定义一个函数根据姓名查找学生信息:
struct Student *Find_Student(char *name) {
struct Student *temp = head;
struct Student *result = NULL;
while(temp != NULL) {
if(strcmp(temp->name, name) == 0) {
result = temp;
break;
}
temp = temp->next;
}
return result;
}
以上就是两种数据结构的实现方式和实现代码。可以根据需要选择使用哪种方式来储存学生信息,同时根据需求实现相应的功能。
阅读全文