当前位置:文档之家› 宿舍管理系统 链表 C语言 C++ 数据结构 链表 课程设计

宿舍管理系统 链表 C语言 C++ 数据结构 链表 课程设计

#include
#include
#include
#include

/* 采用双向链表结构,方便添加删除和排序 */

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("%d\t%d\t%d\t%d\t%d\n", lou, room, n->area, n->max,n->current);
}

void output() /* 输出所有记录 */
{
dnode* pos = head;

if(head == NULL)
{
printf("no record\n");
return;
}

printf("lou\troom\tarea\tmax\tcurrent\n");
while (pos)
{
output_one(pos); /* 循环调用output_one */
pos = pos->next;
}
}

void sort()
{
int max = 0, i;
dnode* pos = head;
if(head == NULL)
{
printf("no record\n");
return;
}

while(pos)
{
if(pos->current>max)
max = pos->current;
pos = pos->next;
}

printf("lou\troom\tarea\tmax\tcurrent\n");
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 record\n");
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 record\n");
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 record\n");
return 0;
}

while (pos)
{
if(pos->id == id)
{
pos->current = count;
return 1;
}
pos = pos->next;
}
printf("no record\n");
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 record\n");
return;
}

printf("lou\troom\tarea\tmax\tcurrent\n");
while (pos)
{
if(pos->id == id)
{
output_one(pos); /* 找到就打印 */
return;
}
pos = pos->next;
}
printf("no record\n");
}

int main()
{
while (1)
{
int select;
//clrscr();
system("cls");
printf("\n\t\t\t Room manage system\n\n");
printf("\t\t\t\t1 add room\n");
printf("\t\t\t\t2 delete room\n");
printf("\t\t\t\t3 edit room\n");
printf("\t\t\t\t4 browse room\n");
printf("\t\t\t\t5 query room\n");
printf("\t\t\t\t6 sort by current\n");
printf("\t\t\t\t0 quit\n");
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;
}


相关主题
文本预览
相关文档 最新文档