#include <stdio.h>
#include <stdlib.h>
#define ERROR 0
#define MAX_SIZE 50
#define OUT_FILE_NAME "result.txt"
typedef struct
{
int student_NO; /* NO. */
float student_height; /* height */
int student_sex; /* 0:male,1:female */
} STUDENT;
typedef struct
{
STUDENT data[MAX_SIZE]; /* 存放顺序表元素的数组 */
int last; /* 表示data中实际存放元素个数 */
} SEQ_LIST;
void initList(SEQ_LIST *lp); /*置一个空表*/
void createList(SEQ_LIST *lp); /*建一个学生顺序表*/
void sortListByNO(SEQ_LIST *lp); /*按学号排序*/
void printList(SEQ_LIST *lp); /*输出学生表*/
void saveList(SEQ_LIST *lp,char strname[]);/*保存学生顺序表到指定文件*/
// 完成以下函数
/*在学号从小到大排序的学生表中插入值为x的学生仍保持学号的有序性*/
void insertList(SEQ_LIST *lp, STUDENT x);
/*对lp指向的顺序表进行倒置操作*/
void reverseList(SEQ_LIST *lp);
/*统计学生表中身高值高于y的学生数并返回*/
int countList(SEQ_LIST *lp,float y);
/*删除性别为sex(0为男生,1为女生)的学生*/
void deleteListBySex(SEQ_LIST *lp, int sex);
int main()
{
SEQ_LIST slt;
STUDENT x;// x为存储一个学生元素的变量
int count;
FILE*f=fopen("records.txt","w");
fprintf(f,"2 1.58 1\n4 1.81 0\n8 1.74 0\n5 1.68 0\n9 1.75 0\n1 1.64 1\n7 1.55 1\n6 1.72 1");
fclose(f);
/*调用上述函数完成题目要求*/
/*创建一个包含学生学号、身高、性别的学生身高信息表stu并输出到屏幕,学生信息从records.txt文件读取*/
initList(&slt);
createList(&slt);
printf("\nSource list:\n");
printList(&slt);
getchar(); //在执行程序能起到暂定的作用,按任意键继续
#if 1
/*从键盘输入一个身高值,统计高于该身高的学生个数并输出在屏幕*/
printf("\nInput a student height to count higher numbers: \n");
scanf("%f", &x.student_height);
count=countList(&slt,x.student_height); //统计身高高于指定值的学生数存于count中
printf("\nThe higher student numbers:%d\n", count);
getchar();
#endif
#if 1
/*对已建立的学生身高信息表进行倒置,结果输出在屏幕;*/
reverseList(&slt); //倒置顺序表
printf("\nlist after reverse:\n");
printList(&slt);
getchar();
#endif
/*对已建立的学生身高信息表按学号从小到大排序,并把结果写入到数据文件中(result.txt)*/
sortListByNO(&slt); //调用函数sortListByNO 对学生表stu按学号从小到大排序
//printf("\nInput new file name to save: ");
//gets(filename); //键盘输入文件名字符串存于filename数组中
printf("\nlist after sort by no:\n");
printList(&slt);
saveList(&slt,OUT_FILE_NAME); //调用函数save把排序后的顺序表stu存于文件中,文件名在filename数组中
#if 1
/*从键盘输入一位学生的相关信息插入到已排序的学生身高信息表中后仍然保持学号的有序性;*/
printf("\nInput a student information to insert: \n");
scanf("%d%f%d",&x.student_NO,&x.student_height,&x.student_sex);
insertList(&slt, x); //插入
printf("\nlist after insert:\n");
printList(&slt);
getchar();
#endif
#if 1
/*从键盘输入一个性别(0为男生,1为女生),删除该性别的学生*/
printf("\nInput a student sex for delete(0为男生,1为女生): \n");
scanf("%d",&x.student_sex);
deleteListBySex(&slt, x.student_sex); //删除
printf("\nlist after delete:\n");
printList(&slt);
#endif
return 0;
}
/*置一个空表*/
void initList(SEQ_LIST *lp)
{
lp->last=0;
}
/*建一个学生顺序表*/
void createList(SEQ_LIST *lp)
{
FILE *fp = NULL;
STUDENT stu;
if((fp=fopen("records.txt","r"))==NULL)
{
printf("can not open read file !\n");
exit(1); /*返回OS,该函数定义在stdlib.h中*/
}
while(!feof(fp))
{
fscanf(fp,"%d%f%d",&stu.student_NO,&stu.student_height,&stu.student_sex);
lp->data[lp->last]=stu;
lp->last++;
}
fclose(fp);
}
/*按学号排序*/
void sortListByNO(SEQ_LIST *lp)
{
int i,j,k;
STUDENT stu;
for(i=0; i<lp->last-1; i++)
{
k=i;
for(j=i+1; j<lp->last; j++)
if(lp->data[j].student_NO < lp->data[k].student_NO )
k=j;
if(k!=i)
{
stu=lp->data[k];
lp->data[k]=lp->data[i];
lp->data[i]=stu;
}
}
}
/*输出学生顺序表*/
void printList(SEQ_LIST *lp)
{
int i;
for(i=0; i<lp->last ; i++)
printf("%2d: %.2f %d\n",lp->data [i].student_NO,lp->data [i].student_height,lp->data[i].student_sex);
}
/*保存学生顺序表到指定文件*/
void saveList(SEQ_LIST *lp,char strname[])
{
FILE *fp;
int i;
if((fp=fopen(strname,"w"))==NULL)
{
printf("can not open write file !\n");
exit(1); /*返回OS*/
}
for(i=0; i<lp->last ; i++)
{
fprintf(fp,"%2d %5.2f %2d\n",lp->data[i].student_NO,lp->data[i].student_height,lp->data[i].student_sex);
}
fclose(fp);
}
/*在学号从小到大排序的学生表中插入值为x的学生仍保持学号的有序性*/
void insertList(SEQ_LIST *lp, STUDENT x)
{
int i,j;
for(i=0;1<lp->last;i++)
{
if(x.student_NO<lp-data[i].student_NO)
{
for(j=lp->last;j>i;j--)
lp->data[j+1]=lp->data[j];
lp->data[i-1]=x;
lp->last++;
break;
}
}
}
/*对lp指向的顺序表进行倒置操作*/
void reverseList(SEQ_LIST *lp)
{
int i,j=lp->last-1;
STUDENT d;
for(i=0;i<j;i++,j--)
{
d=lp->data[i];
lp->data[i]=lp>data[j];
lp->data[j]=d;
}
}
/*统计学生表中身高值高于y的学生数并返回*/
int countList(SEQ_LIST *lp,float y)
{
int count=0,i;
for(i=0;i<lp->last;i++){
if(lp->data[i].student_height>y)
{
count++;
}
}
return count;
}
/*删除性别为sex(0为男生,1为女生)的学生*/
void deleteListBySex(SEQ_LIST *lp, int sex)
{
int i,j=0;
for(i=0;i<lp->last;i++)
{
if(lp->data[i].student_sex!=sex)
{
lp->data[j]=lp->data[i];
j++;
}
}
}
三个错误:
(1)186行的for循环中,第二个表达式是 i < ,小于号组边是英文字母 i ,你写成数字1了。
(2)188行的if语句中,lp->data[i].student_NO,lp后面是 -> ,你漏写了 >
(3)内层for循环的后移出错了
代码我重新给你写了,你复制下面的代码替换掉你的insertList函数就可以了。
void insertList(SEQ_LIST *lp, STUDENT x)
{
int i,j;
for(i=0;i<lp->last;i++)
{
if(x.student_NO<lp->data[i].student_NO)
{
for(j=lp->last;j>i;j--)
lp->data[j]=lp->data[j-1];
lp->data[i]=x;
lp->last++;
break;
}
}
}
186行,1改为i
【以下回答由 GPT 生成】
问题所在: 问题代码中只是声明了顺序表的结构体和函数的定义,并没有实现具体的函数功能。所以在插入、倒置和删除函数中无法正常工作。
解决方案: 1. 实现initList函数,用于初始化顺序表,将last值初始化为0。函数定义如下:
void initList(SEQ_LIST *lp)
{
lp->last = 0;
}
void createList(SEQ_LIST *lp)
{
FILE *f = fopen("records.txt", "r");
if (f == NULL)
{
printf("Error opening file.\n");
return;
}
int student_NO;
float student_height;
int student_sex;
while (fscanf(f, "%d %f %d", &student_NO, &student_height, &student_sex) == 3)
{
STUDENT newStudent;
newStudent.student_NO = student_NO;
newStudent.student_height = student_height;
newStudent.student_sex = student_sex;
lp->data[lp->last++] = newStudent;
}
fclose(f);
}
void sortListByNO(SEQ_LIST *lp)
{
int i, j;
for (i = 0; i < lp->last - 1; i++)
{
for (j = 0; j < lp->last - 1 - i; j++)
{
if (lp->data[j].student_NO > lp->data[j + 1].student_NO)
{
STUDENT temp = lp->data[j];
lp->data[j] = lp->data[j + 1];
lp->data[j + 1] = temp;
}
}
}
}
void printList(SEQ_LIST *lp)
{
for (int i = 0; i < lp->last; i++)
{
printf("学号:%d 身高:%.2f 性别:%s\n",
lp->data[i].student_NO,
lp->data[i].student_height,
lp->data[i].student_sex == 0 ? "男" : "女");
}
}
void saveList(SEQ_LIST *lp, char strname[])
{
FILE *f = fopen(strname, "w");
if (f == NULL)
{
printf("Error opening file.\n");
return;
}
for (int i = 0; i < lp->last; i++)
{
fprintf(f, "%d %.2f %d\n",
lp->data[i].student_NO,
lp->data[i].student_height,
lp->data[i].student_sex);
}
fclose(f);
}
void insertList(SEQ_LIST *lp, STUDENT x)
{
if (lp->last >= MAX_SIZE)
{
printf("顺序表已满,无法插入新的元素。\n");
return;
}
int i;
for (i = lp->last - 1; i >= 0 && x.student_NO < lp->data[i].student_NO; i--)
{
lp->data[i + 1] = lp->data[i];
}
lp->data[i + 1] = x;
lp->last++;
}
void reverseList(SEQ_LIST *lp)
{
int i, j;
for (i = 0, j = lp->last - 1; i < j; i++, j--)
{
STUDENT temp = lp->data[i];
lp->data[i] = lp->data[j];
lp->data[j] = temp;
}
}
int countList(SEQ_LIST *lp, float y)
{
int count = 0;
for (int i = 0; i < lp->last; i++)
{
if (lp->data[i].student_height > y)
{
count++;
}
}
return count;
}
void deleteListBySex(SEQ_LIST *lp, int sex)
{
int i, j = 0;
for (i = 0; i < lp->last; i++)
{
if (lp->data[i].student_sex != sex)
{
lp->data[j++] = lp->data[i];
}
}
lp->last = j;
}
在main函数中的代码示例:
int main()
{
SEQ_LIST slt;
STUDENT x; // x为存储一个学生元素的变量
int count;
initList(&slt);
createList(&slt);
sortListByNO(&slt);
printList(&slt);
saveList(&slt, OUT_FILE_NAME);
x.student_NO = 1001;
x.student_height = 175;
x.student_sex = 0;
insertList(&slt, x);
reverseList(&slt);
count = countList(&slt, 170);
printf("身高高于170的学生数:%d\n", count);
deleteListBySex(&slt, 0);
return 0;
}
以上是对问题的分析和解决方案的具体实现。如果存在其他问题或需要更详细的解释,请随时提问。