作业2 单链表实现学生管理系统

单链表实现学生管理系统(参照顺序表技能)写出菜单界面switch选择
1、创建单链表,
2、录入学生信息,
3、删除一个学生信息,
4、按照成绩修改一个学生的年龄,
5、按照姓名顺序查找一个学生是否存在。
要求:
1、学生信息结构体姓名,分数,年龄,电话。
2、其他功能函数自定义,分文件编译。

#include<myhead.h>
#define MAX 20
typedef struct
{
    char name[20];
    int score;
    int age;
    long telephone;
}stu;

typedef struct node
{
    union
    {
        stu data;
        int len;
    };
    struct node  *next;
    
}Link,*Plink;

int empty(Plink L)
{
	if(L==NULL)
	{
		return 1;
	}
	return 0;
}

Plink get_head()//申请头结点函数
{
    Plink p = malloc(sizeof(Link));//申请结构体大小空间
    if(p==NULL)
    {
        printf("申请头结点失败\n");
        return NULL;
    }
    p->len=0;//数据域赋值
    p->next = NULL;//指针域赋值(只有一个头结点)
    return p;
}

int head_insert(Plink L)//头插法创建单链表
{
    char inputname[20];
    int inputscore,inputage;
    long inputtelephone;
    if(L==NULL)
    {
        printf("单链表不存在\n");
        return -1;
    }
    Plink p = malloc(sizeof(Link));//申请结构体大小空间
    printf("请输入姓名:");
    scanf("%s",inputname);
    strcpy(p->data.name,inputname);//新节点数据域赋值
    printf("请输入成绩:");
    scanf("%d",&inputscore);
    p->data.score = inputscore;
    printf("请输入年龄:");
    scanf("%d",&inputage);
    p->data.age = inputage;
    printf("请输入电话:");
    scanf("%ld",&inputtelephone);
    p->data.telephone = inputtelephone;
    //将第1个节点的地址放入新节点指针域
    p->next = L->next;
    //将新节点地址放入头结点指针域
    L->next = p;

    L->len++;//长度加1

}

int node_output(Plink L)//输出单链表
{
    if(L==NULL||L->len==0)
    {
        printf("单链表不存在或者为空\n");
        return -1;
    }
    int i;
    Plink t = L;//指向头结点
    for(i = 0;i<L->len;i++)
    {
        t = t->next;
        printf("%s %d %d %ld",t->data.name,t->data.score,t->data.age,t->data.telephone);
        printf("\n");
    }
}

int dele_any_pos(Plink L)//任意位置删除
{    
    if(empty(L)||L->len==0)
    {
        printf("单链表不存在或者为空\n");
        return -1;
    }
    int i,pos;
    printf("请输入要删除的位置:");
    scanf("%d",&pos);
    Plink t  =L;
    for(i  =0;i<pos-1;i++)//移动pos-1次指向待删除节点的前驱
    {
        t  =t->next;
    }
    Plink Q = t->next;//保留要删除的节点
    t->next = t->next->next;//删除
    L->len--;

    free(Q);
    Q=NULL;
    return 0;
}

int score_find_change(Plink L)
{
    if(empty(L)||L->len==0)
    {
        printf("单链表不存在或者为空\n");
        return -1;
    }
    Plink t = L;
    int i,e,key,pos=-1;
    printf("请输入要被修改的同学的成绩:");
    scanf("%d",&key);
    for(i = 0;i<L->len;i++)
    {
        t = t->next;
        if(key==t->data.score)
        {
            pos=i+1;//保留节点位置
            printf("查找成功,请输入要修改的年龄:");
            scanf("%d",&e);
            t->data.age = e;//修改
            break;
        }
    }
    if(pos==-1)
    {
        printf("不存在该节点值\n");
        return -1;
    }
    return 0;
}
//按照姓名顺序查找一个学生是否存在
int name_find(Plink L)
{
    if(empty(L)||L->len==0)
    {
        printf("单链表不存在或者为空\n");
        return -1;
    }
    Plink t = L;
    int i,pos=-1;
    char find_name[20];
    printf("请输入要查找的姓名:");
    scanf("%s",find_name);
    for(i = 0;i<L->len;i++)
    {
        t = t->next;
        if(strcmp(find_name,t->data.name)==0)
        {
            pos=i+1;//保留节点位置
            printf("查找成功,这个同学存在\n");
            
            break;
        }
    }
    if(pos==-1)
    {
        printf("不存在该节点值\n");
        return -1;
    }
    return 0;
}

void caidan(void)
{
    printf("\n");
    printf("*******************\n");
    printf("0、退出\n");
    printf("2、录入学生信息\n");
    printf("3、删除一个学生信息\n");
    printf("4、按照成绩修改一个学生的年龄\n");
    printf("5、按照姓名顺序查找一个学生是否存在\n");
    printf("*****************\n");
    printf("\n");
}


int main(int argc, char const *argv[])
{
    int bianhao;
    Plink L =  get_head();
    
    
    while(1)
    {
        caidan();
        printf("请输入你要执行的功能:");
        scanf("%d",&bianhao);
        switch (bianhao)
        {
            case 0:exit(0);
            
            
            case 2:
                {
                   head_insert(L);
                    node_output(L);
                }
                break;
            case 3:
                {
                    dele_any_pos(L);
                    node_output(L);
                }
                break;
            case 4:
                {
                    score_find_change(L);
                    node_output(L);
                }
                break;
            case 5:
                {
                    name_find(L);
                    node_output(L);
                }
                break;
            
                
            default:printf("你输入的内容有误");
            break;
        }
    }
    
    return 0;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值