编写程序,初始化顺序表L(学生信息从文件读入)
时间: 2023-05-29 07:04:28 浏览: 143
这里提供一个Python的示例代码,可以从文件读取学生信息并初始化顺序表L:
```python
class Student:
def __init__(self, id, name, score):
self.id = id
self.name = name
self.score = score
def init_list(filename):
L = []
with open(filename, 'r') as f:
for line in f:
id, name, score = line.strip().split(',')
L.append(Student(id, name, float(score)))
return L
# 读取文件中的学生信息并初始化顺序表L
L = init_list('students.txt')
```
其中,`Student`类表示一个学生对象,包含学号、姓名和成绩三个属性。`init_list`函数从指定的文件中读取每行学生信息,创建一个`Student`对象并添加到顺序表L中。最后,函数返回初始化后的顺序表L。可以根据实际情况修改`Student`类的属性和`init_list`函数的实现。
相关问题
基础项目: 编写主函数,通过菜单控制及调用相应的子函数完成以下功能: (1)初始化顺序表L(学生信息从文件读入)。 (2)输出顺序表L(要求一名学生的信息占一行)。 (3)输出顺序表L的长度。 (4)输出顺序表L的第i个学生的信息,i的值可从键盘输入。 (5)输出学生x的位置,x的关键字值(学号或姓名)可从键盘输入。 (6)在第i个元素位置上插入学生x的信息,i和x的信息可从键盘输入。 (7)删除L的第i个元素,i的值可从键盘输入。 (8)删除L中学生x的信息,x的关键字值(学号或姓名)可从键盘输入。 3.拓展项目: <1>将顺序表的元素按“班级”信息分别存储到一个顺序表中。 <2>将顺序表的元素按“班级”信息有序输出,同一班级的按姓名有序输出。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 20 // 学号、姓名、班级的最大长度
#define MAX_STU 100 // 最多存储的学生数目
typedef struct {
char id[MAX_LEN]; // 学号
char name[MAX_LEN]; // 姓名
char grade[MAX_LEN]; // 年级
char major[MAX_LEN]; // 专业
char classno[MAX_LEN]; // 班级
} Student;
typedef struct {
Student data[MAX_STU]; // 存放学生信息的数组
int length; // 学生信息的数目
} SeqList;
// 初始化顺序表
void InitList(SeqList *L) {
L->length = 0;
}
// 从文件中读入学生信息,存入顺序表
void ReadFromFile(SeqList *L, char *filename) {
FILE *fp = fopen(filename, "r");
if (fp == NULL) {
printf("Cannot open file %s\n", filename);
exit(1);
}
while (fscanf(fp, "%s %s %s %s %s", L->data[L->length].id, L->data[L->length].name, L->data[L->length].grade, L->data[L->length].major, L->data[L->length].classno) != EOF) {
L->length++;
}
fclose(fp);
}
// 输出顺序表中的所有学生信息
void PrintList(SeqList *L) {
int i;
for (i = 0; i < L->length; i++) {
printf("%s %s %s %s %s\n", L->data[i].id, L->data[i].name, L->data[i].grade, L->data[i].major, L->data[i].classno);
}
}
// 输出顺序表的长度
void PrintLength(SeqList *L) {
printf("The length of the list is %d\n", L->length);
}
// 输出顺序表中第i个学生的信息
void PrintStudent(SeqList *L, int i) {
if (i < 1 || i > L->length) {
printf("Invalid index\n");
return;
}
printf("%s %s %s %s %s\n", L->data[i - 1].id, L->data[i - 1].name, L->data[i - 1].grade, L->data[i - 1].major, L->data[i - 1].classno);
}
// 输出学生x的位置
void PrintPosition(SeqList *L, char *x) {
int i;
for (i = 0; i < L->length; i++) {
if (strcmp(L->data[i].id, x) == 0 || strcmp(L->data[i].name, x) == 0) {
printf("%d\n", i + 1);
return;
}
}
printf("Not found\n");
}
// 在第i个元素位置上插入学生x的信息
void InsertStudent(SeqList *L, int i, Student x) {
int j;
if (i < 1 || i > L->length + 1) {
printf("Invalid index\n");
return;
}
if (L->length >= MAX_STU) {
printf("List is full\n");
return;
}
for (j = L->length; j >= i; j--) {
L->data[j] = L->data[j - 1];
}
L->data[i - 1] = x;
L->length++;
}
// 删除L的第i个元素
void DeleteStudent(SeqList *L, int i) {
int j;
if (i < 1 || i > L->length) {
printf("Invalid index\n");
return;
}
for (j = i; j < L->length; j++) {
L->data[j - 1] = L->data[j];
}
L->length--;
}
// 删除L中学生x的信息
void DeleteStudentByKey(SeqList *L, char *key) {
int i, j;
for (i = 0; i < L->length; i++) {
if (strcmp(L->data[i].id, key) == 0 || strcmp(L->data[i].name, key) == 0) {
for (j = i + 1; j < L->length; j++) {
L->data[j - 1] = L->data[j];
}
L->length--;
return;
}
}
printf("Not found\n");
}
int main() {
SeqList L;
int choice, i;
char filename[MAX_LEN], x[MAX_LEN];
Student new_stu;
InitList(&L);
printf("Input the filename to load data: ");
scanf("%s", filename);
ReadFromFile(&L, filename);
while (1) {
printf("1. Print List\n");
printf("2. Print Length\n");
printf("3. Print Student\n");
printf("4. Print Position\n");
printf("5. Insert Student\n");
printf("6. Delete Student\n");
printf("7. Delete Student by Key\n");
printf("0. Exit\n");
printf("Input your choice: ");
scanf("%d", &choice);
switch (choice) {
case 0:
return 0;
case 1:
PrintList(&L);
break;
case 2:
PrintLength(&L);
break;
case 3:
printf("Input the index of the student: ");
scanf("%d", &i);
PrintStudent(&L, i);
break;
case 4:
printf("Input the key of the student: ");
scanf("%s", x);
PrintPosition(&L, x);
break;
case 5:
printf("Input the index to insert: ");
scanf("%d", &i);
printf("Input the student's id, name, grade, major, classno: ");
scanf("%s %s %s %s %s", new_stu.id, new_stu.name, new_stu.grade, new_stu.major, new_stu.classno);
InsertStudent(&L, i, new_stu);
break;
case 6:
printf("Input the index to delete: ");
scanf("%d", &i);
DeleteStudent(&L, i);
break;
case 7:
printf("Input the key of the student: ");
scanf("%s", x);
DeleteStudentByKey(&L, x);
break;
default:
printf("Invalid choice\n");
break;
}
}
return 0;
}
利用C语言写一个程序,包含顺序表、单链和双向链表的定义,初始化、插入和删除操作函数,并利用这些操作完成:编写一个读入一个字符串,把它顺序存入一个顺序表,并按逆序打印的程序
下面是一个示例代码,实现了顺序表、单链表和双向链表的定义,以及初始化、插入和删除操作函数。并且根据题目要求,编写了一个读入一个字符串,把它顺序存入一个顺序表,并按逆序打印的程序。
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义顺序表
#define MAXSIZE 100
typedef struct {
char data[MAXSIZE];
int length;
} SqList;
// 定义单链表
typedef struct LNode {
char data;
struct LNode *next;
} LNode, *LinkList;
// 定义双向链表
typedef struct DNode {
char data;
struct DNode *prior, *next;
} DNode, *DLinkList;
// 初始化顺序表
void InitList_Sq(SqList *L) {
L->length = 0;
}
// 插入元素到顺序表
void ListInsert_Sq(SqList *L, int i, char e) {
if (i < 1 || i > L->length + 1) {
printf("插入位置不合法!\n");
return;
}
if (L->length >= MAXSIZE) {
printf("顺序表已满!\n");
return;
}
for (int j = L->length; j >= i; j--) {
L->data[j] = L->data[j-1];
}
L->data[i-1] = e;
L->length++;
}
// 删除顺序表中的元素
void ListDelete_Sq(SqList *L, int i) {
if (i < 1 || i > L->length) {
printf("删除位置不合法!\n");
return;
}
for (int j = i; j < L->length; j++) {
L->data[j-1] = L->data[j];
}
L->length--;
}
// 初始化单链表
void InitList_L(LinkList *L) {
*L = (LNode*)malloc(sizeof(LNode));
(*L)->next = NULL;
}
// 插入元素到单链表
void ListInsert_L(LinkList L, int i, char e) {
LNode *p = L;
int j = 0;
while (p && j < i-1) {
p = p->next;
j++;
}
if (!p || j > i-1) {
printf("插入位置不合法!\n");
return;
}
LNode *s = (LNode*)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
}
// 删除单链表中的元素
void ListDelete_L(LinkList L, int i) {
LNode *p = L;
int j = 0;
while (p->next && j < i-1) {
p = p->next;
j++;
}
if (!p->next || j > i-1) {
printf("删除位置不合法!\n");
return;
}
LNode *q = p->next;
p->next = q->next;
free(q);
}
// 初始化双向链表
void InitList_DL(DLinkList *L) {
*L = (DNode*)malloc(sizeof(DNode));
(*L)->prior = NULL;
(*L)->next = NULL;
}
// 插入元素到双向链表
void ListInsert_DL(DLinkList L, int i, char e) {
DNode *p = L;
int j = 0;
while (p && j < i-1) {
p = p->next;
j++;
}
if (!p || j > i-1) {
printf("插入位置不合法!\n");
return;
}
DNode *s = (DNode*)malloc(sizeof(DNode));
s->data = e;
s->prior = p;
s->next = p->next;
if (p->next) {
p->next->prior = s;
}
p->next = s;
}
// 删除双向链表中的元素
void ListDelete_DL(DLinkList L, int i) {
DNode *p = L;
int j = 0;
while (p->next && j < i-1) {
p = p->next;
j++;
}
if (!p->next || j > i-1) {
printf("删除位置不合法!\n");
return;
}
DNode *q = p->next;
p->next = q->next;
if (q->next) {
q->next->prior = p;
}
free(q);
}
int main() {
char str[MAXSIZE];
printf("请输入一个字符串:");
scanf("%s", str);
SqList L1;
InitList_Sq(&L1);
for (int i = 0; i < strlen(str); i++) {
ListInsert_Sq(&L1, i+1, str[i]);
}
printf("顺序表逆序输出:");
for (int i = L1.length; i > 0; i--) {
printf("%c", L1.data[i-1]);
}
printf("\n");
LinkList L2;
InitList_L(&L2);
for (int i = 0; i < strlen(str); i++) {
ListInsert_L(L2, i+1, str[i]);
}
printf("单链表逆序输出:");
LNode *p = L2->next;
while (p) {
ListInsert_L(L2, 1, p->data);
p = p->next;
}
p = L2->next;
while (p) {
printf("%c", p->data);
p = p->next;
}
printf("\n");
DLinkList L3;
InitList_DL(&L3);
for (int i = 0; i < strlen(str); i++) {
ListInsert_DL(L3, i+1, str[i]);
}
printf("双向链表逆序输出:");
DNode *q = L3->next;
while (q) {
ListInsert_DL(L3, 1, q->data);
q = q->next;
}
q = L3->next;
while (q) {
printf("%c", q->data);
q = q->next;
}
printf("\n");
return 0;
}
```
注意,这里的顺序表、单链表和双向链表的实现仅供参考,具体实现方式可能有所不同,需要根据实际情况进行调整。另外,这里只是针对题目要求编写了一个读入一个字符串,把它顺序存入一个顺序表,并按逆序打印的程序,如果需要实现其他功能,还需要进行相应的修改。
阅读全文
相关推荐















