宿舍管理系统 链表 C语言 C++ 数据结构 链表 课程设计.docx
宿舍管理系统 链表 C语言 C+ 数据结构 链表 课程设计#include <stdio.h>#include <stdlib.h>#include <string.h>#include <conio.h>/* 采用双向链表结构,方便添加删除和排序 */typedef struct node /* 定义结构体类型dnode */long id; /* 楼号和房间号,因为一个楼号加一个房间号才能唯一定位一个房间,前两个字节存楼号,后两个字节存房间号 */int area; /* 面积 */int max; /* 所容纳人数 */int current; /* 已入住人数 */struct node *prior,*next; /* 前驱和后继指针 */dnode;dnode* head = NULL;void output_one(dnode* n)/* 输出一条记录 */int lou; int room;room = n->id & 0xffff;lou = n->id >> 16;printf("%dt%dt%dt%dt%dn", lou, room, n->area, n->max,n->current);void output/* 输出所有记录 */dnode* pos = head;if(head = NULL)printf("no recordn");return;printf("loutroomtareatmaxtcurrentn");while (pos)output_one(pos);/* 循环调用output_one */pos = pos->next;void sortint max = 0, i;dnode* pos = head;if(head = NULL)printf("no recordn");return;while(pos)if(pos->current>max)max = pos->current;pos = pos->next;printf("loutroomtareatmaxtcurrentn");for(i=max; i>=0; i-)pos = head;while (pos)if(pos->current = i)output_one(pos);/* 循环调用output_one */pos = pos->next;int insert/* 插入一条数据 */int lou;int room;long louL;dnode* pos = head;dnode* n = malloc(sizeof(dnode);n->prior = NULL;n->next = NULL;/楼号、房间号、面积、所容纳人数、已入住人数printf("building:");scanf("%d", &lou);printf("room:");scanf("%d", &room);printf("area:");scanf("%d", &n->area);printf("max:");scanf("%d", &n->max);printf("current:");scanf("%d", &n->current);louL = lou;louL = louL<<16;n->id = louL + room;if(head=NULL)/* 如果还没有头节点,就作为头节点 */head = n;return 1;while (pos)if(pos->id > n->id)/* 按顺序查找,如果找到比自己大的,就插在它前面 */if(pos->prior)pos->prior->next = n;n->prior = pos->prior;pos->prior = n;if(pos->next)pos->next->prior = n;n->next = pos;if(pos = head)head = n;return 1;else if(pos->id = n->id)free(n);return 0;/* 有重复数据,插入不成功 */if (!pos->next)/* 如果已经到链表尾部,插入到后面 */pos->next = n;n->prior = pos;return 1;pos = pos->next;return 1;int delete/* 删除一条记录 */long id;int lou;int room;dnode* pos = head;printf("building:");scanf("%d", &lou);printf("room:");scanf("%d", &room);id = lou;id <<= 16;id += room;if(head = NULL)printf("no recordn");return 0;while (pos)if(pos->id = id)/* 找到匹配的项,进行删除 */if(pos->prior)pos->prior->next = pos->next;if(pos->next)pos->next->prior = pos->prior;if(pos = head)head = pos->next;free(pos);return 1;pos = pos->next;printf("no recordn");return 0;int amend/* 修改已入住人数 */int count;long id;int lou;int room;dnode* pos = head;printf("building:");scanf("%d", &lou);printf("room:");scanf("%d", &room);printf("current");scanf("%d", &count);id = lou;id <<= 16;id += room;if(head = NULL)printf("no recordn");return 0;while (pos)if(pos->id = id)pos->current = count;return 1;pos = pos->next;printf("no recordn");return 0;void search/* 查找 */long id;int lou;int room;dnode* pos = head;printf("building:");scanf("%d", &lou);printf("room:");scanf("%d", &room);id = lou;id <<= 16;id += room;if(head = NULL)printf("no recordn");return;printf("loutroomtareatmaxtcurrentn");while (pos)if(pos->id = id)output_one(pos);/* 找到就打印 */return;pos = pos->next;printf("no recordn");int mainwhile (1)int select;/clrscr;system("cls");printf("nttt Room manage systemnn");printf("tttt1 add roomn");printf("tttt2 delete roomn");printf("tttt3 edit roomn");printf("tttt4 browse roomn");printf("tttt5 query roomn");printf("tttt6 sort by currentn");printf("tttt0 quitn");fflush(stdin);scanf("%d", &select);switch (select)case 1:insert;break;case 2:delete;break;case 3:amend;break;case 4:output;break;case 5:search;break;case 6:sort;break;case 0:return 0;printf("press any key to continue.n");getch;return 0;