#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");
}
}