实验项目
线性表存储结构及实现
实验次序
实验地点
参与人员
个人
实验日期
一、实验目的
1、掌握线性表的概念及实现方式
2、熟悉线性表的存储结构及运算
二、实验环境
VS2010
三、实验内容
1、内容描述
定义一个包含学生信息(学号,姓名,成绩)的顺序表,使其具有如下功能:
(1) 根据指定学生个数,逐个输入学生信息;
(2) 逐个显示学生表中所有学生的相关信息;
(3) 根据姓名进行查,返回此学生的学号和成绩;
(4) 给定一个学生信息,插入到表中指定的位置;
(5) 删除指定位置的学生记录;
(6) 统计表中学生个数。
2、实现代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct{
    char no[50];     
    char name[50];   
    int price;     
}Student;
typedef struct{
    Student elem[MAXSIZE];
    int length;   
}SqList;
int Locate(SqList L);
int InsList(SqList &L,int i,Student e);
int DelList(SqList L,int i);
int main()
{
    int i,x,a,temp,select,sum=0,c;
    SqList L;
    Student m,e;
    printf("********************************************************************\n");
    printf("*      1. 逐个显示学生表中所有学生的相关信息;                    *\n");
    printf("*      2. 根据姓名进行查,返回此学生的学号和成绩;              *\n");
    printf("*      3. 给定一个学生信息,插入到表中指定的位置;                *\n");
    printf("*      4. 删除指定位置的学生记录;                                *\n");
    printf("*      5. 统计表中学生个数;                                      *\n");
    printf("*      6. 退出。                                                  *\n");
    printf("********************************************************************\n");
    printf("\n");
    printf("录入学生信息\n");
    printf("请输入学生的数量:");
                scanf("%d",&x);
                printf("\n");
                sum=x;
                for(i=0;i<x;i++)
                {
                    printf("第%d位学生信息\n",i+1);
                    printf("\n");
                    printf("学号:");
                    scanf("%s",L.elem[i].no);
                    printf("-----------------------------\n");
                    printf("姓名:");
                    scanf("%s",L.elem[i].name);
                    printf("-----------------------------\n");
                    printf("成绩:");
                    scanf("%d",&L.elem[i].price);
                    printf("-----------------------------\n");
                }
                L.length=x;
                printf("\n");
    while(true)
    {
        printf("请选择你要操作的选项:");
        scanf("%d",&select);
        printf("\n");
        switch(select)
        {
         
            case 1:
               
                printf("所有学生的相关信息为:\n\n");
                for(i=0;i<L.length;i++)
                {
                    printf("学号:%s 姓名:%s 成绩:%d\n\n",L.elem[i].no,L.elem[i].name,L.elem[i].price);
                }
                printf("\n");
                break;
               
switch的用法c语言            case 2:
               
                printf("请输入你要查的姓名:");
                scanf("%s",e.name);
                temp=Locate(L);
                if(temp!=0)
                printf("学号:%s 成绩:%d\n\n",L.elem[temp-1].no,L.elem[temp-1].price);
                else
                printf("查失败!\n\n");
                break;
               
           
               
            case 3:
               
                printf("请输入你要插入的位置:");
                scanf("%d",&a);
                printf("请输入插入学生信息:\n");
                printf("学号:");
                scanf("%s",m.no);
                printf("姓名:");
                scanf("%s",m.name);
                printf("成绩:");                                                                               
                scanf("%d",&m.price);
                if(InsList(L,a,m))
                {
                    sum++;
                    printf("插入成功!\n\n");
                }
                else
                    printf("插入失败!\n\n");
                break;
               
            case 4:
               
                printf("请输入要删除学生的位置:");
                scanf("%d",&c);
                if(DelList(L,c))
                {
                    sum--;
                    printf("删除成功!\n\n");
                }
                else
                    printf("删除失败!\n\n");
                break;
           
            case 5:
               
                {
                    printf("总学生个数为:%d\n\n",sum);
                }
                break;
            case 6:
                {
                    printf("\n退出系统成功!请按任意键结束!\n");
                    exit(0);
                }
                break;       
        }
    }
    return 0;
}
int Locate(SqList L)  //按照姓名查
{    Student e;
    int i;
    for(i=0;i<L.length+1;i++)
    {
        if(!strcmp(L.elem[i].name,e.name)) //比较两个字符串是否相同
        return i+1; 
    }
    return 0;
}
int InsList(SqList &L,int i,Student e)  //插入学生信息
{    /*在L中第i个位置之前插入新的数据元素e,L的长度加1*/
    int k;
    if(i<1||(i>L.length+2))
    {
        return 0;
    }
    for(k=L.length;k>=i-1;k--) //元素向后移动位置
    L.elem[k+1]=L.elem[k];
    L.elem[i-1]=e;
    L.length++;
    return 1;
}
int DelList(SqList L,int i) //删除指定位置学生记录
{     
    int k;
    if(i<1||i>L.length+1)
    return 0;
    for(k=i;k<=L.length;k++)
    {
        L.elem[k-1]=L.elem[k]; //将后面元素依次前移
    }
    L.length--;
    return 1;
}
四、实验体会
1、存在问题
1.
起初未将变量名启用数组的形式,通过调试发现姓名无法储存,学号只能储存一位数字,深刻体会存储字节的问题
2.
关于结构体的嵌套,如何引用其中变量问题有了深刻体会。
3.
观察到老师给的代码中sqlist &L,而我均未使用&引用符号,依然可以运行。于是查资料编写
此时的Head(地址)的值与L相同!
若将引用符号&删去,则L不将改变Head的值,故&有种将传进去的参数“带出来”的作用。
于是发现即便插入了数据,再次输出时未显示插入的数据,于是进行改进加上&
果然插入的信息可以输出。
2、心得体会
1.复习了switch case 以及strcmp比较函数的用法;
2.学会增删操作中元素前后移的实现;
3.这次实验让我真正的明白了sqList &L的使用:在函数调用中引用变量一定要初始化才可以使用。要返回到main里面进行操作、改变的顺序表需要带上&,如果只在对应函数操作的顺序表则不用。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。