用C语言实现房屋出租管理系统

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_ROOMS 100
#define MAX_HOUSES 1000

struct HouseInfo {
	char ownerName[20];
	char city[20];
	char district[20];
	char community[20];
	char address[20];
	int area;
	char layout[20];
	int price;
	char phone[12];
	int status;
};

struct Node {
	struct HouseInfo data;
	struct Node *next;
};

struct Room {
	char address[50];
	char layout[20];
	int price;
	int rented; // 0-未租,1-已租
};

int num_houses = 0;
struct Room rooms[MAX_ROOMS];
int numRooms = 0;
void menu1();
void menu2();
void addHouse(struct Node *headNode);
void deleteHouse(struct Node *headNode);
void displayAllRooms(struct Node *headNode);
void search_by_address(struct Node *headNode);
void search_by_pattern(struct Node *headNode);
void save(struct Node *headNode);
void show(struct Node *headNode);

//创建链表
struct Node *createList() {
	struct Node *headNode = (struct Node *)malloc(sizeof(struct Node));
	headNode->next = NULL;
	return headNode;
}

//创建节点
struct Node *createNode(struct HouseInfo data) {
	struct Node *newNode = (struct Node *)malloc(sizeof(struct Node));
	newNode->data = data;
	newNode->next = NULL;
	return newNode;
}

int main() {
	struct Node *list = createList();
	show(list);
	int choice;
	do {
		printf("*\t   请选择(输入数字):        *\n");
		printf("*\t     1.我要出租                *\n");
		printf("*\t     2.我要租房                *\n");
		printf("*\t     3.退出系统                *\n");
		scanf("%d", &choice);
		switch (choice) {
			case 1:
				menu1(list);
				break;
			case 2:
				menu2(list);
				break;
			case 3:
				break;
		}
	} while (choice != 3);
	return 0;
}

//把链表数据存入文件
void save(struct Node *headNode) {
	FILE *w;
	if ((w = fopen("allhouse.txt", "a")) == NULL) {
		printf("cannot open file\n");
		exit(1);
	}
	int i;
	for (i = 0; i < numRooms; i++) {
		fprintf(w, "%s", headNode->data.ownerName);
		fprintf(w, "%s", headNode->data.city);
		fprintf(w, " ");
		fprintf(w, "%s", headNode->data.district);
		fprintf(w, " ");
		fprintf(w, "%s", headNode->data.community);
		fprintf(w, " ");
		fprintf(w, "%s", headNode->data.address);
		fprintf(w, " ");
		fprintf(w, "%d", headNode->data.area);
		fprintf(w, " ");
		fprintf(w, "%s", headNode->data.layout);
		fprintf(w, " ");
		fprintf(w, "%d", headNode->data.price);
		fprintf(w, " ");
		fprintf(w, "%s", headNode->data.phone);
		fprintf(w, " ");
		headNode->data.status = 0;
		fprintf(w, "%s", "\r\n");
		headNode = headNode->next;
		fclose(w);
	}
}

//把文件内容保存到结构体数组里,然后再通过数组输出到屏幕上
void show(struct Node *headNode) {
	FILE *fp;//文件指针
	struct HouseInfo  info[1000];
	if ((fp = fopen("allhouse.txt", "r")) == NULL) {
		printf("cannot open file\n");
		exit(1);
	}
	int i = numRooms;
	int a = 7 + i; //提前存入七条租房信息
	while (a > 0) {
		fscanf(fp, "%s", &(info[i].ownerName)); //输出数据到数组
		fscanf(fp, "%s", &(info[i].city));
		fscanf(fp, "%s", &(info[i].district));
		fscanf(fp, "%s", &(info[i].community));
		fscanf(fp, "%s", &(info[i].address));
		fscanf(fp, "%d", &(info[i].area));
		fscanf(fp, "%s", &(info[i].layout));
		fscanf(fp, "%d", &(info[i].price));
		fscanf(fp, "%s", &(info[i].phone));
		fscanf(fp, "%d", &(info[i].status));
		headNode->data = info[i];
		struct Node *newNode = createNode(info[i]); //创建插入的节点
		newNode->next = headNode->next;//先存到链表再存到文件里
		headNode->next = newNode;
		a--;
	}//输出数据到屏幕
	fclose(fp);//关闭文件
}

void addHouse(struct Node *headNode) {
	struct HouseInfo data;
	printf("请输入出租者姓名:");
	scanf("%s", data.ownerName);
	printf("请输入城市:");
	scanf("%s", data.city);
	printf("请输入区:");
	scanf("%s", data.district);
	printf("请输入小区:");
	scanf("%s", data.community);
	printf("请输入门牌号:");
	scanf("%s", data.address);
	printf("请输入房屋面积:");
	scanf("%d", &(data.area));
	printf("请输入房屋格局:");
	scanf("%s", data.layout);
	printf("请输入出租价格:");
	scanf("%d", &(data.price));
	printf("请输入联系电话:");
	scanf("%s", data.phone);
	data.status = 0; // 新房源默认为未租
	struct Node *newNode = createNode(data); //创建插入的节点
	newNode->next = headNode->next;//先存到链表再存到文件里
	headNode->next = newNode;
	numRooms++;
	printf("房源信息已添加成功!\n");
}

//删除已租信息
void deleteHouse(struct Node *headNode) {
	struct Node *p = headNode->next;
	int cnt = 0;
	while (p) {
		if (p->data.status == 1) {
			cnt++;
		}
		p = p->next;
	}
	if (cnt == 0) {
		printf("暂无已租房源信息!\n");
		return;
	}
	if (cnt > 0) {
		printf("以下是已租房源信息:\n");
		struct Node *pMove = headNode->next;
		while (pMove) {
			if (pMove->data.status == 1)
				printf("%s %s %s %s %s %d %s %d", pMove->data.ownerName, pMove->data.city, pMove->data.district, pMove->data.community,
				       pMove->data.address, pMove->data.area, pMove->data.layout, pMove->data.price, pMove->data.phone, pMove->data.price);
			pMove = pMove->next;
		}
		printf("\n");
		printf("请输入要删除的房源价格:");
		int choice;
		scanf("%d", &choice);

		struct Node *posNode = headNode->next;
		struct Node *posNodeFront = headNode;
		numRooms--;


		if (posNode == NULL) {
			printf("无法删除链表为空\n");

		} else {
			while (posNode->data.price != choice) {
				posNodeFront = posNode;
				posNode = posNodeFront->next;
				if (posNode == NULL) {
					printf("没有找到相关信息,无法删除\n");
				}
			}
			posNodeFront->next = posNode->next;
			free(posNode);
		}
	}
}

void menu1(struct Node *headNode) {
	int choice;
	do {
		printf("*\t   请选择(输入数字):        *\n");
		printf("*\t     1.添加房源                *\n");
		printf("*\t     2.删除已租信息            *\n");
		printf("*\t     3.退出系统                *\n");
		scanf("%d", &choice);
		switch (choice) {
			case 1:
				addHouse(headNode);
				break;
			case 2:
				deleteHouse(headNode);
				break;
			case 3:
				break;
			default:
				printf("无效的选项,请重新选择。\n");
				break;
		}
	} while (choice != 3);
}

void menu2(struct Node *headNode) {
	int choice;
	do {
		printf("*\t   请选择(输入数字):        *\n");
		printf("*\t     1.房源信息                *\n");
		printf("*\t     2.查找房源                *\n");
		printf("*\t     3.退出系统                *\n");
		scanf("%d", &choice);
		switch (choice) {
			case 1:
				displayAllRooms(headNode);
				break;
			case 2: {
				int search_choice;
				do {
					printf("****************************************\n");
					printf("*\t   请选择(输入数字):        *\n");
					printf("*\t     1.按地址查找              *\n");
					printf("*\t     2.查房屋格局查找          *\n");
					printf("*\t     3.退出系统                *\n");
					printf("****************************************\n");
					scanf("%d", &search_choice);
					switch (search_choice) {
						case 1:
							search_by_address(headNode);
							break;
						case 2:
							search_by_pattern(headNode);
							break;
						case 3:
							break;
						default:
							printf("无效的选项,请重新选择。\n");
							break;
					}
				} while (search_choice != 3);
			}
			break;
			case 3:
				break;
			default:
				printf("无效的选项,请重新选择。\n");
				break;
		}
	} while (choice != 3);
}

void displayAllRooms(struct Node *headNode) {
	struct Node *pMove = headNode->next;
	while (pMove) {
		if (pMove->data.status == 0)
			printf("姓名:%s  城市:%s  区:%s  小区:%s  门牌号:%s  房屋面积:%d  房屋格局:%s  出租价格:%d  电话:%s\n",
			       pMove->data.ownerName, pMove->data.city, pMove->data.district, pMove->data.community, pMove->data.address,
			       pMove->data.area, pMove->data.layout, pMove->data.price, pMove->data.phone);
		pMove = pMove->next;
	}
	printf("\n");
}

// 按照地址查找房源
void search_by_address(struct Node *headNode) {
	char city[20];
	char district[20];
	printf("请输入城市:");
	scanf("%s", city);
	printf("请输入区:");
	scanf("%s", district);
	struct Node *p;
	for (p = headNode->next; p->next; p = p->next) {
		struct Node *q;
		for (q = p->next; q; q = q->next) {
			if (q->data.price < p->data.price) {
				struct Node *p_next = p->next;
				struct Node *q_next = q->next;
				struct Node t = *p;
				*p = *q;
				*q = t;
				p->next = p_next;
				q->next = q_next;
			}
		}

	}

	for (p = headNode->next; p; p = p->next) {
		if ((p->data.status == 0) && (strcmp(city, p->data.city) == 0) && (strcmp(district, p->data.district) == 0)) {
			printf("地址:%s,格局:%s,价格:%d\n", p->data.address, p->data.layout, p->data.price);

		}

	}

	p = headNode->next;
// 选择并标记租房
	int choice;
	int flag = 0;
	printf("请选择要租的房间的价格:");
	scanf("%d", &choice);
	while (p) {
		if (choice == p->data.price && p->data.status == 0) {
			p->data.status = 1; //标记已租。
			printf("您已成功租赁房间:%s,%s,%d\n", p->data.address, p->data.layout, p->data.price);
			flag = 1;
			break;
		}
		p = p->next;
	}
	if (flag == 0) {
		printf("找不到对应的房间\n");
	}

}

// 按照房屋格局查找房源
void search_by_pattern(struct Node *headNode) {
	char layout[20];
	printf("请输入房屋格局:");
	scanf("%s", layout);
	struct Node *p;
	for (p = headNode->next; p->next; p = p->next) {
		struct Node *q;
		for (q = p->next; q; q = q->next) {
			if (q->data.price < p->data.price) { //从低到高从这里设置
				struct Node *p_next = p->next;
				struct Node *q_next = q->next;
				struct Node t = *p;
				*p = *q;
				*q = t;
				p->next = p_next;
				q->next = q_next;
			}
		}

	}

	for (p = headNode->next; p; p = p->next) {
		if (p->data.status == 0 && (strcmp(layout, p->data.layout) == 0)) {
			printf("地址:%s,格局:%s,价格:%d\n", p->data.address, p->data.layout, p->data.price);
		}

	}

	p = headNode->next;
	// 选择并标记租房
	int choice;
	printf("请选择要租的房间的价格:");
	scanf("%d", &choice);
	int flag = 0;
	while (p) {
		if (p->data.price == choice) {
			p->data.status = 1;
			printf("您已成功租赁房间:%s,%s,%d\n",
			       p->data.address, p->data.layout, p->data.price);
			flag = 1;
			break;
		}
		p = p->next;
	}
	if (flag == 0) {
		printf("找不到对应的房间\n");
	}
}

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT大鸵鸟

你的鼓励是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值