c语言写学生宿舍管理系统

 下面是我用c语言在linux环境下写的一个学生宿舍管理系统,数据结构是 用链表。不完整,只有输入学生信息和 计算机给学生自动分配宿舍,没有考虑男女宿舍,我 是 这样想的:

对每栋宿舍都作标记,0表示女生宿舍,1表示男生宿舍,但我又是以一个宿舍作为链表的一个节点的.所以实现起来比较难啊。

有人能帮我想想在 不改变数据结构的 情况下有什么好 的 办法没有?

/*******头文件*****/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/*定义数据结构类型*/
typedef struct stud{
 char   id[9];
 char   name[16];
 char   sex[2];
 int    age;
 char   department[12];
 char   speciality[12];
 int    grade;
 int    _class;
 int    b_no;
 int    r_no;
 int    bed;
 struct stud   *next;
}STUD;

typedef struct{
 STUD   *head,  *tail;
 int    len;
} SList;

typedef struct room{
 int   b_no;
 int   r_no;
 char  beds[6][8];
 struct room *next;
}ROOM;

typedef struct{
 ROOM   *head,  *tail;
 int    len;
}RList;

void init(RList *L, int b, int f, int r, int d)  /*初始化宿舍为空*/
{
 int      i, j, k, t;
 ROOM     *p, *q;

 p = q = (ROOM *)malloc(sizeof(ROOM));
 L->head = p;
 q->next = NULL;

 for(i = 1; i <= b; i ++ ){
  for(j = 1; j <= f; j++ ){
   for(k = 1; k <= r; k++ ){
    p = (ROOM *)malloc(sizeof(ROOM));
    for(t = 0; t < d; t++ ){
     p->b_no = i;
     p->r_no = j*100 + k;
     strcpy(p->beds[t], "0");
    }
    p->next = q->next;
    q->next = p;
    q = p;
   }
  }

 }
 L->len = b*f*r;
}

int  s_input(SList *L)   /*从终端读取学生信息*/
{
 STUD   *p, *q;
 int   n = 0;

 q = p = (STUD *)malloc(sizeof(STUD));

 system("clear");
 printf("/t/nPlease input  student ID, when ID ='#' end input :");
 scanf("%s", p->id);
 if(p->id[0] == '#')
  return 0;
 printf("name: ");
 scanf("%s", p->name);
 printf("sex(M/F): ");
 scanf("%s", p->sex);
 printf("age: ");
 scanf("%d", &p->age);
 printf("department: ");
 scanf("%s", p->department);
 printf("speciality: ");
 scanf("%s", p->speciality);
 printf("grade: ");
 scanf("%d", &p->grade);
 printf("class: ");
 scanf("%d", &p->_class);
 L->head = p;
 q->next = NULL;
 n++;

 p = (STUD *)malloc(sizeof(STUD));
 while(1){
  printf("/t/nPlease input  student ID, when ID ='#' end input :");
  scanf("%s", p->id);
  if(p->id[0] == '#')
   break;;
  printf("name: ");
  scanf("%s", p->name);
  printf("sex(M/F): ");
  scanf("%s", p->sex);
  printf("age: ");
  scanf("%d", &p->age);
  printf("department: ");
  scanf("%s", p->department);
  printf("speciality: ");
  scanf("%s", p->speciality);
  printf("grade: ");
  scanf("%d", &p->grade);
  printf("class: ");
  scanf("%d", &p->_class);
  p->next = q->next;
  q->next = p;
  q = p;
  p = (STUD *)malloc(sizeof(STUD));
  n++;
 }
 L->len = n;
 return n;
}

/*计算机自动分配宿舍*/
void admeasure(RList *R, SList *S, int N)
{
 STUD    *p;
 ROOM    *q;
 int    i=0;

 p = S->head;
 q = R->head->next;

 while(p != NULL && q != NULL){
  while(i < N){
   if(strcmp(q->beds[i] , "0") == 0){
    p->b_no = q->b_no;
    p->r_no = q->r_no;
    strcpy(q->beds[i], p->id);
    p->bed = i;
    p = p->next;
   }
   if(p == NULL)
    break;
   i++;
  }
  i = 0;
  q = q->next;
 }

 if(p != NULL && q == NULL)
  printf("/nToo many students and too few room");
}

int  search(SList *S, char *c, int flag)
{
 STUD   *p;
 int n = 0;

 p = S->head;
 while(p != NULL){
  if(strcmp(p->id, c) != 0){
   p = p->next;
  }
  else{
    printf("/n%-12s%-17s%4s%3d%12s%12s%3d",
      p->id, p->name, p->sex, p->age, p->department, p->speciality, p->bed);
   if(flag == 1)
    p = p->next;
   n = 1;
  }  
 }
 return n;
}

void output(RList *R, SList *S, int N)
{
 ROOM   *p;
 int    i;

 p = R->head->next;

 printf("===================== THE OUTPUT =========================");
 while(p != NULL ){
  printf("/nBUILD NO:%d ROOM NO:%d ", p->b_no, p->r_no);
  printf("/n====ID==========name=======sex==age==department==speciality==bed===");
  for(i = 0; i < N; i++){
   if( 0 == search(S, p->beds[i], 1))
    printf("/n--------------------------------------------------------------------");
  }
  getchar();
  p = p->next;
 }
}

int  main(void)
{
 SList    *S=(SList *)malloc(sizeof(SList));
 RList    *R=(RList *)malloc(sizeof(RList));
 char     c, ch='*';
 FILE     *fp;
 struct abc{
  int  b_no;
  int  f_no;
  int r_no;
  int  num;
 }ss;

 system("clear");
 printf("/t/t/n/nTHIS IS A MIB OF SCHOOL STUDENTS' ROOM/n");
 printf("============================================================/n");

 if( (fp = fopen("abc", "wt")) == NULL){
  printf("/ncan not open file press any key to exit....");
  getchar();
  exit(0);
 }

 printf("/nIs the frist time of you use this MIB(y/n)/n");
 c = getchar();

 if(c == 'y'){
  printf("/nEnter the number of build:");
  scanf("%d", &ss.b_no);
  printf("/nEnter the number of floor:");
  scanf("%d",  &ss.f_no);
  printf("/nEnter the number  of room:");
  scanf("%d", &ss.r_no);
  printf("/nEnter the number of students a room can have:");
  scanf("%d", &ss.num);
 }

 if(fwrite(&ss, sizeof(struct abc), 1, fp) != 1){
  printf("write file error press any key to exit....");
  getchar();
  exit(0);
 }

 init(R, ss.b_no, ss.f_no, ss.r_no, ss.num);
 printf("/n/t/tPress any key to the main menu/n");
 getchar();

 do{
  system("clear");
  printf("/n=========================================================================/n");
  printf("/n/t1: input students' information/n");
  printf("/n/t8: output dormitory and students' information/n");
  printf("/n/t0: exit this MIB/n ");

  ch = getchar();
  switch(ch){
   case '1': s_input(S);
       admeasure(R, S, ss.num);
       break;
   case '8': output(R, S, ss.num);
       break;
   case '0': exit(0);
  }
 }while(1);
 return 0;
}

 

/*******头文件*****/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/*定义数据结构类型*/
typedef struct stud{
	char   id[9];
	char   name[16];
	char   sex[2];
	int    age;
	char   department[12];
	char   speciality[12];
	int    grade;
	int    _class;
	int    b_no;
	int    r_no;
	int    bed;
	struct stud   *next;
}STUD;

typedef struct{
	STUD   *head,  *tail;
	int    len;
} SList;

typedef struct room{
	int   b_no;
	int   r_no;
	char  beds[6][8];
	struct room *next;
}ROOM;

typedef struct{
	ROOM   *head,  *tail;
	int    len;
}RList;

void init(RList *L, int b, int f, int r, int d)  /*初始化宿舍为空*/
{
	int      i, j, k, t;
	ROOM     *p, *q;

	p = q = (ROOM *)malloc(sizeof(ROOM));
	L->head = p;
	q->next = NULL;

	for(i = 1; i <= b; i ++ ){
		for(j = 1; j <= f; j++ ){
			for(k = 1; k <= r; k++ ){
				p = (ROOM *)malloc(sizeof(ROOM));
				for(t = 0; t < d; t++ ){
					p->b_no = i;
					p->r_no = j*100 + k;
					strcpy(p->beds[t], "0");
				}
				p->next = q->next;
				q->next = p;
				q = p;
			}
		}

	}
	L->len = b*f*r;
}

int  s_input(SList *L)   /*从终端读取学生信息*/
{
	STUD   *p, *q;
	int   n = 0;

	q = p = (STUD *)malloc(sizeof(STUD));

	system("clear");
	printf("/t/nPlease input  student ID, when ID ='#' end input :");
	scanf("%s", p->id);
	if(p->id[0] == '#')
		return 0;
	printf("name: ");
	scanf("%s", p->name);
	printf("sex(M/F): ");
	scanf("%s", p->sex);
	printf("age: ");
	scanf("%d", &p->age);
	printf("department: ");
	scanf("%s", p->department);
	printf("speciality: ");
	scanf("%s", p->speciality);
	printf("grade: ");
	scanf("%d", &p->grade);
	printf("class: ");
	scanf("%d", &p->_class);
	L->head = p;
	q->next = NULL;
	n++;

	p = (STUD *)malloc(sizeof(STUD));
	while(1){
		printf("/t/nPlease input  student ID, when ID ='#' end input :");
		scanf("%s", p->id);
		if(p->id[0] == '#')
			break;;
		printf("name: ");
		scanf("%s", p->name);
		printf("sex(M/F): ");
		scanf("%s", p->sex);
		printf("age: ");
		scanf("%d", &p->age);
		printf("department: ");
		scanf("%s", p->department);
		printf("speciality: ");
		scanf("%s", p->speciality);
		printf("grade: ");
		scanf("%d", &p->grade);
		printf("class: ");
		scanf("%d", &p->_class);
		p->next = q->next;
		q->next = p;
		q = p;
		p = (STUD *)malloc(sizeof(STUD));
		n++;
	}
	L->len = n;
	return n;
}

/*计算机自动分配宿舍*/
void admeasure(RList *R, SList *S, int N)
{
	STUD    *p;
	ROOM    *q;
	int    i=0;

	p = S->head;
	q = R->head->next;

	while(p != NULL && q != NULL){
		while(i < N){
			if(strcmp(q->beds[i] , "0") == 0){
				p->b_no = q->b_no;
				p->r_no = q->r_no;
				strcpy(q->beds[i], p->id);
				p->bed = i;
				p = p->next;
			}
			if(p == NULL)
				break;
			i++;
		}
		i = 0;
		q = q->next;
	}

	if(p != NULL && q == NULL)
		printf("/nToo many students and too few room");
}

int  search(SList *S, char *c, int flag)
{
	STUD   *p;
	int n = 0;

	p = S->head;
	while(p != NULL){
		if(strcmp(p->id, c) != 0){
			p = p->next;
		}
		else{
			printf("/n%-12s%-17s%4s%3d%12s%12s%3d",
					p->id, p->name, p->sex, p->age, p->department, p->speciality, p->bed);
			if(flag == 1)
				p = p->next;
			n = 1;
		}  
	}
	return n;
}

void output(RList *R, SList *S, int N)
{
	ROOM   *p;
	int    i;

	p = R->head->next;

	printf("===================== THE OUTPUT =========================");
	while(p != NULL ){
		printf("/nBUILD NO:%d ROOM NO:%d ", p->b_no, p->r_no);
		printf("/n====ID==========name=======sex==age==department==speciality==bed===");
		for(i = 0; i < N; i++){
			if( 0 == search(S, p->beds[i], 1))
				printf("/n--------------------------------------------------------------------");
		}
		getchar();
		p = p->next;
	}
}

int  main(void)
{
	SList    *S=(SList *)malloc(sizeof(SList));
	RList    *R=(RList *)malloc(sizeof(RList));
	char     c, ch='*';
	FILE     *fp;
	struct abc{
		int  b_no;
		int  f_no;
		int r_no;
		int  num;
	}ss;

	system("clear");
	printf("/t/t/n/nTHIS IS A MIB OF SCHOOL STUDENTS' ROOM/n");
	printf("============================================================/n");

	if( (fp = fopen("abc", "wt")) == NULL){
		printf("/ncan not open file press any key to exit....");
		getchar();
		exit(0);
	}

	printf("/nIs the frist time of you use this MIB(y/n)/n");
	c = getchar();

	if(c == 'y'){
		printf("/nEnter the number of build:");
		scanf("%d", &ss.b_no);
		printf("/nEnter the number of floor:");
		scanf("%d",  &ss.f_no);
		printf("/nEnter the number  of room:");
		scanf("%d", &ss.r_no);
		printf("/nEnter the number of students a room can have:");
		scanf("%d", &ss.num);
	}

	if(fwrite(&ss, sizeof(struct abc), 1, fp) != 1){
		printf("write file error press any key to exit....");
		getchar();
		exit(0);
	}

	init(R, ss.b_no, ss.f_no, ss.r_no, ss.num);
	printf("/n/t/tPress any key to the main menu/n");
	getchar();

	do{
		system("clear");
		printf("/n=========================================================================/n");
		printf("/n/t1: input students' information/n");
		printf("/n/t8: output dormitory and students' information/n");
		printf("/n/t0: exit this MIB/n ");

		ch = getchar();
		switch(ch){
			case '1': s_input(S);
					  admeasure(R, S, ss.num);
					  break;
			case '8': output(R, S, ss.num);
					  break;
			case '0': exit(0);
		}
	}while(1);
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值