信息管理系统(链表指针)

这是一个C语言实现的通讯录管理系统,包括用户和管理员两种权限。用户可以登录、查询信息,管理员可以添加、删除、修改和显示信息,还支持信息排序和综测成绩的平均和求和。系统通过文件进行数据的持久化存储,并实现了简单的错误处理和验证功能。
摘要由CSDN通过智能技术生成

本系统由本人与Hakuuna、共同完成。 

#include<stdio.h>
#include<stdlib.h>//引用暂停和清屏函数
#include <string.h>
#include <conio.h>
#define LEN sizeof(struct student)

int studentTotle=0;//定义学生人数为全局变量
typedef struct student
{
    char name[20];    //姓名
    char num[15];      //学号
    char sex[10];     //性别
    char from[20];    //籍贯
    char phone[15];      //手机号
    char QQ[15];         //QQ号
    char dorm[10];     //宿舍
    char zy[20];///专业
    int grade;//综测成绩
    char beizhu[50];///备注
    struct student *next;  //结构体指针
}stu;


//主菜单   以及对应的管理员和用户的菜单
int  menu();//主菜单
int menu_admin();//管理员权限菜单
int menu_user();//用户权限菜单
int userslogin();//用户密码登录
int managerslogin();//管理员密码登录


 //管理员的功能: 增删查改
struct student *AppendNode(struct student *head);//添加信息
int only_num(struct student *head,struct student *p);//对于学号是否唯一的判断
void DisplyNode(struct student *head);//显示信息
struct student *DelNode(struct student *head);//删除信息
struct student *Change(struct student *head);//修改信息
void average_grade(struct student *head);//综测成绩的平均和求和


//用户查询
void Find(struct student *head);    //查询信息
void find_user_num(struct student *head);//查询函数,用户查询,按学号查询
void find_user_name(struct student *head);//查询函数,用户查询,按姓名查询
int menu_user_find();//用户查找信息菜单


//排序  分为两个排序内容 分别是成绩的升序和降序
void PrintSort();//排序菜单
struct student *Sort(struct student *head);//排序
struct student * sort1(struct student *head);// 升序
struct student * sort2(struct student *head);//降序
struct student * sort3(struct student *head);//zy排序
void swapStruct(struct student *p,struct student *k);//排序的交换


//文件的写入与读出
void WriteFile(struct student *head);//将内容写入文件
struct student *ReadFile(struct student *head);//读文件


//主函数
int main()
{
     struct student *head=NULL;        //学生链表开始为空
     int answer=100;                //用户的回答
     int c;
     head=ReadFile(head);
     do {
        system("cls");//清屏
        answer=menu();//调用主菜单 返回一个用户的选择

        switch(answer)//根据用户选择进入不同界面
        {
               case 1: //管理员菜单
               system("cls");//清屏
               managerslogin();//管理员密码登录

               do{
                   system("cls");//清屏
                   c=menu_admin();
                   switch(c)//根据用户选择进入不同界面,管理员界面
                  {
                    case 1: //输入相关数据
                        system("cls");//清屏
                      head=AppendNode(head);//生成数据链表,返回头节点
                        break;

                    case 2://删除数据
                        system("cls");//清屏
                        head=DelNode(head);
                      break;
                    case 3://修改数据
                        system("cls");//清屏
                        head=Change(head);//修改
                        break;
                    case 4://显示数据
                        system("cls");//清屏
                        DisplyNode(head);//显示
                     break;
                    case 5://综测成绩排序
                        system("cls");//清屏
                         head=Sort(head);
                     break;
                    case 6://综测成绩的平均和求和
                        system("cls");//清屏
                        average_grade(head);
                     break;
                   }
               } while (c!=7);
                 break;
            case 2://用户菜单
            system("cls");//清屏
            userslogin();//用户密码登录
            do{
                system("cls");//清屏
                c=menu_user();
                switch(c)//根据用户选择进入不同界面
                    {

                        case 1://查看数据
                        system("cls");//清屏

                            Find(head);
                        break;


                    }
              }

            while (c!=2);

            printf("     按任意键返回主菜单……");
          break;

        }

    } while(answer!=3);//选择3则退出系统

    return 0;

}


//菜单函数实现对具体操作的选择
int  menu()//主菜单
{
int c;
printf("\t                    欢迎您使用通讯录管理系统\n");
printf("\n");
printf("\t   ************************************************************\n");
printf("\t   *                  【1】  管理员登陆                       *\n");
printf("\t   *                  【2】  用户登陆                         *\n");
printf("\t   *                  【3】  退出                             *\n");
printf("\t   *                   请选择:                               *\n");
printf("\t   ************************************************************\n");
scanf("%d",&c);
return c;
}
int menu_admin()//管理员菜单界面
{
int c;
printf("\n\n\n\n\n\t   ************************************************************\n");
printf(" \t                       欢迎管理员登陆\n");

printf("\t   ************************************************************\n");
printf("\t   *  1    ----   >>   添加信息                               *\n");
printf("\t   *  2    ----   >>   删除信息                               *\n");
printf("\t   *  3    ----   >>   修改信息                               *\n");
printf("\t   *  4    ----   >>   显示信息                               *\n");
printf("\t   *  5    ----   >>   信息排序                               *\n");
printf("\t   *  6    ----   >>   综测成绩的平均和求和                   *\n");
printf("\t   *  7    ----   >>   返回主菜单                             *\n");
printf("\t   *  请选择:                                                *\n");
printf("\t   ************************************************************\n");
 scanf("%d",&c);
return c;
}
int menu_user()//用户菜单界面
{
int c;
printf("\t                        欢迎用户登陆                           \n");
printf("\n");
printf("\t   ************************************************************\n");
printf("\t   *                   1    ----   >>   查询                  *\n");
printf("\t   *                   2    ----   >>   返回主菜单            *\n");
printf("\t   *                   请选择:                               *\n");
printf("\t   ************************************************************\n");
scanf("%d",&c);

return c;
}
int userslogin()//用户密码登录
{
    char zhanghao[20]={"abc123"};
    char mima[20]={"123456"};
    char zhanghao1[20];
    char mima1[20];
    printf("\n\n\n\t**********欢迎使用信息管理系统用户端**********\n\n\n");
        printf("\t               请输入您的账号及密码               \n\n");

    while(1)
    {
        printf("\t账号:");
    scanf("%s",zhanghao1);
    printf("\n");
    printf("\t密码:");
    scanf("%s",mima1);
    if(strcmp(zhanghao,zhanghao1)==0&&strcmp(mima,mima1)==0)
    break;
    else
    printf("很抱歉您输入的有误,请重新输入\n");
    }
    return 1;
}
int managerslogin()//管理员登录
{
    char zhanghao[20]={"zzz111"};
    char mima[20]={"123456"};
    char zhanghao1[20];
    char mima1[20];
    printf("\n\n\n\t**********欢迎使用信息管理系统管理端**********\n\n\n");
        printf("\t               请输入您的账号及密码               \n\n");

    while(1)
    {
        printf("\t账号:");
    scanf("%s",zhanghao1);
    printf("\n");
    printf("\t密码:");
    scanf("%s",mima1);
    if(strcmp(zhanghao,zhanghao1)==0&&strcmp(mima,mima1)==0)
    {
        break;
    }
    else
    {
        printf("很抱歉您输入的有误,请重新输入\n");
    }
    }
    return 1;
}

void WriteFile(struct student *head)//打开文件写
{
    FILE *fp;
    struct student *p=head;
    int count=0;
    if(head==NULL)
    {
        printf("无学生信息!\n");
        return ;
    }
     if((fp=fopen("data.txt","wb"))==NULL)    //注意这里是打开文本文件用来写入
    {
         printf("文件打开失败!\n");
         return ;
    }
    while(p!=NULL)        //将链表的全部数据写入文件中
    {
        fwrite(p,LEN,1,fp);        //将p所指向的1个节点数据写入文件
        count++;
        p=p->next;
    }
    fclose(fp);    //关闭文件
    return ;
}
struct student *ReadFile(struct student *head)//读文件
{
    FILE *fp;
    struct  student  *p=NULL;
    if((fp=fopen("data.txt","rb"))==NULL)    //打开文本文件用来读
    {
        printf("打开文件失败!\n");
        return head;
    }
    p=(struct student *)malloc(LEN);
    fread(p , LEN, 1, fp);//从文件中读出数据
    p->next=NULL;
    while(!feof(fp))
    {  //下面将从文件读出的一个学生的数据添加到链表的一个节点中
        if(head==NULL)
        {
             head=p;
        }
        else
        {
            p->next=head;
            head=p;
        }
        p=(struct student *)malloc(LEN);
        fread(p,LEN,1,fp);    //从文件中读出一条学生记录到p节点中
        p->next=NULL;
    }
    fclose(fp);//关闭文件
    return head;
}
//信息的录入
struct student *AppendNode(struct student *head)
{
struct student *p=NULL;
    int c=0;
    p=head;
    int m;
    while (c!=1)
    {
        p=(struct student *)malloc (sizeof (struct student));
        printf ("请输入姓名\n");    scanf ("%s",p->name );
        printf ("请输入学号\n");
        m=only_num(head,p);
        if (m==1)
        {
            printf ("此学号已存在\n");
            system ("pause");
            return head;
        }
        else
        {
        printf ("请输入性别\n");    scanf ("%s",p->sex  );
        printf ("请输入籍贯\n");    scanf ("%s",p->from  );
        printf ("请输入手机号\n");  scanf ("%s",p->phone  );
        printf ("请输入QQ号\n");    scanf ("%s",p->QQ  );
        printf ("请输入宿舍\n");    scanf ("%s",p->dorm  );
        printf ("请输入专业\n");    scanf ("%s",p->zy  );
        printf ("请输入综测成绩\n");scanf ("%d",&p->grade  );
        printf ("请输入备注\n");    scanf ("%s",p->beizhu  );
        printf ("是否继续输入,如果退出请按1,否则按0键\n");
        scanf ("%d",&c);
        system("cls");
        if (head==NULL)
        {
            head=p;
            p->next =NULL;
            studentTotle++;//节点数增加1
        }
        else
        {
            p->next =head;
            head=p;
            studentTotle++;//节点数增加1
        }
        WriteFile(head);
        }

    }return head;

}
//信息的修改
struct student *Change(struct student *head)
{
    system("cls");
    struct student *p;
    p=head;//p是头结点
    char num[15];
    int m;//选项
    printf("请输入要修改的学生的学号\n");
    scanf("%s",num);
    getchar();
     while(p!=NULL)//成立则进行下面循环,不成立则跳出循环

        {
            if(strcmp(p->num,num)!=0)///不相等
            {
                p=p->next;
            }

            else if(strcmp(p->num,num)==0)//找到了要修改的学号
            {
                break;
            }

        }
         if(p!=NULL)
            {
                    printf("******************************************************************************\n");
                    printf ("%-5s %-5s %-5s %-5s %-7s %-7s %-5s %-5s %-5s  %-5s\n","姓名","学号","性别","籍贯","手机号","QQ号","宿舍","专业","综测成绩","备注");
                    printf("%-5s %-5s %-5s %-5s %-7s %-7s %-5s %-5s %-5d     %-5s\n ",p->name,p->num,p->sex,p->from,p->phone,p->QQ,p->dorm,p->zy,p->grade,p->beizhu);
                    printf("******************************************************************************\n");
                    printf("以上为该学生目前的信息\n\n");
                    printf("\n选择修改的内容\n");
                    printf("1.修改姓名\n");
                    printf("2.修改学号\n");
                    printf("3.修改性别\n");
                    printf("4.修改籍贯\n");
                    printf("5.修改手机号\n");
                    printf("6.修改QQ号\n");
                    printf("7.修改宿舍\n");
                    printf("8.修改专业名\n");
                    printf("9.修改综测成绩\n");
                    printf("10.修改备注\n");
                    printf("11.退出菜单\n");
                    printf("--------------\n");
                        do
                            {
                              printf("请选择选项\n");
                              scanf("%d", &m);
                              switch(m)
                              {
                                 case 1:
                                 {
                                   printf("请输入改正后的姓名\n");
                                   scanf("%s",p->name);
                                  }
                                  break;
                                  case 2:
                                 {
                                    printf("请输入改正后的学号\n");
                                    scanf("%s",p->num);
                                  }
                                 break;
                                 case 3:
                                 {
                                    printf("请输入改正后的性别\n");
                                    scanf("%s",p->sex);
                                  }
                                  break;
                                  case 4:
                                 {
                                     printf("请输入改正后的籍贯\n");
                                     scanf("%s",p->from);
                                  }
                                  break;

                                  case 5:
                                 {
                                       printf("请输入改正后的手机号\n");
                                       scanf("%s",p->phone);
                                  }
                                  break;
                                  case 6:
                                 {
                                       printf("请输入改正后的qq号\n");
                                       scanf("%s",p->QQ);
                                  }
                                  break;
                                  case 7:
                                 {
                                       printf("请输入改正后的宿舍\n");
                                       scanf("%s",p->dorm);
                                  }
                                  break;
                                  case 8:
                                 {
                                       printf("请输入改正后的专业名\n");
                                       scanf("%s",p->zy);
                                  }
                                  break;

                                   case 9:
                                   {
                                           printf("请输入改正后的综测成绩\n");
                                          scanf("%d",&p->grade);
                                   }
                                   break;
                                  case 10:
                                 {
                                       printf("请输入改正后的备注\n");
                                       scanf("%s",p->beizhu);
                                  }
                                  break;


                                }
                                printf("信息修改成功谢谢使用\n");
                            }while(m!=11);
            }
        else
            {
                printf("很抱歉,学号不存在,信息修改失败\n谢谢使用\n");
                system("pause");

            }
WriteFile(head);
return head;
}
//信息的删除
struct student *DelNode(struct student *head)
{
            system("cls");
             char num[15];
            struct student* p=NULL;
            struct student* q=NULL;
            printf("请输入要删除学生的学号\n");
              scanf("%s", num);
            p=head;
           while((strcmp(p->num,num)!=0)&&p->next!=NULL)//没找到、没到结尾
                   {
                       q=p;
                       p=p->next;
                }
                   if((strcmp(p->num,num)==0))//找到
                   {
                       if(p==head)
                       {
                           head=p->next;
                       }
                       else
                       {
                           q->next=p->next;
                       }
                      studentTotle=studentTotle-1;
                       printf("学生信息删除成功,谢谢使用\n");
                       printf("     按任意键返回主菜单……");
                     getch();//在屏幕停留信息,等待用户按下任意键
                       free(p);
                   }
                   else
                   {
                      printf("查无此人\n");
                       printf("     按任意键返回主菜单……");
                    getch();//在屏幕停留信息,等待用户按下任意键
                   }
                   WriteFile(head);
                   return (head);
}

//信息的显示
void DisplyNode(struct student *head)
{
    struct student *p=NULL;    //定义指向链表当前结点的指针
    p=head;
    if(head!=NULL)
    {
        printf("\n\n*************************************************************************\n\n");

        printf ("%-5s %-5s %-5s %-5s %-7s %-7s %-5s %-5s %-5s  %-5s\n","姓名","学号","性别","籍贯","手机号","QQ号","宿舍","专业","综测成绩","备注");

        while(p!=NULL)
        {
            printf ("%-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5d     %-7s\n",p->name ,p->num ,p->sex ,p->from ,p->phone ,p->QQ ,p->dorm ,p->zy ,p->grade ,p->beizhu );

            p=p->next;
        }
        printf("*************************************************************************\n\n");
    }
    else
        printf("\n\n\t抱歉,没有学生数据!\n\n");
        system ("pause");
}
//信息的查找 用户方面
void Find(struct student *head)
{
    struct student *p=NULL;
        int c=0;

        do
        {

            c=menu_user_find();
            switch (c)
            {
                case 1:  //按姓名查询
                      system("cls");//清屏
                      find_user_name(head);
                      break;

                case 2://按学号查询
                      system("cls");//清屏
                      find_user_num(head);
                      break;

            }


        }while(c!=3);
        return;
}
//查询函数,用户查询,按姓名查询
void find_user_name(struct student *head)
 {
                   struct student *p=NULL;
                   p=head;
                   printf ("请输入要查询的学生的姓名\n");
                  char x[100];
                  scanf ("%s",x);
                  while (p!=NULL)
                  {
                      if (strcmp (p->name ,x)==0)
                      {
                            printf ("%-5s %-5s %-5s %-5s %-7s %-7s %-5s %-5s %-5s  %-5s\n","姓名","学号","性别","籍贯","手机号","QQ号","宿舍","专业","综测成绩","备注");
                          printf ("%-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5d     %-7s\n",p->name ,p->num ,p->sex ,p->from ,p->phone ,p->QQ ,p->dorm ,p->zy ,p->grade ,p->beizhu );
                          break;
                      }
                  p=p->next ;
                  }

                  if (p==NULL)
                  {
                      printf ("没有找到这名学生\n");
                  }

                  return;

 }
 //查询函数,用户查询,按学号查询
void find_user_num(struct student *head)
 {
                   struct student *p=NULL;
                   p=head;
                   printf ("请输入要查询的学生的学号\n");
                  char x[100];
                  scanf ("%s",x);
                  while (p!=NULL)
                  {
                      if (strcmp (p->num  ,x)==0)
                      {
                            printf ("%-5s %-5s %-5s %-5s %-7s %-7s %-5s %-5s %-5s  %-5s\n","姓名","学号","性别","籍贯","手机号","QQ号","宿舍","专业","综测成绩","备注");
                          printf ("%-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5d     %-7s\n",p->name ,p->num ,p->sex ,p->from ,p->phone ,p->QQ ,p->dorm ,p->zy ,p->grade ,p->beizhu );

                            break;
                      }
                  p=p->next ;
                  }

                  if (p==NULL)
                  {
                      printf ("没有找到这名学生\n");
                  }
                  return;

 }

//用户查找信息菜单
int menu_user_find()
{
    int c;
    printf("\t                        请选择您的查找方式                     \n");
    printf("\n");
    printf("\t   ************************************************************\n");
    printf("\t   *                   1    ----   >>   按姓名查询            *\n");
    printf("\t   *                   2    ----   >>   按学号查询            *\n");
    printf("\t   *                   3    ----   >>   返回上一级菜单        *\n");
    printf("\t   *                   请选择:                               *\n");
    printf("\t   ************************************************************\n");
    scanf ("%d",&c);
    return c;
}
//输出排序菜单
void PrintSort()
{
    printf("\t   ************************************************************\n");
    printf("\t   *                                                          *\n");
    printf("\t   *      您可以进行以下操作:                                 *\n");
    printf("\t   *                                                          *\n");
    printf("\t   *      按综测成绩升序排序 请按 1                           *\n");
    printf("\t   *                                                          *\n");
    printf("\t   *      按综测成绩降序排序 请按 2                           *\n");
    printf("\t   *                                                          *\n");
    printf("\t   *      按专业的首字母排序 请按 3                           *\n");
    printf("\t   *                                                          *\n");
    printf("\t   *      返回上一级菜单 请按 4                               *\n");
    printf("\t   *                                                          *\n");
    printf("\t   ************************************************************\n\n");
}

//排序
struct student *Sort(struct student *head)
{
    system("cls");
    int a;
    do{
        system("cls");
        PrintSort();
        scanf("%d",&a);
        switch(a)
        {
        case 1:
            head=sort1(head);
            DisplyNode(head);
            break;
        case 2:
            head=sort2(head);
            DisplyNode(head);
            break;
        case 3:
            head=sort3(head);
            DisplyNode(head);
            break;
        }

    }while (a!=4);
    system("pause");
    return(head);
    system("cls");
}
struct student *sort1(struct student *head)///按综测成绩升序排序
{
    struct student *p=NULL;///相当于数组排序中的i
    struct student *q=NULL;///相当于数组排序中的j
    struct student *k=NULL;///相当于数组排序中的k
    if(head!=NULL)
    {
        for(p=head;p!=NULL;p=p->next)
        {
            k=p;
            for(q=p->next;q!=NULL;q=q->next)
            {
                if(q->grade<k->grade)
                {
                    k=q;
                }
            }
            if(k!=p)
            {
               swapStruct(p,k);
            }
        }
    }
    else
        printf("\n\t抱歉,没有数据!\n\n");
    return(head);

}
struct student *sort2(struct student *head)///按综测成绩降序排序
{
    struct student *p=NULL;///相当于数组排序中的i
    struct student *q=NULL;///相当于数组排序中的j
    struct student *k=NULL;///相当于数组排序中的k
    if(head!=NULL)
    {
        for(p=head;p!=NULL;p=p->next)
        {
            k=p;
            for(q=p->next;q!=NULL;q=q->next)
            {
                if(q->grade>k->grade)
                {
                    k=q;
                }
            }
            if(k!=p)
            {
               swapStruct(p,k);
            }
        }
    }
    else
        printf("\n\t抱歉,没有数据!\n\n");
    return(head);

}
struct student *sort3(struct student *head)///按专业的首字母排序
{
    struct student *p=NULL;///相当于数组排序中的i
    struct student *q=NULL;///相当于数组排序中的j
    struct student *k=NULL;///相当于数组排序中的k
    if(head!=NULL)
    {
        for(p=head;p!=NULL;p=p->next)
        {
            k=p;
            for(q=p->next;q!=NULL;q=q->next)
            {
                if(strcmp(q->zy,k->zy)==-1)
                {
                    k=q;
                }
            }
            if(k!=p)
            {
               swapStruct(p,k);
            }
        }
    }
    else
        printf("\n\t抱歉,没有数据!\n\n");
    return(head);

}

void swapStruct(struct student *p,struct student *k)//排序的交换
{
    struct student temp;
    temp=*p;
    *p=*k;
    *k=temp;
    struct student *x;
    x=p->next;
    p->next=k->next;
    k->next=x;
}
//综测成绩的平均和求和
void average_grade(stu *head)
{
    stu *p=head;
    int sum=0,t=0;
    float ave=0;
    system("cls");
    while(p!=NULL)
   {
      sum+=p->grade;
      t++;
      p=p->next;
   }
    ave=sum*1.0/t;
    printf("\t   ************************************************************\n");
    printf("                         和为%d\n",sum);
    printf("                         平均数为%.2f\n",ave);
    printf("\t   ************************************************************\n");
    system("pause");
}
int only_num(struct student *head,struct student *p)
{

    struct student *q;
    q=head;//q是头结点
    char num[15];
    int m=0;//选项

    scanf("%s",p->num);
    getchar();
     while(q!=NULL)//成立则进行下面循环,不成立则跳出循环
        {
            if(strcmp(q->num,p->num)!=0)///不相等
            {
                m=0;
                q=q->next;
            }
            else if(strcmp(q->num,p->num)==0)//学号相同
            {
                m=1;
                break;
            }

        }

return m;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值