学生信息链表

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
///本程序采用链表的操作,也就是不限空间
struct node
{
    char num[20];///学号
    char name[20];///姓名
    char sex[20];///性别
    char clas[20];///班级
    struct node *next;///下一个结构体
};
struct node *listcreat();///创建结构体的函数
void list_add(struct node *head);///添加学生信息
void list_show(struct node *head);///展示学生信息
void list_del(struct node *head);///删除学生信息
void list_lookup(struct node *head);///查找学生信息
void clear();///清屏
int main()
{
    struct node *head=listcreat();///创建一个头结点,作为链表的入口
    int choose;///菜单变量
    while(1)
    {
        ///页面优化
        printf("\t\t     **欢迎使用学生管理系统**\n");
        printf("\t\t\t****************\n");
        printf("\t\t\t*0.退出\t       *\n");
        printf("\t\t\t*1.添加学生信息*\n");
        printf("\t\t\t*2.展示学生信息*\n");
        printf("\t\t\t*3.删除学生信息*\n");
        printf("\t\t\t*4.查找学生信息*\n");
        printf("\t\t\t****************\n");
        printf("请输入你需要的操作数:");
        scanf("%d",&choose);
        if(choose==0)
        {
            break;
        }
        switch(choose)
        {
            case 1:list_add(head);break;
            case 2:list_show(head);break;
            case 3:list_del(head);break;
            case 4:list_lookup(head);break;
            default:printf("输入错误,请重新输入\n");break;
        }
        clear();
    }
    return 0;
}


///创建结构体
struct node *listcreat()
{
     struct node *p;
     p=(struct node *)malloc(sizeof(struct node));
     p->next=NULL;
     return p;
}




///添加学生信息
void list_add(struct node *head)
{
    ///采取尾插法
    int n;///添加学生数的变量
    struct node *p,*q,*temp=head;
    while(temp->next!=NULL)///这个循环是找到尾结点
        temp=temp->next;
    q=temp;///temp的尾结点就相当于应该一个新的头结点
    ///只有这样才能实现进行多次添加
    printf("请输入你要添加的学生数:");
    scanf("%d",&n);
    printf("学号\t    名字  性别  班级\n");
    while(n--)///尾插法操作
    {
        p=(struct node *)malloc(sizeof(struct node));///申请空间
        scanf("%s%s%s%s",p->num,p->name,p->sex,p->clas);
        p->next=q->next;
        q->next=p;
        q=p;
    }
}




///展示学生信息
void list_show(struct node *head)
{
    int i=0;
    struct node *p;
    p=head;
    p=p->next;
    printf("序号\t学号\t\t名字\t性别\t班级\n");
    while(p!=NULL)
    {
        printf("%2d\t%s\t%s\t%s\t%s\n",++i,p->num,p->name,p->sex,p->clas);
        p=p->next;
    }
}




///删除学生信息
void list_del(struct node *head)
{
    char stnum[20];
    printf("请输入要删除学生信息的学号:");
    scanf("%s",stnum);
    struct node *front,*rear;///front代表删除的值的前驱,rear代表删除的值的后继
    rear=head->next;
    while(strcmp(rear->num,stnum))
    {
        ///一直维护一个值的前驱和后继
        front=rear;
        rear=rear->next;
    }
    printf("删除成功\n\n");
    front->next=rear->next;///前驱指向后继的地址,那么要删除的值就没法找到了
    free(rear);///要及时释放空间,防止内存泄漏
}




///查找学生信息
void list_lookup(struct node *head)
{
    struct node *p;
    p=head->next;
    char stnum[20];
    printf("请输入你要查询的学生信息的学号:");
    scanf("%s",stnum);
    while(strcmp(p->num,stnum))///采用对链表每个数据进行比较,一样的返回就是0,跳出,并进行输出
    {
        p=p->next;
    }
    printf("学号\t\t名字\t性别\t班级\n");
    printf("%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->clas);
}




///清屏
void clear()
{
    printf("按任意键继续......");
    getch();
    system("cls");
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值