Blue(l'mAlex的迷弟) 2023-12-26 18:23 采纳率: 92.3%
浏览 8
已结题

关于c语言上面的问题


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//定义一个通讯录里面的信息
typedef struct People
{
    char name[20];
    char gender[5];
    int phone;
    char city[30];
    int elp;
}People;

//节点
typedef struct Node
{
    People people;//数据域
    struct Node* pNext;//指针域
}BiTNode,*Node ;
//----------------------------------------------------声明函数-----------------------------------------------
//显示英文提示选单
void Menu();
//退出选单
int Quit();
//创建新的通讯录(初始化链表)
Node create();
//添加
Node add();
//查找
void Find();
//修改
void Alter();
//删除
void Delete();
//显示所有的记录(打印链表)
void List();
//---------------------------------------------开始实施功能-------------------------------------------------------------------------------------

//主函数根据选单的选项调用函数
int main()
{   Node head =0;
    Node s;
    int a;
    int op;
    head=create(head);
    s=head;
    a=1;
    Menu();
    while(a){
        printf("请选择功能\n");
        scanf("%d",&op);
        switch(op)
        {
        case 1://添加
            s=add(s);
            getchar();
            system("cls");
            Menu();
            break;
        case 2://打印
            List(head);
            Menu();
            break;
        case 3://查找
            Find(head);
            getchar();
            system("cls");
            Menu();
            break;
        case 4://修改
            Alter(head);
            getchar();
            system("cls");
            Menu();
            break;
        case 5://删除
            Delete(head);
            getchar();
            system("cls");
            Menu();
            break;
        case 0://退出
            a=Quit();
        }
    }
    return 0;
}


//Menu()函数功能
void Menu(){
    printf("******************************************************\n");
    printf("*              苏苏王专业通讯录                      *\n ");
    printf("*****************************************************\n");
    printf("*              请选择你需要的功能                    *\n");
    printf("*****************************************************\n");
    printf("*\t\t1.添加信息\t\t\t     *\n");
    printf("*\t\t2.打印信息\t\t\t     *\n");
    printf("*\t\t3.查找信息\t\t\t     *\n");
    printf("*\t\t4.修改信息\t\t\t     *\n");
    printf("*\t\t5.删除信息\t\t\t     *\n");
    printf("*\t\t0.退出系统\t\t\t     *\n");
    printf("*****************************************************\n");
}
//链表的初始化
Node create(Node head)
{
    head = (Node)malloc(sizeof(BiTNode));
    (head)->people.elp=0;
    (head)->people.phone=0;
    strcpy((head)->people.city,"NULL");
    strcpy((head)->people.name,"NULL");
    strcpy((head)->people.gender,"NULL");
    return head;
}
//退出功能
int Quit()
{
    return 0;
}
//添加功能
Node add(Node s)
{
    Node p;
    p = (Node)malloc(sizeof(BiTNode));
    s->pNext=p;
    p->pNext=NULL;
    s=p;
    printf("请输入名字:");
    scanf("%s",p->people.name);
    printf("");
    printf("请输入性别:");
    scanf("%s",p->people.gender);
    printf("");
    printf("请输入城市:");
    scanf("%s",p->people.city);
    printf("");
    printf("请输入邮编:");
    scanf("%d",&p->people.elp);
    printf("");
    printf("请输入电话号:");
    scanf("%d",&p->people.phone);
    printf("添加成功!!!!!");
    return s;
}
//打印功能
void List(Node head){
    Node p;
    if(head->pNext!=NULL){
        p=head->pNext;
    while(p!=NULL)
    {
        printf("\t%s\t%s\t%d\t%s\t%d\n",
            p->people.name,
            p->people.gender,
            p->people.phone,
            p->people.city,
            p->people.elp);
            p=p->pNext;
    }
    }
    if(head->pNext==NULL){
        printf("通讯录未有联系人");}
}
//查找功能(按照手机号查找)
void Find(Node head)
{
    Node p;
    int phone;
    printf("请输入联系人的电话号码:");
    scanf("%d",&phone);
    //遍历链表
    p=head;
    while(p!=NULL)
    {
        if(p->people.phone==phone)
        {
            printf("找到了该联系人");
            printf("\t%s\t%s\t%d\t%s\t%d\n",
            p->people.name,
            p->people.gender,
            p->people.phone,
            p->people.city,
            p->people.elp);
            break;
        }
        else
        {
            p=p->pNext;
        }
    }
    if(p==NULL)
    {printf("未寻找到该联系人");}
}
//修改
void Alter(Node head)
{
    Node p;
    int phone;
    printf("请输入联系人的电话号码");
    scanf("%d",&phone);
    //遍历链表
    p=head;
    while(p!=NULL)
    {
        if(p->people.phone==phone)
        {
            printf("请输入名字:");
            scanf("%s",p->people.name);
            printf("");
            printf("请输入性别:");
            scanf("%s",p->people.gender);
            printf("");
            printf("请输入城市:");
            scanf("%s",p->people.city);
            printf("");
            printf("请输入邮编:");
            scanf("%d",&p->people.elp);
            printf("");
            printf("请输入电话号:");
            scanf("%d",&p->people.phone);
            printf("修改成功\n");
            break;
        }
        else
        {
            p=p->pNext;
        }
    }
    if(p==NULL)
    {printf("未寻找到该联系人");}
}
//删除
void Delete(Node head)
{
    Node p;
    int phone;
    printf("请输入联系人的电话号码:");
    scanf("%d",&phone);
    p=head->pNext;
    //遍历链表
    //判断是不是头节点
    //是头节点

    if(head->pNext->people.phone==phone)
    {
        head->pNext=p->pNext;
        free(p);
    }
    //不是头节点
    while(p->pNext!=NULL){
    if(p->pNext->people.phone==phone)
    {
        p->pNext=p->pNext->pNext;
        free(p->pNext);
    }
    else
    {
        p=p->pNext;
    }
    }
    printf("删除成功");
}

这里问题主要有两个地方就是在打印的时候如果只有head节点的时候它打印就会报错而且无法打印那个printf打印函数里面的东西
然后删除功能也有问题说的是内存溢出,我想再加一个把链表送到文件里面然后重新加载的时候读文件不知道怎么办

  • 写回答

5条回答 默认 最新

  • qq_3129192416 2023-12-26 21:00
    关注

    你的代码中有几个问题:
    1.在输出或者删除操作时你只有判断head的下一个结点是否为空,如果不为空你给p赋值了,但是你没处理为空的情况,所以p会成为野指针,所以会出现溢出或者数据乱码的情况。
    你的程序我已经改好了。如果有问题或者没写清楚你提我会追答。如果你需要把数据读写到文件中那我可以给你从头写。

    #define _CRT_SECURE_NO_WARNINGS 1
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include <stdbool.h>
    
    //定义一个通讯录里面的信息
    typedef struct People
    {
        char name[20]; //姓名
        char gender[5]; //性别
        char phone[12]; //手机号(最好是字符串,因为手机号一般是11位,int型不够)
        char city[30]; //城市
        int elp; //邮编
    }People;
    
    //节点
    typedef struct Node
    {
        People people;//数据域
        struct Node* pNext;//指针域
    }BiTNode, * Node;
    
    //----------------------------------------------------声明函数-----------------------------------------------
    //显示英文提示选单
    void Menu();
    //创建新的通讯录(初始化链表)
    Node create(Node head);
    //添加
    bool add(Node head);
    //查找
    bool Find(Node head);
    //修改
    bool Alter(Node head);
    //删除
    bool Delete(Node head);
    //显示所有的记录(打印链表)
    void List(Node head);
    //退出
    void Quit();
    //---------------------------------------------开始实施功能-------------------------------------------------------------------------------------
    
    //主函数根据选单的选项调用函数
    int main()
    {
        Node head = NULL;
        head=create(head);
        int op = 0;
        do {
            Menu();
    retry:  printf("请选择功能:>");
            scanf("%d", &op);
            getchar();
    
            switch (op) {
            case 1://添加
                add(head);
                Quit();
                break;
            case 2://打印
                List(head);
                Quit();
                break;
            case 3://查找
                Find(head);
                Quit();
                break;
            case 4://修改
                Alter(head);
                Quit();
                break;
            case 5://删除
                Delete(head);
                Quit();
                break;
            case 0://退出
                printf("已退出系统...\n");
                break;
            default:
                printf("选择错误,请重新选择!\n");
                //break;
                goto retry;
            }
        } while (op != 0);
    
    
        return 0;
    }
    
    
    //Menu()函数功能
    void Menu() {
        printf("\n");
        printf("******************************************************\n");
        printf("*              苏苏王专业通讯录                      *\n ");
        printf("*****************************************************\n");
        printf("*              请选择你需要的功能                    *\n");
        printf("*****************************************************\n");
        printf("*\t\t1.添加信息\t\t\t     *\n");
        printf("*\t\t2.打印信息\t\t\t     *\n");
        printf("*\t\t3.查找信息\t\t\t     *\n");
        printf("*\t\t4.修改信息\t\t\t     *\n");
        printf("*\t\t5.删除信息\t\t\t     *\n");
        printf("*\t\t0.退出系统\t\t\t     *\n");
        printf("*****************************************************\n");
        printf("\n");
    }
    //链表表头的初始化
    Node create(Node head)
    {
        //给头结点动态开空间
        head = (Node)malloc(sizeof(BiTNode));
    
        //头结点一般不会用于保存数据,所以都初始化为空
        head->pNext = NULL; 
        memset(head->people.name, 0, sizeof(head->people.name));
        memset(head->people.gender, 0, sizeof(head->people.gender));
        memset(head->people.phone, 0, sizeof(head->people.phone));
        memset(head->people.city, 0, sizeof(head->people.city));
        head->people.elp = 0;
        return head;
    }
    //退出功能
    void Quit()
    {
        printf("按任意键返回上一页...\n");
        getchar();
        system("cls");
    }
    //添加功能(头插法)
    bool add(Node head)
    {
        //为新结点动态开辟空间
        Node p = (Node)malloc(sizeof(BiTNode));
        //如果开辟空间失败
        if (p == NULL) {
            printf("无法创建新节点!\n");
            return false;
        }
    
        //利用头插法在新的结点与头结点建立练习
        //即新结点插入在头结点的后面
        p->pNext = head->pNext;
        head->pNext = p;
    
        printf("请输入名字:");
        scanf("%s", p->people.name);
        getchar();
    
        printf("请输入性别:");
        scanf("%s", p->people.gender);
        getchar();
    
        printf("请输入电话号:");
        scanf("%s", &p->people.phone);
        getchar();
    
        printf("请输入城市:");
        scanf("%s", p->people.city);
        getchar();
    
        printf("请输入邮编:");
        scanf("%d", &p->people.elp);
        getchar();
    
        printf("添加成功!!!!!\n");
    
        return true;
    }
    //打印功能
    void List(Node head) {
        Node p = head->pNext;
        if (p == NULL) {
            printf("未找到联系人!\n");
        }
    
        else {
            printf("姓名\t性别\t电话\t城市\t邮编\n");
            int i = 1;
            while (p != NULL) {
                printf("%d: %s\t%s\t%s\t%s\t%d\n",
                    i,
                    p->people.name,
                    p->people.gender,
                    p->people.phone,
                    p->people.city,
                    p->people.elp
                );
    
                p = p->pNext;
            }
        }
    }
    //查找功能(按照手机号查找)
    bool Find(Node head)
    {
        Node p = head->pNext;
        char phone[12];
        int found = 0;
    
        printf("请输入联系人的电话号码:");
        scanf("%s", &phone);
        getchar();
    
        //遍历链表
        while (p != NULL){
            if (strcmp(p->people.phone, phone)==0) {
                printf("找到了该联系人: ");
                printf("%s\t%s\t%s\t%s\t%d\n",
                    p->people.name,
                    p->people.gender,
                    p->people.phone,
                    p->people.city,
                    p->people.elp
                );
                found = 1;
                break;
            }
    
            p = p->pNext;
        }
    
        //未找到
        if (!found) {
            printf("未寻找到该联系人\n");
            return false;
        }
        else return true;
    }
    
    //修改
    bool Alter(Node head)
    {
        Node p = head->pNext;
        char phone[12];
        int found = 0;
    
        printf("请输入联系人的电话号码: ");
        scanf("%s", &phone);
        getchar();
    
        //遍历链表
        p = head;
        while (p != NULL) {
            if (strcmp(p->people.phone,phone)==0) {
                printf("请输入名字: ");
                scanf("%s", p->people.name);
                getchar();
    
                printf("请输入性别: ");
                scanf("%s", p->people.gender);
                getchar();
    
                printf("请输入城市: ");
                scanf("%s", p->people.city);
                getchar();
    
                printf("请输入电话号: ");
                scanf("%s", &p->people.phone);
                getchar();
    
                printf("请输入邮编: ");
                scanf("%d", &p->people.elp);
                getchar();
    
    
                printf("修改成功!\n");
                found = 1;
                break;
            }
    
            p = p->pNext;
        }
    
        //未找到
        if (!found) {
            printf("未寻找到该联系人\n");
            return false;
        }
        else return true;
    }
    //删除
    bool Delete(Node head)
    {
        Node q = head; //记录待删除结点的前一个结点
        Node p = q->pNext;
        char phone[12];
        int found = 0;
    
        printf("请输入联系人的电话号码:");
        scanf("%s", &phone);
        getchar();
    
        while (p != NULL) {
            if (strcmp(p->people.phone, phone) == 0) {
                q->pNext = p->pNext;
                free(p); //释放待删除结点
                found = 1;
                break;
            }
    
            //把指针向后移动
            q = q->pNext;
            p = p->pNext;
        }
    
        //未找到
        if (!found) {
            printf("删除失败!\n");
            return false;
        }
        else return true;
    }
    
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 1月3日
  • 已采纳回答 12月26日
  • 创建了问题 12月26日

悬赏问题

  • ¥15 加装宝马安卓中控改变开机画面
  • ¥15 STK安装问题问问大家,这种情况应该怎么办
  • ¥15 更换了一个新的win10系统,再下载VS时碰到的问题,是C++组件的?
  • ¥15 关于罗技鼠标宏lua文件的问题
  • ¥15 halcon ocr mlp 识别问题
  • ¥15 已知曲线满足正余弦函数,根据其峰值,还原出整条曲线
  • ¥20 无法创建新的堆栈防护界面
  • ¥15 sessionStorage在vue中的用法
  • ¥15 wordpress更换域名后用户图片头像不显示
  • ¥15 如何在ubunto上安装CEF (Chromium Embedded Framework),并且基于qt实现打开一个web