//物业费管理系统设计
#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);
char YESorNO[N];
do
{
printf("你确定要删除该业主的信息?(YES/NO||yes/no)\n");
scanf(" %s",YESorNO);
getchar();
if (strcmp(YESorNO, "YES")==0||strcmp(YESorNO, "yes")==0)
{
head = DeleteNode(head, DeleteName);
break;
}
else if (strcmp(YESorNO, "NO")==0||strcmp(YESorNO, "no")==0)
{
printf("操作已取消\n");
break;
}
else
{
printf("你的回答有误,请重新输入");
}
} while(strcmp(YESorNO, "YES")!=0&&strcmp(YESorNO, "yes")!=0&&strcmp(YESorNO, "NO")!=0&&strcmp(YESorNO, "no")!=0);
break;
case 4:
if(head==NULL)
{
printf("链表为空");
}
else
{
head=FeeSort(head);
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=p->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,*prr;
link *p=head;
if(NULL == head) //若链表为空则不用排序
{
return NULL;
}
int number=0;
while(p!=NULL)
{
p=p->next;
number++;
}
for(int i=0;i<number;i++)
{
for(p=head,pr=pr->next,prr=head;prr;pr=pr->next,prr=prr->next)
{
if(prr->property<prr->property)
{
char cName[N];//住户信息添加
char cSex[N];//住户性别
char cId[N];//住户身份证号
char cPhone[N];//住户电话号码
int cBuildingNumber=0;//住户所在楼号
int cFloorNumber=0;//住户所在单元号
int cRoomNumber=0;//住户所在房间号
int cSquare=0;//住户房子平米数
int cSquarePrice=0;//该房子每平米均价
int cProperty=0;//应缴纳物业费
char cRemarks[N];//备注
strcpy(cName,p->next->name);
strcpy(pr->next->name,pr->name);
strcpy(pr->name,cName);
strcpy(cSex,p->next->sex);
strcpy(pr->next->sex,pr->sex);
strcpy(pr->sex,cSex);
strcpy(cId,p->next->id);
strcpy(pr->next->id,pr->id);
strcpy(pr->id,cId);
strcpy(cPhone,pr->next->phone);
strcpy(pr->next->phone,pr->phone);
strcpy(pr->phone,cPhone);
cBuildingNumber=pr->next->buildingNumber;
pr->next->buildingNumber=pr->buildingNumber;
pr->buildingNumber=cBuildingNumber;
cFloorNumber=pr->next->floorNumber;
pr->next->floorNumber=pr->floorNumber;
pr->floorNumber=cFloorNumber;
cRoomNumber=pr->next->roomNumber;
pr->next->roomNumber=pr->roomNumber;
pr->roomNumber=cRoomNumber;
cSquare=pr->next->square;
pr->next->square=pr->square;
pr->square=cSquare;
cSquarePrice=pr->next->squarePrice;
pr->next->squarePrice=pr->squarePrice;
pr->squarePrice=cSquarePrice;
cProperty=pr->next->property;
pr->next->property=pr->property;
pr->property=cProperty;
strcpy(cRemarks,pr->next->remarks);
strcpy(pr->next->remarks,pr->remarks);
strcpy(pr->remarks,cRemarks);
}
}
}
return head;
}
void PrintfNode(link* head)
{
link* p = head;
int j = 1;
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>
#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);
char YESorNO[N];
do
{
printf("你确定要删除该业主的信息?(YES/NO||yes/no)\n");
scanf(" %s", YESorNO);
getchar();
if (strcmp(YESorNO, "YES") == 0 || strcmp(YESorNO, "yes") == 0)
{
head = DeleteNode(head, DeleteName);
break;
}
else if (strcmp(YESorNO, "NO") == 0 || strcmp(YESorNO, "no") == 0)
{
printf("操作已取消\n");
break;
}
else
{
printf("你的回答有误,请重新输入");
}
} while (strcmp(YESorNO, "YES") != 0 && strcmp(YESorNO, "yes") != 0 && strcmp(YESorNO, "NO") != 0 && strcmp(YESorNO, "no") != 0);
break;
case 4:
if (head == NULL)
{
printf("链表为空");
}
else
{
head = FeeSort(head);
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));
p->next = NULL; // 修改
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);
getchar(); // 修改
printf("请输入业主性别:");
scanf(" %s", p->sex);
getchar(); // 修改
printf("请输入业主身份证号:");
scanf(" %s", p->id);
getchar(); // 修改
printf("请输入业主电话号码:");
scanf(" %s", p->phone);
getchar(); // 修改
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);
getchar(); // 修改
printf("请输入业主住所每平米数均价:");
scanf(" %d", &sp);
printf("请输入业主目前所需缴纳的物业费:");
scanf(" %d", &pro);
printf("备注:");
scanf(" %s", p->remarks);
getchar(); // 修改
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 = p->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, * prr;
link* p = head;
if (NULL == head) //若链表为空则不用排序
{
return NULL;
}
//int number = 0; 修改
//while (p != NULL) 修改
//{
// p = p->next;
// number++;
//}
for (pr = head; pr->next; pr = pr->next)
//for (int i = 0; i < number; i++) 修改
{
for (p = pr->next; p; p = p->next)
//for(p=head,pr=pr->next,prr=head;prr;pr=pr->next,prr=prr->next)修改
{
if (pr->property < p->property)
{
char cName[N];//住户信息添加
char cSex[N];//住户性别
char cId[N];//住户身份证号
char cPhone[N];//住户电话号码
int cBuildingNumber = 0;//住户所在楼号
int cFloorNumber = 0;//住户所在单元号
int cRoomNumber = 0;//住户所在房间号
int cSquare = 0;//住户房子平米数
int cSquarePrice = 0;//该房子每平米均价
int cProperty = 0;//应缴纳物业费
char cRemarks[N];//备注
strcpy(cName, pr->name); // 修改
strcpy(pr->name, p->name); // 修改
strcpy(p->name, cName); // 修改
strcpy(cSex, pr->sex); // 修改
strcpy(pr->sex, p->sex); // 修改
strcpy(p->sex, cSex); // 修改
strcpy(cId, pr->id); // 修改
strcpy(pr->id, p->id); // 修改
strcpy(p->id, cId); // 修改
strcpy(cPhone, pr->phone); // 修改
strcpy(pr->phone, p->phone);// 修改
strcpy(p->phone, cPhone); // 修改
cBuildingNumber = pr->buildingNumber;// 修改
pr->buildingNumber = p->buildingNumber;// 修改
p->buildingNumber = cBuildingNumber;// 修改
cFloorNumber = pr->floorNumber;// 修改
pr->floorNumber = p->floorNumber;// 修改
p->floorNumber = cFloorNumber;// 修改
cRoomNumber = pr->roomNumber;// 修改
pr->roomNumber = p->roomNumber;// 修改
p->roomNumber = cRoomNumber;// 修改
cSquare = pr->square;// 修改
pr->square = p->square;// 修改
p->square = cSquare;// 修改
cSquarePrice = pr->squarePrice;// 修改
pr->squarePrice = p->squarePrice;// 修改
p->squarePrice = cSquarePrice;// 修改
cProperty = pr->property;// 修改
pr->property = p->property;// 修改
p->property = cProperty;// 修改
strcpy(cRemarks, pr->remarks);// 修改
strcpy(pr->remarks, p->remarks);// 修改
strcpy(p->remarks, cRemarks);// 修改
}
}
}
return head;
}
void PrintfNode(link* head)
{
link* p = head;
int j = 1;
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++;
}
}
每个进程都有自己的栈空间,x86-64的栈向低地址方向增长,而栈栈指针%rsp指向栈顶元素。可以使用pushq和popq(汇编指令)将数据存入栈中或是从栈中取出,将栈指针减小一个适当的量可以为没有指定初始值的数据在站上分配空间。类似地,可以通过增加栈指针来释放空间。当x86-64过程需要的存储空间超出寄存器能够存放的大小时,就会在栈上分配空间。这个部分称为过程的栈帧(stack fram)。
为了提供空间和时间效率,x86-64过程只分配自己所需要的的栈帧部分。例如许多过程有6个或者更少的参数,那么所有的参数都可以通过寄存器传递。因此,上图中画出的某些栈帧部分可以省略。实际上,许多函数甚至根本不需要栈帧。当所有的局部变量都可以保存在寄存器中,而且该函数不会调用任何其他函数(有时称为叶子过程,此时把过程调用功能看做树结构)时,就可以这样处理。