关于#C语言链表排序#的问题,如何解决?

img

img

img

img

结构体里交换数据进行排序,在程序框选择排序这个选项后就没反应了,求告诉哪里出了问题

能以代码块的形式提交一下完整代码吗?这样我可以帮您调试一下


//物业费管理系统设计
#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++;
    }
}
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7777082
  • 你也可以参考下这篇文章:C 编写一个C程序,要求采用模块化设计思想,将相关功能用函数实现,并提供菜单选项,每次程序运行结束后需通过功能0退出程序。该程序具有以下功能:
  • 除此之外, 这篇博客: C语言预处理详解中的 当宏参数在宏的定义中出现超过一次的时候,如果参数带有副作用,那么你在使用这个宏的时候就可能出现危险,导致不可预测的后果。副作用就是表达式求值的时候出现的永久性效果 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    #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;
    }
  • 您还可以看一下 李老师老师的C语言版数据结构入门课程中的 数据结构入门简介小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    针对问题,排查程序不响应的原因可能是代码中存在死循环或者内存泄漏等问题,具体如下所示:

    1. 检查排序算法是否存在死循环或者无限递归的情况,这可能导致程序无法响应。可以通过加入计数器和超时机制等方式来检测和解决这种问题。

    2. 内存泄漏会导致程序消耗过多的内存资源,最终导致程序无法响应。可以通过内存泄漏检测工具(如Valgrind)来检查程序是否存在内存泄漏问题,并且及时释放动态分配的内存空间。

    3. 可以考虑在程序中加入日志和调试信息,以便更好地定位和解决问题。同时,利用调试工具和断点等功能,可以逐步排查问题,找到和解决代码中的潜在问题。

    4. 可以使用一些排序算法库或者现成的排序函数替换自己编写的排序算法,这些函数已经经过充分测试和验证,可以避免自己编写算法中的一些潜在问题。例如,可以使用qsort函数对链表进行排序。

    在解决问题的过程中,可以参考上述参考资料提供的知识点,特别是指针和数组的概念和用法,以便更好地理解代码中的问题和解决方案。具体解决方案需要根据具体问题和代码进行评估和调整。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^