编写程序实现顺序表的建立、求长度、插入、删除、遍历的基本运算,其中顺序表中每一个数据元素的类型定义为学生信息的结构体,包括学号、姓名和成绩
时间: 2023-09-03 21:26:55 浏览: 137
定义一个包含学生信息(学号,姓名,成绩)的顺序表
### 回答1:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100 // 定义顺序表的最大长度
// 学生信息结构体
typedef struct {
int id; // 学号
char name[20]; // 姓名
float score; // 成绩
} Student;
// 顺序表结构体
typedef struct {
Student data[MAX_SIZE]; // 数据
int length; // 当前长度
} SeqList;
// 初始化顺序表
void initList(SeqList *list) {
list->length = 0;
}
// 求顺序表长度
int length(SeqList *list) {
return list->length;
}
// 插入元素
int insert(SeqList *list, int pos, Student stu) {
if (pos < 1 || pos > list->length + 1) { // 判断插入位置是否合法
return 0;
}
if (list->length == MAX_SIZE) { // 判断顺序表是否已满
return 0;
}
for (int i = list->length; i >= pos; i--) { // 从后往前依次将元素后移
list->data[i] = list->data[i - 1];
}
list->data[pos - 1] = stu; // 插入元素
list->length++; // 长度加1
return 1;
}
// 删除元素
int delete(SeqList *list, int pos) {
if (pos < 1 || pos > list->length) { // 判断删除位置是否合法
return 0;
}
for (int i = pos; i < list->length; i++) { // 从前往后依次将元素前移
list->data[i - 1] = list->data[i];
}
list->length--; // 长度减1
return 1;
}
// 遍历顺序表
void traverse(SeqList *list) {
printf("学号\t姓名\t成绩\n");
for (int i = 0; i < list->length; i++) {
printf("%d\t%s\t%.2f\n", list->data[i].id, list->data[i].name, list->data[i].score);
}
}
int main() {
SeqList list;
initList(&list); // 初始化顺序表
int choice, pos;
Student stu;
while (1) {
printf("\n");
printf("1. 插入元素\n");
printf("2. 删除元素\n");
printf("3. 遍历顺序表\n");
printf("4. 求顺序表长度\n");
printf("5. 退出\n");
printf("请输入操作编号:");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("请输入要插入的位置和学生信息(学号 姓名 成绩):");
scanf("%d %s %f", &pos, stu.name, &stu.score);
stu.id = list.length + 1; // 学号自动生成
if (insert(&list, pos, stu)) {
printf("插入成功!\n");
} else {
printf("插入失败!\n");
}
break;
case 2:
printf("请输入要删除的位置:");
scanf("%d", &pos);
if (delete(&list, pos)) {
printf("删除成功!\n");
} else {
printf("删除失败!\n");
}
break;
case 3:
traverse(&list);
break;
case 4:
printf("顺序表长度为:%d\n", length(&list));
break;
case 5:
exit(0);
default:
printf("输入错误,请重新输入!\n");
}
}
return 0;
}
### 回答2:
编写程序实现顺序表的建立、求长度、插入、删除、遍历的基本运算,其中顺序表中每一个数据元素的类型定义为学生信息的结构体,包括学号、姓名和成绩。
首先,我们需要定义一个结构体来表示学生信息:
```C
typedef struct {
int studentId;
char name[20];
float score;
} Student;
```
然后,我们可以创建一个顺序表的结构体,包含顺序表的长度和一个指向学生信息的指针:
```C
typedef struct {
int length;
Student *students;
} SeqList;
```
接下来,我们可以实现顺序表的创建函数,利用动态内存分配来创建顺序表,并初始化长度为0:
```C
SeqList* createSeqList() {
SeqList *list = (SeqList*)malloc(sizeof(SeqList));
list->length = 0;
list->students = NULL;
return list;
}
```
然后,我们实现求长度函数,简单地返回顺序表结构体中存储的长度值即可:
```C
int getLength(SeqList *list) {
return list->length;
}
```
接下来,我们实现插入函数,根据指定位置将学生信息插入到顺序表中,同时更新长度值:
```C
void insert(SeqList *list, int position, Student student) {
int i;
list->students = realloc(list->students, (list->length + 1) * sizeof(Student));
for(i = list->length - 1; i >= position; i--) {
list->students[i + 1] = list->students[i];
}
list->students[position] = student;
list->length++;
}
```
然后,我们实现删除函数,根据指定位置删除顺序表中的学生信息,并更新长度值:
```C
void delete(SeqList *list, int position) {
int i;
for(i = position; i < list->length - 1; i++) {
list->students[i] = list->students[i + 1];
}
list->students = realloc(list->students, (list->length - 1) * sizeof(Student));
list->length--;
}
```
最后,我们实现遍历函数,简单地打印顺序表中的学生信息:
```C
void traverse(SeqList *list) {
int i;
for(i = 0; i < list->length; i++) {
printf("学号:%d,姓名:%s,成绩:%f\n", list->students[i].studentId, list->students[i].name, list->students[i].score);
}
}
```
综上,我们可以编写一个完整的程序实现顺序表的建立、求长度、插入、删除、遍历的基本运算,其中顺序表中每一个数据元素的类型定义为学生信息的结构体。
### 回答3:
顺序表是一种常见的线性数据结构,可以用数组来实现。以下是基于C语言编写的实现顺序表的程序:
首先,我们定义学生信息的结构体:
```c
#define MAX_SIZE 100
typedef struct{
int studentID;
char name[50];
int score;
} Student;
```
然后,定义顺序表的结构体,包含一个指向学生信息数组的指针和当前顺序表的长度:
```c
typedef struct{
Student *data;
int length;
} SeqList;
```
接下来,实现顺序表的操作函数:
1. 建立顺序表:
```c
void create(SeqList *list){
list->data = (Student *)malloc(MAX_SIZE * sizeof(Student));
list->length = 0;
}
```
2. 求顺序表的长度:
```c
int length(SeqList list){
return list.length;
}
```
3. 向顺序表中插入元素:
```c
int insert(SeqList *list, int position, Student student){
if(position < 1 || position > list->length + 1){
return 0; // 插入位置不合法
}
if(list->length == MAX_SIZE){
return -1; // 顺序表已满
}
for(int i = list->length; i >= position; i--){
list->data[i] = list->data[i-1];
}
list->data[position-1] = student;
list->length++;
return 1; // 插入成功
}
```
4. 从顺序表中删除元素:
```c
int remove(SeqList *list, int position){
if(position < 1 || position > list->length){
return 0; // 删除位置不合法
}
for(int i = position; i < list->length; i++){
list->data[i-1] = list->data[i];
}
list->length--;
return 1; // 删除成功
}
```
5. 遍历顺序表:
```c
void traverse(SeqList list){
for(int i = 0; i < list.length; i++){
printf("学号:%d,姓名:%s,成绩:%d\n",
list.data[i].studentID, list.data[i].name, list.data[i].score);
}
}
```
最后,可以在主函数中调用这些函数来进行操作:
```c
int main(){
SeqList list;
create(&list);
Student s1 = {1, "张三", 80};
Student s2 = {2, "李四", 90};
insert(&list, 1, s1);
insert(&list, 2, s2);
printf("顺序表长度:%d\n", length(list));
traverse(list);
remove(&list, 1);
printf("删除元素后的顺序表长度:%d\n", length(list));
traverse(list);
return 0;
}
```
这样,就实现了顺序表的建立、求长度、插入、删除、遍历等基本运算。
阅读全文