结构体里交换数据进行排序,在程序框选择排序这个选项后就没反应了,求告诉哪里出了问题
能以代码块的形式提交一下完整代码吗?这样我可以帮您调试一下
//物业费管理系统设计
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 100
typedef struct link
{
char name[N];//住户信息添加
char sex[N];//住户性别
char id[N];//住户身份证号
char phone[N];//住户电话号码
int buildingNumber;//住户所在楼号
int floorNumber;//住户所在单元号
int roomNumber;//住户所在房间号
int square;//住户房子平米数
int squarePrice;//该房子每平米均价
int property;//应缴纳物业费
char remarks[N];//备注
struct link* next;
}link;
link* AppendNode(link* head);//添加
link* ModifyNode(link* head, char ModifyName[N]);//修改
link* DeleteNode(link* head, char DeeteName[N]);//删除
void NowFee(link* head, char FeeName[N]);// 初始物业费
void NewFee(link* head, char FeeName[N]);//新的物业费
void Menu();//菜单
void MenuText(link* head);//菜单
void Modify();//修改
void ModifyText(link* p, link* pr);//修改
link* FeeSort(link* head); //排序
void PrintfNode(link* head);//打印
int main(void)
{
link* head = NULL;
MenuText(head);
return 0;
}
void Menu()
{
printf("——————————————————————————\n");
printf("请选择你将进行的操作:\n");
printf("1.输入新业主信息 2.修改业主信息\n");
printf("3.删除业主信息 4.显示业主物业费缴纳情况\n");
printf("5.缴纳费用 6.退出系统\n");
printf("——————————————————————————\n");
}
void MenuText(link* head)
{
int number;
number = 0;
while (number != -1)
{
Menu();
scanf("%d", &number);
switch (number)
{
case 1:
printf("请输入新业主信息:\n");
head = AppendNode(head);
break;
case 2:
printf("请输入你要修改的业主姓名:\n");
char ModifyName[N];
scanf("%s",&ModifyName);
head = ModifyNode(head, ModifyName);
break;
case 3:
printf("请输入你要删除的业主姓名:\n");
char DeleteName[N];
scanf("%s",&DeleteName);
printf("你确定要删除该业主的信息?(YES/NO||yes/no)\n");
char YESorNO[N];
scanf(" %s",&YESorNO);
do
{
if (strcmp(YESorNO, "YES") || strcmp(YESorNO, "yes"))
{
head = DeleteNode(head, DeleteName);
break;
}
else if (strcmp(YESorNO, "NO") || strcmp(YESorNO, "no"))
{
printf("操作已取消\n");
break;
}
else
{
printf("你的回答有误,请重新输入");
}
} while (strcmp(YESorNO, "YES") != 0 || strcmp(YESorNO, "NO") != 0 || strcmp(YESorNO, "yes") != 0 || strcmp(YESorNO, "no") != 0);
case 4:
PrintfNode(head);
break;
case 5:
printf("请输入要缴费的业主姓名:");
char FeeName[N];
scanf("%s",&FeeName);
NowFee(head, FeeName);
NewFee(head, FeeName);
NowFee(head, FeeName);
break;
case 6:
exit(0);
default:
if (number != -1)
{
printf("你选择的操作不存在,请重新输入");
}
else
{
printf("你选择的操作不存在,请重新输入");
number = 0;
}
break;
}
}
}
link* AppendNode(link* head)
{
int b,f,r;
int s,sp,pro;
link* p = NULL;
link* pr = head;
p = (link*)malloc(sizeof(link));
if (p == NULL)
{
printf("抱歉,内存不足,无法进行分配");
exit(0);
}
if (head == NULL)
{
head = p;
}
else
{
while (pr->next != NULL)
{
pr = pr->next;
}pr->next = p;
}
printf("业主的姓名:");
scanf("%s", p->name);
printf("请输入业主性别:");
scanf(" %s", p->sex);
printf("请输入业主身份证号:");
scanf(" %s", p->id);
printf("请输入业主电话号码:");
scanf(" %s", p->phone);
printf("请输入业主住所楼号,单元号,房间号:");
scanf(" %d,%d,%d",&b,&f,&r);
if(b==0||f==0||r==0)
{
printf("你输入的信息有误,请重新输入业主所在楼号,单元号,房间号:\n");
scanf(" %d,%d,%d", &b,&f,&r);
}
printf("请输入业主住所大小:");
scanf(" %d", &s);
printf("请输入业主住所每平米数均价:");
scanf(" %d", &sp);
printf("请输入业主目前所需缴纳的物业费:");
scanf(" %d", &pro);
printf("备注:");
scanf(" %s", p->remarks);
p->buildingNumber=b;
p->floorNumber=f;
p->roomNumber=r;
p->square=s;
p->squarePrice=sp;
p->property=pro;
return head;
}
link *ModifyNode(link* head, char ModifyName[N])
{
link* p = head;
link* pr = head;
while (strcmp(ModifyName, p->name) != 0 && p->next != NULL)
{
pr = p;
p = pr->next;
}
if (strcmp(ModifyName, p->name) == 0)
{
printf("你将对");
printf(p->name);
printf("的信息进行修改\n");
ModifyText(p, pr);
}
else
{
printf("对不起,未找到该业主的信息\n");
}
return head;
}
void Modify()
{
printf("————————————————————————————————\n");
printf("请选择要修改的部分\n");
printf("1.姓名 2.性别 3.身份证号\n");
printf("4.电话号码 5.住所楼号,单元号,房间号 6.住所大小\n");
printf("7.住所每平米数均价 8.所需缴纳的物业费 9.备注\n");
printf("0.退出修改\n");
printf("————————————————————————————————\n");
}
void ModifyText(link* p, link* pr)
{
int mdf = -2;
char NewName[N];//住户信息添加
char NewSex[N];//住户性别
char NewId[N];//住户身份证号
char NewPhone[N];//住户电话号码
int NewBuildingNumber=0;//住户所在楼号
int NewFloorNumber=0;//住户所在单元号
int NewRoomNumber=0;//住户所在房间号
int NewSquare=0;//住户房子平米数
int NewSquarePrice=0;//该房子每平米均价
int NewProperty=0;//应缴纳物业费
char NewRemarks[N];//备注
while (mdf != -1 && mdf != 0)
{
Modify();
scanf(" %d", &mdf);
switch (mdf)
{
case 1:
printf("请输入新的名字:");
scanf(" %s",NewName);
strcpy(p->name,NewName); break;
case 2:
printf("请输入新的性别:");
scanf(" %c",NewSex);
strcpy(p->sex,NewSex); break;
case 3:
printf("请输入新的身份证号:");
scanf(" %s",NewId);
strcpy(p->id,NewId); break;
case 4:
printf("请输入新的电话号码:");
scanf(" %s",NewPhone);
strcpy(p->phone,NewPhone); break;
case 5:
printf("请输入新的住所楼号单元号房间号:");
scanf(" %d,%d,%d",&NewBuildingNumber, &NewFloorNumber, &NewRoomNumber);
p->buildingNumber = NewBuildingNumber;
p->floorNumber = NewFloorNumber;
p->roomNumber = NewRoomNumber; break;
case 6:
printf("请输入新的房子平米数:");
scanf(" %d",&NewSquare);
p->square = NewSquare; break;
case 7:
printf("请输入新的房子每平米均价:");
scanf(" %d",&NewSquarePrice);
p->squarePrice = NewSquarePrice; break;
case 8:
printf("请输入新的应缴纳物业费:");
scanf(" %d",&NewProperty);
p->property = NewProperty; break;
case 9:
printf("请输入新的备注:");
scanf(" %s",&NewRemarks);
strcpy(p->remarks,NewRemarks); break;
case 0: break;
default:
if (mdf!= -1)
{
printf("你选择的操作不存在,请重新输入");
}
else
{
printf("你选择的操作不存在,请重新输入");
mdf = -2;
}break;
}
}
printf("修改结束\n");
}
link* DeleteNode(link* head, char DeleteName[N])
{
link* p = head;
link* pr = head;
if (head == NULL)
{
printf("对不起,你的系统内没有数据");
return head;
}
while (strcmp(p->name, DeleteName) != 0 && p->next != NULL)
{
pr = p;
p->next = pr->next;
}
if (strcmp(p->name, DeleteName) == 0)
{
if (p == head)
{
head = p->next;
}
else
{
pr->next = p->next;
}
free(p);
}
else
{
printf("对不起,未找到该业主信息");
}
return head;
}
void NowFee(link* head, char FeeName[N])
{
link* p = head;
link* pr = head;
if (head == NULL)
/*{
printf("对不起,你的系统内没有数据");
}*/
while (strcmp(p->name, FeeName) != 0 && p->next != NULL)
{
pr = p;
p->next = pr->next;
}
if (strcmp(p->name, FeeName) == 0)
{
printf("%d", p->property);
}
if (p->property != 0)
{
printf(" 该业主未缴清物业费用\n");
}
else
{
printf(" 该业主已经缴清物业费用\n");
}
}
void NewFee(link* head, char FeeName[N])
{
link* p = head;
link* pr = head;
if (head == NULL)
{
printf("对不起,你的系统内没有数据");
}
while (strcmp(p->name, FeeName) != 0 && p->next != NULL)
{
pr = p;
p->next = pr->next;
}
if (strcmp(p->name, FeeName) == 0)
{
printf("%s业主,是否进行缴费?(YES/NO||yes/no)\n", FeeName);
char answer[N];
while (strcmp(answer, "YES") != 0 || strcmp(answer, "NO") != 0 || strcmp(answer, "yes") != 0 || strcmp(answer, "no") != 0)
{
scanf(" %s", &answer);
if (strcmp(answer, "YES") == 0 || strcmp(answer, "yes") == 0)
{
p->property = 0;
if (p->property == 0)
{
printf("缴费成功\n");
break;
}
}
else if (strcmp(answer, "NO") == 0 || strcmp(answer, "no") == 0)
{
printf("缴费取消\n");
break;
}
else
{
printf("你的回答有误,请重新输入\n");
}
}
}
}
link *FeeSort(link *head)
{
link* pr=head;
link* prr=NULL;
if(pr==NULL)
{
printf("对不起,你的系统内没有数据");
return head;
}
while(pr->next!=NULL)
{
for(prr=pr->next;prr!=NULL;prr=prr->next)
{
if(pr->property>prr->property)
{
char cName[N];//住户信息添加
char cSex[N];//住户性别
char cId[N];//住户身份证号
char cPhone[N];//住户电话号码
int cBuildingNumber;//住户所在楼号
int cFloorNumber;//住户所在单元号
int cRoomNumber;//住户所在房间号
int cSquare;//住户房子平米数
int cSquarePrice;//该房子每平米均价
int cProperty;//应缴纳物业费
char cRemarks[N];//备注
strcpy(cName,pr->name);
strcpy(pr->name,prr->name);
strcpy(prr->name,cName);
strcpy(cSex,pr->sex);
strcpy(pr->sex,prr->sex);
strcpy(prr->sex,cSex);
strcpy(cId,pr->id);
strcpy(pr->id,prr->id);
strcpy(prr->id,cId);
strcpy(cPhone,pr->phone);
strcpy(pr->phone,prr->phone);
strcpy(prr->phone,cPhone);
cBuildingNumber=pr->buildingNumber;
pr->buildingNumber=prr->buildingNumber;
prr->buildingNumber=cBuildingNumber;
cFloorNumber=pr->floorNumber;
pr->floorNumber=prr->floorNumber;
prr->floorNumber=cFloorNumber;
cRoomNumber=pr->roomNumber;
pr->roomNumber=prr->roomNumber;
prr->roomNumber=cRoomNumber;
cSquare=pr->square;
pr->square=prr->square;
prr->square=cSquare;
cSquarePrice=pr->squarePrice;
pr->squarePrice=prr->squarePrice;
prr->squarePrice=cSquarePrice;
cProperty=pr->property;
pr->property=prr->property;
prr->property=cProperty;
strcpy(cRemarks,pr->remarks);
strcpy(pr->remarks,prr->remarks);
strcpy(prr->remarks,cRemarks);
}
}
pr=pr->next;
}
return head;
}
void PrintfNode(link* head)
{
link* p = head;
int j = 1;
FeeSort(head);
while (p != NULL)
{
printf("%d %s %s %s %s%5d栋%d层%d%5d%5d%5d %s\n", j, p->name, p->sex, p->id, p->phone, p->buildingNumber, p->floorNumber, p->roomNumber, p->square, p->squarePrice, p->property, p->remarks);
p = p->next;
j++;
}
}
不知道你这个问题是否已经解决, 如果还没有解决的话:#include<stdio.h>
//x + 1;//不带副作用
//x++;//带有副作用
#define MAX(a, b) ((a) > (b) ? (a) : (b))
int main()
{
int x = 5;
int y = 8;
int z = MAX(x++, y++);
printf("x=%d y=%d z=%d\n", x, y, z);//输出的结果是什么?
return 0;
}
针对问题,排查程序不响应的原因可能是代码中存在死循环或者内存泄漏等问题,具体如下所示:
检查排序算法是否存在死循环或者无限递归的情况,这可能导致程序无法响应。可以通过加入计数器和超时机制等方式来检测和解决这种问题。
内存泄漏会导致程序消耗过多的内存资源,最终导致程序无法响应。可以通过内存泄漏检测工具(如Valgrind)来检查程序是否存在内存泄漏问题,并且及时释放动态分配的内存空间。
可以考虑在程序中加入日志和调试信息,以便更好地定位和解决问题。同时,利用调试工具和断点等功能,可以逐步排查问题,找到和解决代码中的潜在问题。
可以使用一些排序算法库或者现成的排序函数替换自己编写的排序算法,这些函数已经经过充分测试和验证,可以避免自己编写算法中的一些潜在问题。例如,可以使用qsort函数对链表进行排序。
在解决问题的过程中,可以参考上述参考资料提供的知识点,特别是指针和数组的概念和用法,以便更好地理解代码中的问题和解决方案。具体解决方案需要根据具体问题和代码进行评估和调整。