用链表实现学生信息系统

#include<stdio.h>
#include<string.h>
typedef struct student
{
    int num;
    char name[10];
    float score[3];
}DataType;
typedef struct LNode
{
    DataType data;
    struct LNode *next;
}LNode,*LinkList;
//建立带头链表-头插法  1
LNode* Creat_LinkList1()
{
    LinkList L;//创建链表
    LNode *p;//p作为待插入节点
    int flag=0;
    printf("请输入这五名学生的学号、姓名和三科成绩:\n");
    L->next=NULL;
    while(flag!=5)
    {
        flag++;
        p=new LNode;
        scanf("%d %s %f %f %f",&p->data.num,p->data.name,&p->data.score[0],&p->data.score[1],&p->data.score[2]);
        p->next=L->next;
        L->next=p;
    }
    return L;
}
//建立带头链表-尾插法  1
LNode* Creat_LinkList2()
{
    LinkList L=new LNode;//创建链表
    LNode *s,*p;//p作为待插入节点,s作为尾结点
    int flag=0;
    printf("请输入这五名学生的学号、姓名和三科成绩:\n");
    L->next=NULL;
    s=L;
    while(flag!=2)
    {
        flag++;
        p=new LNode;
        scanf("%d %s %f %f %f",&p->data.num,p->data.name,&p->data.score[0],&p->data.score[1],&p->data.score[2]);
        s->next=p;
        s=p;
    }
    s->next=NULL;
    return L;
}
//求链表的长度   1
int Length_LinkList(LinkList L)
{
    LNode *p;
    p=L;
    int len=0;
    while(p->next)
    {
        p=p->next;
        len++;
    }
    return len;
}
//按序号查找   1
LNode* Get_LinkList(LinkList L,int i)
{
    LNode *p;
    int num=0;
    p=L;
    while((p->next)&& num<i)
    {
        p=p->next;
        num++;
    }
    return p;
}
//按值查找   1
LNode* Locate_LinkList(LinkList L,DataType x)
{
    LNode *p;
    p=L;
    while(p->next&&p->data.num!=x.num&&p->data.name!=x.name)
        p=p->next;
    return p;
}
//插入元素  1
int Insert_LinkList(LinkList L,int i,DataType x)
{

    LNode *p,*s;//s是待插入的结点
    p=Get_LinkList(L,i-1);//查找第i个元素的前驱
    if(p==NULL)
        return 0;//第i-1个结点不存在
    else
    {
        s=new LNode;
        s->data=x;
        s->next=p->next;
        p->next=s;
        return 1;
    }
}
//删除元素  1
int Delete_LinkList(LinkList L,int i)
{
    LNode *p,*s;
    p=Get_LinkList(L,i-1);
    if(p==NULL)
        return -1;
    else
    {
        if(p->next==NULL)
            return 0;
        else
        {
            s=p->next;
            p->next=s->next;//逻辑上删除
            delete s;//物理上删除
            return 1;
        }
    }
}
//链表倒置   1
void Reverse_LinkList(LinkList L)
{
    LNode *p,*q;
    p=L->next;
    L->next=NULL;
    while(p)
    {
        q=p;
        p=p->next;
        q->next=L->next;
        L->next=q;
    }
}
//删除链表中的重复结点  1
void Pur_LinkList(LinkList L)
{
    LNode *p,*q,*r;
    p=L->next;
    while(p)
    {
        q=p;
        while(q->next)
        {
            if(p->data.num==q->next->data.num&&p->data.name==q->data.name)
            {
                r=q->next;
                q->next=r->next;
                delete r;
            }
            else
                q=q->next;
        }
        p=p->next;
    }
}
//显示链表中的所有信息及所有的学生信息  1
void Print_LinkList(LinkList L)
{
    printf("学号   姓名   A科成绩   B科成绩   C科成绩\n");
    LNode *p;
    p=L->next;
    while(p)
    {
        printf("%d %7s %8.2f %9.2f %9.2f\n",p->data.num,p->data.name,p->data.score[0],p->data.score[1],p->data.score[2]);
        p=p->next;
    }
}
//显示链表中结点的信息及某同学的信息 1
void Print_LNode(LNode *p)
{
    printf("%d %7s %8.2f %9.2f %9.2f\n",p->data.num,p->data.name,p->data.score[0],p->data.score[1],p->data.score[2]);
}
int main()
{
    LinkList L;
    L=Creat_LinkList1();
    Print_LinkList(L);
    int flag;
    printf("请输入你需要进行的操作:\n");
    printf("1.统计学生总数\n");
    printf("2.通过位置查找学生信息\n");
    printf("3.通过学生学号和姓名查找学生信息\n");
    printf("4.插入学生信息\n");
	printf("5.删除学生信息\n");
	printf("6.逆序学生信息\n");
	printf("7.删除重复的学生信息\n");
	scanf("%d",&flag);
	if(flag==1)
    {
        printf("链表中存储了%d个学生的信息。\n",Length_LinkList(L));
    }
    if(flag==2)
    {
        printf("请输入你想查找学生信息的位置:\n");
        int site;
        scanf("%d",&site);
        LNode *p;
        p=Get_LinkList(L,site);
        if(p==NULL)
            printf("没有找到该学生的信息!");
        else
        {
            printf("第%d位同学的学号、姓名及各课成绩为:\n",site);
            Print_LNode(p);
        }
    }
    if(flag==3)
    {
        LNode *p;
        DataType d1;
        printf("请输入学生的学号和姓名:\n");
        scanf("%d %s",&d1.num,d1.name);
        p=Locate_LinkList(L,d1);
        if(p==NULL)
            printf("没有找到该学生的信息!");
        else
        {
            printf("这位同学的学号、姓名及各课成绩为:\n");
            Print_LNode(p);
        }
    }
    if(flag==4)
    {
        DataType d2;
        int location,flag1=0;
        printf("请输入你要插入的学生的位置和信息:\n");
        scanf("%d %d %s %f %f %f",&location,&d2.num,d2.name,&d2.score[0],&d2.score[1],&d2.score[2]);
        //flag1=Insert_LinkList(L,location,d2);
        if(flag1==0)
            printf("插入位置不合法!");
        else
            printf("插入成功!");
        Print_LinkList(L);
    }
    if(flag==5)
    {
        int flag2,site1;
        printf("请输入你想删除学生信息的位置:\n");
        scanf("%d",&site1);
        flag2=Delete_LinkList(L,site1);
        if(flag2==-1||flag2==0)
            printf("删除的位置不合法。\n");
        else
            printf("删除成功!\n");
        Print_LinkList(L);
    }
    if(flag==6)
    {
        Reverse_LinkList(L);
        Print_LinkList(L);
    }
    if(flag==7)
    {
        Pur_LinkList(L);
        Print_LinkList(L);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Gloming__zxy/article/details/80040875
今日推荐