/*
顺序表
(1) 根据指定学生个数,逐个输入学生信息;
(2) 逐个显示学生表中所有学生的相关信息;
(3) 根据姓名进行查找,返回此学生的学号和成绩;
(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);
(5) 给定一个学生信息,插入到表中指定的位置;
(6) 删除指定位置的学生记录;
(7) 统计表中学生个数。
*/
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define MAXSIZE 100
typedef int Status; // 定义函数返回值类型
typedef struct{
char number[11];//学号
char name[20];//姓名
int score;//成绩
}Student;
typedef Student ElemType;
typedef struct{
Student *elem;//指向数据元素的基地址
int length;//线性表当前的长度
}SqList;
Status creatlist(SqList *L)//构造空表
{
L->elem=(ElemType *)malloc(sizeof(ElemType)*MAXSIZE);
if(!L->elem) return 0;//表示 空间分配失败
else {
L->length=0;
return 1;
}
}
void input(Student *elem)//逐个录入学生信息
{
printf("姓名 ");
scanf("%s",elem->name);
printf("学号 ");
scanf("%s",elem->number);
printf("成绩 ");
scanf("%s",elem->score);
}
void output(Student *elem)
{
printf("姓名:%s\n学号:%s\n成绩:%s\n",elem->name,elem->number,elem->score);
}
int find(SqList &L,char str[])
{
int i;
for(i=0;i<L.length;i++)
{
if(strcmp(L.elem[i].name,str)==0)
return i;
}
return 0;
}
/*
操作目的:给定一个学生信息,插入到表中指定的位置
初始条件: 已有线性表
操作结果: 插入指定位置(address1),得到新的线性表
/
void insert(SqList &L,int address1,ElemType information)
{
int i=L.length;
for(i;i>=address1;i--)
{
L.elem[i+1]=L.elem[i];
}
L.elem[i]=information;
L.length++;
}
/
操作目的:删除指定位置的学生记录
初始条件: 已有线性表
操作结果:删除指定位置信息,得到新的线性表
*/
Status deletelist(SqList &L,int address2)
{
int i;
for(i=address2;i<=L.length;i++)
{
L.elem[i]=L.elem[i+1];
}
L.length--;
}
int main()
{
SqList L;
ElemType information;
creatlist(&L);//构造空表
if(creatlist(&L)) printf("创建成功\n");
else printf("创建失败\n") ;
int N;//确定学生人数,逐个输入信息
printf("请输入想输入学生信息的人数:");
scanf("%d",&N);
int i;
for(i=1;i<=N;i++)
{
printf("正在输入第%d位学生信息\n",i);
input(&L.elem[i]);
}
for(i=0;i<N;i++)//逐个显示学生信息
output(&L.elem[i]);
char s[20];//定义数组,储存想寻找的名字信息
printf("请输入需要查找的姓名 ");
scanf("%s",s);
if(find(L,s)) output(&L.elem[find(L,s)]);
else printf("未录入此人信息
1.
题主代码修改如下,供参考:
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define MAXSIZE 100
typedef int Status; // 定义函数返回值类型
typedef struct {
char number[11];//学号
char name[20];//姓名
int score;//成绩
}Student;
typedef Student ElemType;
typedef struct {
Student* elem;//指向数据元素的基地址
int length;//线性表当前的长度
}SqList;
Status creatlist(SqList* L)//构造空表
{
L->elem = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE);
if (!L->elem) return 0;//表示 空间分配失败
else {
L->length = 0;
return 1;
}
}
//void input(Student* elem)
void input(SqList* L)//逐个录入学生信息
{
int i = L->length;
if (L->length >= MAXSIZE) {
printf("表已满!\n");
return;
}
printf("姓名 ");
scanf("%s",L->elem[i].name);
printf("学号 ");
scanf("%s",L->elem[i].number);
printf("成绩 ");
//scanf("%s", elem->score);
scanf("%d", &L->elem[i].score);
L->length++;
}
//void output(Student *elem)
void output(ElemType L)
{
//printf("姓名:%s\n学号:%s\n成绩:%s\n", elem->name, elem->number, elem->score);
printf("姓名:%s\n学号:%s\n成绩:%d\n", L.name, L.number, L.score);
}
//int find(SqList& L, char str[])
int find(SqList L, char str[])
{
int i;
if (L.length == 0) {
printf("表为空,无记录!\n");
return -1;
}
for (i = 0; i < L.length; i++)
{
if (strcmp(L.elem[i].name, str) == 0)
return i;
}
return -1; //return 0;
}
/*
操作目的:给定一个学生信息,插入到表中指定的位置
初始条件: 已有线性表
操作结果: 插入指定位置(address1),得到新的线性表
*/
void insert(SqList &L,int address1,ElemType information)
{
int i=L.length;
if (L.length >= MAXSIZE) {
printf("表已满!\n");
return;
}
for (i; i > address1; i--) //for(i;i>=address1;i--)
{
L.elem[i] = L.elem[i - 1]; //L.elem[i+1]=L.elem[i];
}
L.elem[i] = information;
L.length++;
}
/*
操作目的:删除指定位置的学生记录
初始条件: 已有线性表
操作结果:删除指定位置信息,得到新的线性表
*/
Status deletelist(SqList& L, int address2)
{
int i;
if (L.length == 0) {
printf("表为空,无记录可删!\n");
return 0;
}
for (i = address2; i < L.length-1; i++)//for (i = address2; i <= L.length; i++)
{
L.elem[i] = L.elem[i + 1];
}
L.length--;
return 1;
}
int main()
{
SqList L;
ElemType information;
//creatlist(&L);
if (creatlist(&L)) //构造空表
printf("创建成功\n");
else
printf("创建失败\n");
int N;//确定学生人数,逐个输入信息
printf("请输入想输入学生信息的人数:");
scanf("%d", &N);
int i;
for (i = 0; i < N; i++) //for (i = 1; i <= N; i++)
{
printf("正在输入第%d位学生信息\n", i + 1);
input(&L); //input(&L.elem[i]);
}
for (i = 0; i < L.length; i++) //for (i = 0; i < N; i++)
output(L.elem[i]); //逐个显示学生信息 //output(&L.elem[i]);
char s[20];//定义数组,储存想寻找的名字信息
printf("\n请输入需要查找的姓名:");
scanf("%s", s);
if ((i = find(L, s)) >= 0) { //if (find(L, s))
output(L.elem[i]); // output(L.elem[find(L, s)]);
deletelist(L, i); //删除找到的记录
}
else
printf("未录入此人信息\n");
printf("\n查找并删除后学生信息:\n");
for (i = 0; i < L.length; i++) //删除后学生信息
output(L.elem[i]);
printf("\n插入一个学生信息:\n");
strcpy(information.name, "abcdefg");
strcpy(information.number, "888");
information.score = 90;
insert(L, 0, information);
for (i = 0; i < L.length; i++) //插入后学生信息
output(L.elem[i]);
return 0;
}
printf("成绩 ");
scanf("%s",elem->score);//这里写错了,应该是scanf("%d",&elem->score);