(实验一)学生信息

本文介绍了一个学生信息管理系统的设计与实现,包括顺序表和链表两种数据结构的应用。系统提供了输入、显示、查找、插入、删除等功能,并详细展示了每项功能的具体实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*顺序表*/


#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
using namespace std;


#define MAXSIZE 100
typedef struct
{
    char num[10];   //8 位学号
    char name[20]; // 姓名
    int score;     // 成绩
}Student;
typedef  struct
{
  Student  *elem;     // 指向数据元素的基地址
  int  length;       // 线性表的当前长度
 }SqList;
 void menu()
 {
     printf("***************学生信息管理系统***************\n\n");
     printf("\t\t    1.输入信息\n");
     printf("\t\t    2.显示信息\n");
     printf("\t\t    3.按姓名查找\n");
     printf("\t\t    4.查找指定位置信息\n");
     printf("\t\t    5.插入指定位置信息\n");
     printf("\t\t    6.删除指定位置信息\n");
     printf("\t\t    7.统计学生信息总数\n");
     printf("\t\t    0.退出\n");
     printf("***********************************************\n\n");
 }
 void input(Student &e)
 {
    printf("请输入学号:");
    scanf("%s",e.num);
    printf("请输入姓名:");
    scanf("%s",e.name);
    printf("请输入成绩:");
    scanf("%d",&e.score);
 }
 void output(Student e)
 {
     printf("学号:%s\t姓名:%s\t成绩:%d\n",e.num,e.name,e.score);
 }
 int ListInsert(SqList &L,int i,Student e)
 {
     if(i<1||i>L.length+1)      //插入i的位置不符合
        return ERROR;
     if(L.length==MAXSIZE)      //顺序表满了
        return ERROR;
     for(int j=L.length-1;j>=i-1;j--)
        L.elem[j+1]=L.elem[j];
     L.elem[i-1]=e;     //插入新数据
     L.length++;        //表长加1
     return OK;
 }
 int ListDelete(SqList &L,int i)
{
    if(i<1||i>L.length)     //删除位置不符合
        return ERROR;
    for(int j=i;j<L.length;j++)
        L.elem[j-1]=L.elem[j];
    L.length--;     //表长减1
    return OK;
}
int main()
{
    int n,m,pos,flag;
    char str[20];
    Student e;
    SqList L;
    L.elem=(Student *)malloc(sizeof(Student)*MAXSIZE);
    L.length=0;
    menu();
    while(1)
    {
        printf("请输入要进行的操作:");
        scanf("%d",&m);
        if(m==0) break;
        if(m<0||m>7)
        {
            printf("无此操作,请重新输入!\n");
            continue;
        }
        switch(m)
        {
            case 1:
                printf("初始学生人数(1~100):");
                scanf("%d",&n);
                L.length=n;
                printf("请输入学生信息:\n");
                for(int i=0;i<n;i++)
                {
                    input(L.elem[i]);
                }
                printf("输入完成!\n\n");
                break;
            case 2:
                printf("当前所有信息为:\n");
                if(L.length==0)
                    printf("对不起!暂无信息!\n");
                else
                {
                    for(int i=0;i<L.length;i++)
                        output(L.elem[i]);
                    printf("显示完毕!\n\n");
                }
                break;
            case 3:
                printf("请输入要查找的姓名:  \n");
                scanf("%s",str);
                flag=0;
                for(int i=0;i<L.length;i++)
                {
                    if(strcmp(L.elem[i].name,str)==0)
                    {
                        flag=1;
                        printf("查找成功,此人信息为:\n");
                        output(L.elem[i]);
                        break;
                    }
                }
                if(!flag)
                    printf("查找失败!\n");
                printf("\n\n");
                break;
            case 4:
                printf("请输入要查找的信息的位置: ");
                scanf("%d",&pos);
                if(pos<1||pos>L.length)
                    printf("输入错误!\n");
                else
                {
                    printf("第%d个学生的信息为:\n",pos);
                    pos-=1;
                    output(L.elem[pos]);
                }
                printf("\n\n");
                break;
            case 5:
                printf("请输入要插入的位置:");
                scanf("%d",&pos);
                printf("请输入学号:");
                scanf("%s",e.num);
                printf("请输入姓名:");
                scanf("%s",e.name);
                printf("请输入成绩:");
                scanf("%d",&e.score);
                if(ListInsert(L,pos,e))
                    printf("插入成功!");
                else
                    printf("插入失败!\n");
                printf("\n\n");
                break;
            case 6:
                printf("请输入要删除的学生信息的位置:   ");
                scanf("%d",&pos);
                if(ListDelete(L,pos))
                    printf("删除成功!");
                else
                    printf("删除失败!\n");
                printf("\n\n");
                break;
            case 7:
                printf("学生总数:   %d\n",L.length);
                break;
        }
    }
    return 0;

}



/********实验一(链表)***********/




#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include<stdlib.h>
#define LEN sizeof(LNode)
using namespace std;




typedef struct
{
    char num[10];   //8 位学号
    char name[20]; // 姓名
    int score;     // 成绩
}Student;
typedef  struct LNode
{
  Student  data;     //数据域
  struct LNode *next;       //指针域
 }LNode,*LinkList;
/*void InitList(LinkList &L)//链表初始化
 {
    L=(LNode *)malloc(sizeof(LNode));
    L->next=NULL;
 }*/
 void creat(LinkList &L,int n)//后插法,创建链表并输入学生信息
 {
     L=(LNode *)malloc(sizeof(LNode));//头指针
     L->next=NULL;//头节点为空
     LNode *p,*r;
     r=L;
     Student e;
     for(int i=0;i<n;i++)
     {
         printf("请输入学号:");
         scanf("%s",e.num);
         printf ("请输入姓名:");
         scanf("%s",e.name);
         printf("请输入成绩:");
         scanf("%d",&e.score);
         p=(LNode *)malloc(sizeof(LNode));//生成新节点
         p->data=e;                     //将元素值赋给新节点*p的数据域
         p->next=NULL;
         r->next=p;                     //插入
         r=p;                           //移动r指向尾结点*p
     }
 }
void output(LinkList &L)//输出所有学生信息
{
    Student e;
    LNode *p;
    p=L->next;//p初始指向头节点
    if(p==NULL){
        printf("链表为空!无学生信息!\n");
        return ;
    }
    do{         //逐个输出学生信息
        e=p->data;
        printf("学号:%s\t姓名:%s\t成绩:%d\n",e.num,e.name,e.score);
        p=p->next;
    }while(p!=NULL);
    printf ("显示完毕!\n");
}
void namesearch(LinkList L,char str[])//按姓名查找学生信息
{
    LNode *p;
    Student e;
    p=L->next;
    if(!p)
    {
        printf("链表为空!查找失败!\n");
        return ;
    }
    while(p && (strcmp(p->data.name,str)))
            p=p->next;
    if(!p)
    {
        printf("系统中无该学生信息!\n");
        return ;
    }
    printf("查找成功!该学生信息为:\n");
    e=p->data;
    printf("学号:%s\t姓名:%s\t成绩:%d\n",e.num,e.name,e.score);
}
int getelem(LinkList L,int i,Student &e)//查找指定位置学生信息
{
    LNode *p;
    int j=1;
    p=L->next;
    while(p&&j<i)
    {
        p=p->next;
        j++;
    }
    if(!p||j>i) return 0;           //i值不合法i>n或i<=0
    e=p->data;
    return 1;
}
int InsertList(LinkList &L,int i,Student e)//在i出插入新的学生信息
{
    LNode *p,*s;
    int j=0;
    p=L;
    while(p&&j<i-1)                  //查找第i-1个节点,p指向该节点
    {
        p=p->next;
        j++;
    }
    if(!p||j>i-1) return 0;          //i值不合法i>n+1或i<1
    s=(LNode *)malloc(sizeof(LNode));//生成新节点*s
    s->data=e;                       //*s的数据域置为e
    s->next=p->next;                 //*s的指针域指向节点ai
    p->next=s;                       //将节点*p的指针域指向节点*s
    return 1;
}
int deleteList(LinkList &L,int i)//删除i处学生信息
{
    int j=0;
    LNode *p,*q;
    p=L;
    while(p->next && j<i-1)     //查找第i-1个节点,p指向该节点
    {
        p=p->next;
        j++;
    }
     if(!p->next||j>i-1) return 0;//i>n 或 i<1 时,删除位置不合理
     q=p->next;                   //p临时保存被删除节点
     p->next=q->next;             //改变删除节点前驱节点的指针域
     free(q);                     //释放删除节点的空间
     return 1;
}
int length(LinkList L)//链表总长度(学生总人数)
{
    int len=0;
    LNode *p;
    p=L;
    while(p->next)
    {
        len++;
        p=p->next;  //改变*p的指针域
    }
    return len;
}


void menu()
 {
     printf("***************学生信息管理系统***************\n\n");
     printf("\t\t    1.创建链表 输入信息\n");
     printf("\t\t    2.显示信息\n");
     printf("\t\t    3.按姓名查找\n");
     printf("\t\t    4.查找指定位置信息\n");
     printf("\t\t    5.插入指定位置信息\n");
     printf("\t\t    6.删除指定位置信息\n");
     printf("\t\t    7.统计学生信息总数\n");
     printf("\t\t    0.退出\n");
     printf("***********************************************\n\n\n");
 }
int main()
{
    Student e;LinkList L;
    menu();
//    InitList(L);
    int m,n,l,pos;
    char str[10];
    while(1)
    {
        printf("请输入要进行的操作:\n");
        scanf("%d",&m);
        if(m==0) break;
        else if(m<0||m>7) printf("无该项操作!请重新选择!\n\n");
        else
        {
            printf("\n");
            switch(m)
            {
                case 1:
                    printf("请输入初始人数(1~100):");
                    scanf("%d",&n);
                    printf("请输入学生信息:\n");
                    creat(L,n);
                    printf("创建完毕!\n\n");
                break;
                case 2:
                    printf("当前所有信息为:\n");
                    output(L);
                    printf("\n");
                break;
                case 3:
                    printf("请输入要查找的姓名:  \n");
                    scanf("%s",str);
                    namesearch(L,str);
                    printf("\n");
                break;
                case 4:
                    printf("请输入要查找的信息的位置: ");
                    scanf("%d",&pos);
                    if(getelem(L,pos,e))
                    {
                        printf("查找成功!该生信息为:\n");
                        printf("学号:%s\t姓名:%s\t成绩:%d\n",e.num,e.name,e.score);
                    }
                    else
                        printf("查找失败!\n");
                    printf("\n");
                break;
                case 5:
                    printf("请输入要插入的位置:");
                    scanf("%d",&pos);
                    printf("请输入学号:");
                    scanf("%s",e.num);
                    printf("请输入姓名:");
                    scanf("%s",e.name);
                    printf("请输入成绩:");
                    scanf("%d",&e.score);
                    if(InsertList(L,pos,e))
                        printf("插入完成!\n\n");
                    else
                        printf("插入失败!\n\n");
                break;
                case 6:
                    printf("请输入要删除的学生信息的位置:   ");
                    scanf("%d",&pos);
                    if(deleteList(L,pos))
                        printf("删除成功!\n");
                    else
                        printf("删除失败!\n");
                break;
                case 7:
                    l=length(L);
                    printf("学生总数:   %d\n",l);
                break;
            }
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值