weixin_57274773 2021-10-10 17:14 采纳率: 100%
浏览 36
已结题

通过“1”输入数据后为什么输出和查询出错,而添加进去的数据不会出错?

img

img


通过“1”输入数据后为什么输出和查询出错,而添加进去的数据不会出错,个人认为是输入函数里面哪里出错了,但不知道问题在哪请指出(具体代码放评论里)

#include<stdio.h>
#include<cstdio>
#include<string.h>
#include<vector>
#include<algorithm>
#include<queue>
#include<stack>
#include<math.h>
#include<iomanip>
#include<stdlib.h>
#include<iostream>
#include<list>
using namespace std;
typedef struct              /*员工通讯信息的结构来行定义*/
{
    int number;          /*员工所处序号*/
    char name[50];      /*员工姓名*/
    char phone[50];     /*办公室电话号码*/
    char address[50];      /*手机号码*/
    char mail[50];      /*邮箱*/
}
Datatype,* Data;
typedef struct node         /*通讯录单链表的节点类型*/
{ 
    int length;
    Datatype data;      /*结点数据域*/
    struct node *next;  /*节点的指针域*/
}Listnode,*Linklist;
Linklist q;
Listnode * t = (Listnode *)malloc(sizeof(Listnode));/*记录当前尾节点*/
Linklist l = (Linklist)malloc(sizeof(Listnode));/*链表头节点*/
void menu()
{
    cout << "                    ——————————————————" << endl;
    cout << "                   |       欢迎进入通讯录管理系统       |" << endl;
    cout << "                   |          3119001122  庞钧          |" << endl;
    cout << "                   |                                    |" << endl;
    cout << "                   |          1 录入联系人信息          |" << endl;
    cout << "                   |          2 输出联系人信息          |" << endl;
    cout << "                   |          3 查询联系人信息          |" << endl;
    cout << "                   |          4 修改联系人信息          |" << endl;
    cout << "                   |          5 删除联系人信息          |" << endl;
    cout << "                   |          6 插入联系人信息          |" << endl;
    cout << "                   |          7 退出通讯录管理系统      |" << endl;
    cout << "                   |                                    |" << endl;
    cout << "                    ——————————————————" << endl;
    cout << endl;
    cout << endl;
    cout << "请选择要操作的选项:";
}
void initlist(Linklist &l)/*构建一个空的链表*/
{
    Listnode * p;           
    p = (Listnode *)malloc(sizeof(Listnode));
    p->next = NULL;
    l = p;
}
void write(Linklist &l)/*录入员工信息*/
{
    int n;
    printf("请输入要录入的联系人人数:");
    scanf("%d%*c", &n);
    l->next = NULL;
    l->length = n;
    Listnode *rear = l;
    for (int i = 1; i <= n; i++)
    {
        Listnode *p = (Listnode *)malloc(sizeof(Listnode));
        p->data.number= i;
        printf("第%d位员工的信息:\n", p->data.number);
        printf("姓名:");
        scanf("%*c%s", &p->data.name);
        printf("电话号码:");
        scanf("%*c%s", &p->data.phone);
        printf("地址:"); 
        scanf("%*c%s", &p->data.address); 
        printf("电子邮件:");
        scanf("%*c%s", &p->data.mail);
        p->next = t;
        rear->next = p;
        rear = p;
    }
}
void show(Linklist p)/*显示单个员工信息*/
{
    if (p != NULL&&p != t)
    {
        cout << "[" << p->data.number << "]";
        cout << "姓名:" << std::left << setw(15) << p->data.name;
        cout << "电话号码:" << std::left << setw(15) << p->data.phone << endl;
        cout << "地址:" << std::left << setw(15) << p->data.address;
        cout << "电子邮件:" << std::left << setw(4) << p->data.mail << endl;
    }
}
void display(Linklist l)/*显示员工信息*/
{
    Listnode *p = l->next;
    int n = 0;
    if (l->next == t)
    {
        cout << "当前并无员工信息存入!" << endl;
    }
    else
    {
        for (int i = 1; i <= l->length; i++)
        {
            cout << "[" << p->data.number << "]";
            cout << "姓名:" << std::left << setw(15) << p->data.name;
            cout << "电话号码:" << std::left << setw(15) << p->data.phone << endl;
            cout << "地址:" << std::left << setw(15) << p->data.address;
            cout << "电子邮件:" << std::left << setw(15) << p->data.mail << endl;
            p = p->next;
        }
    }
}
void find(Linklist l)/*按编号查找员工信息*/
{
    char id[50];
    printf("请输入需要查询的联系人姓名:");
    scanf("%s", &id);
    Listnode * p = l;
    if (p->next == t)
    {
        printf("亲,当前并无此数据,无法查找哦!\n");
    }
    else
    {
        for (int j = 0; p != NULL&&strcmp(p->data.name, id) != 0 && j <= l->length; j++)/*strcmp用来比较两个编号是否相同*/
        {
            p = p->next;
        } 
        if (p == t || (p->next == t&&p == l))
        {
            printf("亲,当前并无此数据,无法查找哦!\n");
        }
        else
        {
            show(p);
        }
    }
}
void update(Linklist &l)/*修改员工信息*/
{
    char id[50];
    printf("请输入需要修改的联系人姓名:");
    scanf("%*c%s", &id);
    Listnode * p = l->next;
    if (p == t)
    {
        printf("亲,当前并无此数据,无法删除哦!\n");
    }
    else
    {
        for (int j = 1; (p != l) && (p->next != NULL) && (strcmp(p->data.name, id) != 0) && (j <= l->length); j++)/*strcmp用来比较两个编号是否相同*/
        {
            p = p->next;
        }
        if (p == t || (p->next == t&&p == l))
        {
            printf("亲,当前并无此数据,无法修改哦!\n");
        }
        else
        {
            show(p);
            printf("联系人序号为定值,不可修改\n");
            printf("姓名:");
            scanf("%*c%s", &p->data.name);
            printf("电话号码:");
            scanf("%*c%s", &p->data.phone);
            printf("地址:");
            scanf("%*c%s", &p->data.address);
            printf("电子邮件:");
            scanf("%*c%s", &p->data.mail);
            printf("修改成功!\n");
            show(p);
        }
    }
}
bool remove(Linklist &l)/*删除固定员工信息*/
{
    char id[50];
    printf("请输入需要删除的联系人姓名:");
    scanf("*c%s", &id);
    if (l->next == t)
    {
        printf("亲,当前并无此数据,无法删除哦!");
        return false;
    }
    Listnode * p = l->next;
    Listnode * s = p;
    for (int j = 1; (p != t) && (p != l) && (p->next != NULL) && (strcmp(p->data.name, id) != 0) && (j <= l->length); j++)/*strcmp用来比较两个编号是否相同*/
    {
        s = p;
        p = p->next;
    }
    if (p==l)
    {
        printf("亲,当前并无此数据,无法删除哦!");
        return false;
    }
    else
    {
        show(p);
        Listnode * q = p->next;
        s->next = q;
        l->length--;
        if (p == l->next&&p->next == t)
        {
            ;
        }
        else
        {
            for (; p != t; p = p->next)
            {
                p->data.number--;
            }
        }
        free(p);
        return true;
    }
}
bool insert(Linklist &l)/*插入员工信息*/
{
    Listnode *p = l;
    if (l->length == 0)
    {
        p = l;
    }
    else
    {
        while (p->next != t)
        {
            p = p->next;
        }
    }
    if (p==l||p->next == t)
    {
        Listnode * s = (Listnode *)malloc(sizeof(Listnode));
        l->length++;
        printf("请按照提示输入新增员工信息:\n");
        s->data.number = l->length;
        printf("第%d位员工的信息:\n", s->data.number);
        printf("姓名:");
        scanf("%*c%s", &s->data.name);
        printf("电话号码:");
        scanf("%*c%s", &s->data.phone);
        printf("地址:");
        scanf("%*c%s", &s->data.address);
        printf("电子邮件:");
        scanf("%*c%s", &s->data.mail);
        p->next = s;
        s->next = t;/*记录当前尾节点*/
        return true;
    }
    else
    {
        printf("当前数据为空,请执行第一步之后重试!\n");
        return false;
    }
}
void exit()
{
    cout << "                   ★-----★---------★---------★-----★" << endl;
    cout << endl;
    cout << "                   ☆            感谢您的使用!        ☆" << endl;
    cout << endl;
    cout << "                   ★-----★---------★---------★-----★" << endl;
    cout << endl;
}
int main()
{
    string order;
    l->next = t;
    l->length = 0;
    t->next = NULL;
    char*end;/*末端指针*/
    menu();
    while (cin>>order)
    {
        int a_order = static_cast<int>(strtol(order.c_str(), &end, 10));/*将输入进来的值转化为int类型*/
        switch (a_order + 48)
        {
        case'1':
        {

                   write(l);/*录入员工信息*/
                   system("pause");
                   system("cls");
                   menu();
                   break;
        }
        case'2':
        {
                   display(l);/*输出员工信息*/
                   system("pause");
                   system("cls");
                   menu();
                   break;
        }
        case'3':
        {
                   find(l);/*查询员工信息*/
                   system("pause");
                   system("cls");
                   menu();
                   break;
        }
        case'4':
        {
                   update(l);/*修改员工信息*/
                   system("pause");
                   system("cls");
                   menu();
                   break;
        }
        case'5':
        {
                   bool falg5 = remove(l);/*删除员工信息*/
                   if (falg5)
                   {
                       printf("删除员工信息成功o(^▽^)o!\n");
                   }
                   else
                   {
                       printf("删除员工信息失败( ▼-▼ )\n");
                   }
                   system("pause");
                   system("cls");
                   menu();
                   break;
        }
        case'6':
        {
                   bool falg6 = insert(l);/*插入员工信息*/
                   if (falg6)
                   {
                       printf("添加员工信息成功o(^▽^)o!\n");
                   }
                   else
                   {
                       printf("添加员工信息失败( ▼-▼ )\n");
                   }
                   system("pause");
                   system("cls");
                   menu();
                   break;
        }
        case'7':
        {
                   system("cls");
                   exit();
                   return 0;
                   break;
        }
        default:
        {
                   cin.clear();
                   cin.sync();
                   cout << "输入错误,重新返回主界面。" << endl;
                   system("pause");
                   system("cls");
                   menu();
                   break;
        }
        }
    }
    return 0;
}

  • 写回答

1条回答 默认 最新

  • CSDN专家-link 2021-10-10 17:15
    关注

    scanf("%*c%s", &p->data.name);
    字符串输入不需要加&符号

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月18日
  • 已采纳回答 10月10日
  • 修改了问题 10月10日
  • 创建了问题 10月10日

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵