通过“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;
}