要求:
(1)假如有一个学生表,每个学生包含学号、姓名和分数。你如何设计相应的顺序表?
(2)如果对学生表进行插入、修改和删除运算,你如何设计相应的算法?
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define MaxSize 10
struct Students//定义学生信息的结构体
{
char name[20];//姓名
long num;//学号
int score;//分数
};
typedef Students ElemType;
typedef struct//定义学生链表
{
ElemType data[MaxSize];
int length;
}SqList;
void CreateList(SqList*&L, ElemType a[], int n)//创建显示信息链表
{
int i = 0, k = 0;
L = (SqList *)malloc(sizeof(SqList));
while (i < n)
{
L->data[i] = a[i];
i++;
k++;
}
L->length = k;
}
int ListLength(SqList *L)//链表长度
{
return(L->length);
}
void DispList(SqList*&L)//输出链表的各个元素
{
printf("┏━━━━━━━━━━━──━━━━━━━━━──━─━━━━━━━┓\n");
printf("┠───────────学生信息表────────────┨\n");
for (int i = 0; i < L->length; i++)
{
printf("┃ %-7ld", L->data[i].num);
printf("%-15s", L->data[i].name);
printf("%3d ┃\n", L->data[i].score);
printf("\n");
}
printf("┗━━━━━━━━━━━━━━━━━──━━━━━──━─━━━━━┛\n");
}
bool ListInsert(SqList*&L, int i, ElemType &e)//插入新元素
{
int j;
if (i < 1 || i> L->length + 1)
return false;
i--;//逻辑序号转换成物理序号
for (j = L->length; j > i; j--)
L->data[j] = L->data[j - 1];
L->data[i] = e;
L->length++;
return true;
}
bool ListDelete(SqList*&L, int i, ElemType &e)//删除指定序号的元素
{
int j;
if (i < 1 || i> L->length)
return false;
i--;
e = L->data[i];
for (j = i; j < L->length; j++)
L->data[j] = L->data[j + 1];
L->length--;
return true;
}
int LocateElem(SqList*&L, long nm)//根据学号获得对应结点的序号
{
int i = 0;
while (i < L->length && L->data[i].num != nm)
i++;
if (i >= L->length)
return 0;
else
return i++;
}
void showElem(Students &Stu)
{
printf("%-7ld", Stu.num);
printf("%-15s", Stu.name);
printf("%d\n", Stu.score);
}
void RectifyElem(SqList*&L, int n)//修改对应学号的学生的信息
{
printf("新学号:");
scanf("%d", &L->data[n].num);
printf("新姓名:");
char Eat;
scanf("%c", &Eat);
int m;
char ch;
for (scanf("%c", &ch), m = 0; m < 20 && ch != '\n'; m++)
{
L->data[n].name[m] = ch;
scanf("%c", &ch);
}
L->data[n].name[m] = '\0';
printf("\n");
printf("新成绩:");
scanf("%d", &L->data[n].score);
}
int main()
{
Students Stu[5] = { { "Li", 1001, 79 }, { "xiao", 1002, 78 }, { "wanng", 1003, 81 } ,{"ke",1004,99},{"hua",1005,96 } };
SqList *L;
Students a;
int n,m,k;
Students Stud2;
long number;
printf("***********************************\n");
printf(" 1.创建顺序表\n");
printf(" 2.输出元素\n");
printf(" 3.插入学生信息\n");
printf(" 4.删除学生信息\n");
printf(" 5.修改学生信息\n");
printf(" 0.退出系统\n");
printf("***********************************\n");
n = -1;
while (n != 0) {
printf("请选择功能:\n");
scanf("%d", &n);
switch (n)
{
case 1: //创建顺序表
CreateList(L, Stu, 5);
printf("创建成功!\n");
break;
case 2: //输出个元素
DispList(L);
break;
case 3: //插入元素
printf("\n输入插入的位置:");
scanf("%d", &m);
printf("输入插入学生的姓名\n");
scanf("%s", a.name);
printf("输入插入学生的学号\n");
scanf("%ld", &a.num);
printf("输入插入学生的成绩\n");
scanf("%d", &a.score);
ListInsert(L, m, a);
printf("依次输出新的排列:\n");
break;
case 4: //删除元素
printf("\n\n输入删学生的信息序号:\n");
scanf("%d", &m);
ListDelete(L, m, Stud2);
DispList(L);
printf("\n\n被删去的学生的信息为:\n");
showElem(Stud2);
break;
case 5: //修改元素
printf("请输入修改学生信息的学号:");
scanf("%ld", &number);
printf("\n");
k = LocateElem(L, number);
printf("修改学生的信息如下:\n");
showElem(L->data[k]);
RectifyElem(L, k);
printf("输出修改后的学生的信息\n");
DispList(L);
break;
case 0:exit(0); //退出系统
}
}
}
有错请指正!