数据结构 c语言 为什么data会卡住

img

img


别的地方也有data为什么在insertList,reverseList,deleteListBySex,函数都报错
注意这里把last定义为表的长度;

#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

img

【以下回答由 GPT 生成】

问题所在: 问题代码中只是声明了顺序表的结构体和函数的定义,并没有实现具体的函数功能。所以在插入、倒置和删除函数中无法正常工作。

解决方案: 1. 实现initList函数,用于初始化顺序表,将last值初始化为0。函数定义如下:

void initList(SEQ_LIST *lp)
{
    lp->last = 0;
}
  1. 实现createList函数,用于从文件中读取学生信息并存入顺序表中。函数定义如下:
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);
}
  1. 实现sortListByNO函数,按学号从小到大排序顺序表中的学生数据,可以使用冒泡排序算法。函数定义如下:
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;
            }
        }
    }
}
  1. 实现printList函数,输出顺序表中的学生数据。函数定义如下:
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 ? "男" : "女");
    }
}
  1. 实现saveList函数,将顺序表中的学生数据保存到指定文件中。函数定义如下:
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);
}
  1. 实现insertList函数,将值为x的学生按学号从小到大的顺序插入顺序表中。函数定义如下:
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++;
}
  1. 实现reverseList函数,倒置顺序表中的学生数据。函数定义如下:
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;
    }
}
  1. 实现countList函数,统计顺序表中身高值高于y的学生数并返回。函数定义如下:
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;
}
  1. 实现deleteListBySex函数,删除顺序表中性别为sex的学生。函数定义如下:
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;
}

以上是对问题的分析和解决方案的具体实现。如果存在其他问题或需要更详细的解释,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632