C语言求助,哪位大佬帮我看看这道题?一直搞不清楚

如题所述

第1个回答  2019-12-28
#include <stdio.h>
#include <string.h>
#include <malloc.h>

#define M 3

FILE *fp;
char filename[50] = {""};

typedef struct message {
char name[16];
char telephone[16];
char email[24];
char address[24];
int postcode;
struct message *next;
} *LinkList,*pNode;

void ReadData(pNode p) {
printf("\t姓 名 : ");
scanf("%s",p->name);
printf("\t电话号码 : ");
scanf("%s",p->telephone);
printf("\t邮箱号码 : ");
scanf("%s",p->email);
printf("\t地 址 : ");
scanf("%s",p->address);
printf("\t邮政编码 : ");
scanf("%d",&p->postcode);
}

void ShowLine(int n) {
int i;
for(i = 0; i < n; ++i)
printf("*");
printf("\n");
}

void ShowData(pNode p) {
printf("%-16s",p->name);
printf("%-16s",p->telephone);
printf("%-24s",p->email);
printf("%-24s",p->address);
printf("%-8d\n",p->postcode);
}

void ShowAll(LinkList head) {
pNode p;
ShowLine(88);
for(p = head->next; p; p = p->next)
ShowData(p);
ShowLine(88);
}

LinkList GetEmptyList() {
LinkList head = (pNode)malloc(sizeof(struct message));
head->next = NULL;
head->name[0] = 0;
head->address[0] = 0;
head->postcode = 0;
head->telephone[0] = 0;
head->email[0] = 0;
return head;
}

void Addmember(LinkList head) { // 按telephone增序添加,可用于创建新链表
pNode q,p = (pNode)malloc(sizeof(struct message));
ReadData(p);
q = head;
while(q->next) {
if(strcmp(q->next->telephone,p->telephone) == 0) {
ShowData(p);
printf("\t***** 这个电话号码已经存在。\n");
return;
}
if(strcmp(q->next->telephone,p->telephone) > 0) {
p->next = q->next;
q->next = p;
return;
}
}
q->next = p;
p->next = NULL;
}

pNode SearchName(LinkList head,char name[]) {
pNode p;
if(head == NULL) return NULL;
for(p = head->next; p; p = p->next) {
if(strcmp(p->name,name) == 0) {
ShowData(p);
return p;
}
}
return NULL;
}

pNode SearchTelephone(LinkList head,char telephone[]) {
pNode p;
if(head == NULL) return NULL;
for(p = head->next; p; p = p->next) {
if(strcmp(p->telephone,telephone) == 0) {
ShowData(p);
return p;
}
}
return NULL;
}

void ModifyListName(LinkList head) {
pNode p;
char name[24];
printf("\t被修改人的姓名 : ");
scanf("%s",name);
p = SearchName(head,name);
if(p == NULL) printf("\tXXXXX 没有找到姓名为%s的记录!\n",name);
else {
ShowData(p);
ReadData(p);
}
}

void ModifyListTelephone(LinkList head) {
pNode p;
char telephone[16];
printf("\t被修改的电话号码 : ");
scanf("%s",telephone);
p = SearchTelephone(head,telephone);
if(p == NULL) printf("\t***** 没有找到电话号码为%s的记录!\n",telephone);
else {
ShowData(p);
ReadData(p);
}
}

void ModifyList(LinkList head) {
int select;
do {
printf("\t1、按姓名修改,2、按电话号码修改,0、返回\n");
printf("\t请选择:");
scanf("%d",&select);
switch(select) {
case 1 : ModifyListName(head);
case 2 : ModifyListTelephone(head);
}
}while(select);
}

int EraseTelephone(LinkList head,char telephone[]) { // 删除电话号码为telephone的结点
int an;
pNode p,q;
if(head->next == NULL) {
printf("\t号码本为空。\n");
return 0;
}
for(p = head; p->next; p = p->next) {
if(strcmp(p->next->telephone,telephone) == 0) {
ShowData(p);
printf("\t1.删除, 0.不删除 : ");
scanf("%d",&an);
if(an == 1) {
q = p->next;
p->next = q->next;
free(q);
return 1;
}
else return 0;
}
}
printf("\t***** 没有找到电话号码为%s的记录!\n",telephone);
return 0;
}

void LoadData(LinkList head) { // 传送文件的内容到内存
pNode p,tmp;
int an,flag;
if(filename[0] == '\0') {
printf("\t要传送的数据文件名 : ");
scanf("%s",filename);
}
else {
printf("\t加载文件%s? 1.是,0不是 :",filename);
scanf("%d",&an);
if(an == 1) {
fp = fopen(filename,"rb");
if(fp == NULL) {
printf("\tXXXXX 打开文件%s失败。\n",filename);
return;
}
}
else {
printf("\t文件名 : ");
scanf("%s",filename);
fp = fopen(filename,"rb");
if(fp == NULL) {
printf("\tXXXXX 打开文件%s失败。\n",filename);
return;
}
}
}
if(head->next == NULL) {
p = head;
tmp = (pNode)malloc(sizeof(struct message));
while(fread((void *)tmp,sizeof(struct message),1,fp) == 1) {
p->next = tmp;
p = p->next;
tmp = (pNode)malloc(sizeof(struct message));
}
fclose(fp);
p->next = NULL;
free(tmp);
return;
}
printf("\t1.添加,2.覆盖 : ");
scanf("%d",&an);
if(an == 1) {
tmp = (pNode)malloc(sizeof(struct message));
while(fread(tmp,sizeof(struct message),1,fp) == 1) {
flag = 1;
for(p = head; p->next && flag; p = p->next) {
if(strcmp(p->next->telephone,tmp->telephone) == 0) {
printf("\t***** 因电话号码相同,本条信息未添加:\n");
ShowData(tmp);
flag = 0;
break;
}
if(strcmp(p->next->telephone,tmp->telephone) > 0) {
tmp->next = p->next;
p->next = tmp;
flag = 0;
break;
}
}
if(flag) {
p->next = tmp;
tmp->next = NULL;
}
tmp = (pNode)malloc(sizeof(struct message));
}
fclose(fp);
free(tmp);
return;
}
if(an == 2) {
p = head->next;
while(p) {
tmp = p;
p = p->next;
free(tmp);
}
p = head;
tmp = (pNode)malloc(sizeof(struct message));
while(fread(tmp,sizeof(struct message),1,fp) == 1) {
p->next = tmp;
p = p->next;
tmp = (pNode)malloc(sizeof(struct message));
}
free(tmp);
p->next = NULL;
fclose(fp);
}
}

void SaveData(LinkList head) { // 保存内存到文件
int an;
char mode[5];
pNode p;
if(filename[0] == 0) {
printf("\t请输入文件名 : ");
scanf("%s",filename);
fp = fopen(filename,"wb");
if(fp == NULL) {
printf("\tXXXXX 打开文件%s失败。\n",filename);
return;
}
for(p = head->next; p; p = p->next)
fwrite(p,sizeof(struct message),1,fp);
fclose(fp);
return;
}
else {
printf("\t1.覆盖文件%s\n2.追加文件%s\n3.新建\n4.无操作返回\n",filename,filename);
printf("\t请选择 : ");
scanf("%d",&an);
if(an < 1 || an > 3) return;
if(an == 3) {
printf("\t请输入文件名 : ");
scanf("%s",filename);
fp = fopen(filename,"wb");
if(fp == NULL) {
printf("\tXXXXX 打开文件%s失败。\n",filename);
return;
}
for(p = head->next; p; p = p->next)
fwrite(p,sizeof(struct message),1,fp);
fclose(fp);
return;
}
else {
if(an == 1) strcpy(mode,"wb");
else if(an == 2) strcpy(mode,"ab");
fp = fopen(filename,"wb");
if(fp == NULL) {
printf("\tXXXXX 打开文件%s失败。\n",filename);
return;
}
for(p = head->next; p; p = p->next)
fwrite(p,sizeof(struct message),1,fp);
fclose(fp);
return;
}
}
}

void Sort(LinkList head) { // 按姓名增排序
pNode p,q,pt;
if(head == NULL) return;
p = head;
while(p->next) {
q = p->next->next;
while(q->next) {
if(strcmp(p->next->telephone,q->next->telephone) > 0) {
pt = p->next;
p->next = q->next;
q->next = q->next->next;
p->next->next = pt;
}
else q = q->next;
}
p = p->next;
}
}

void FreeList(LinkList head) {
pNode p = head,q;
while(p) {
q = p;
p = p->next;
free(q);
}
}

void menu(LinkList head) {
int choice;
do {
printf("┌─────────────────────────────────┐\n");
printf("│ │\n");
printf("│ 欢迎使用通讯录管理软件 │\n");
printf("│ │\n");
printf("│ 编写 xoalyg │\n");
printf("│ │\n");
printf("└─────────────────────────────────┙\n");
printf("\n\n\n\n");
printf("\t1、新建\n");
printf("\t2、浏览\n");
printf("\t3、修改\n");
printf("\t4、添加\n");
printf("\t5、排序\n");
printf("\t6、加载\n");
printf("\t7、保存\n");
printf("\t0、退出\n");
printf("\n\t请选择 : ");
scanf("%d",&choice);
switch(choice) {
case 1 : Addmember(head); break;
case 2 : ShowAll(head); break;
case 3 : ModifyList(head); break;
case 4 : Addmember(head); break;
case 5 : Sort(head); break;
case 6 : LoadData(head); break;
case 7 : SaveData(head); break;
}
}while(choice);
}

int main() {
LinkList head = GetEmptyList();
menu(head);
FreeList(head);
return 0;
}
第2个回答  2019-12-28
可以struct创建一个结构体

然后sort排序
代码随后就到.......[大概一小时,请等待]
代码来了~~~
------------------------------------
#include <bits/stdc++.h>
using namespace std;
struct txl
{
string xm="无";//姓名
string xb="无";//性别
string nl="无";//年龄
string dh="无";//电话
} a[51]; //最多50个,下标从1~50
int top=0;
bool cmp(txl x,txl y)
{
if(x.xm=="无")
return 1;
if(y.xm=="无")
return 0;
if(x.dh==y.dh)
return x.xm<y.xm;
return x.dh<y.dh;
}
void jz()
{
if(top==50)
{
cout<<"通讯录已有50人,请删除\n";
return;
}
top++;
cout<<"请输入姓名:";
cin>>a[top].xm;
cout<<"请输入性别(1男,0女):";
int xb;
cin>>xb;
if(xb==1)
a[top].xb="男";
else
a[top].xb="女";
cout<<"请输入年龄:";
cin>>a[top].nl;
cout<<"请输入电话:";
cin>>a[top].dh;
sort(a+1,a+top+1,cmp);
}
void cz()
{
string name;
cout<<"请输入删除者的姓名:";
cin>>name;
for(int i=1; i<=50; i++)
if(a[i].xm==name)
{
a[i].xm="无";
a[i].xb="无";
a[i].nl="无";
a[i].dh="无";
top--;
}
sort(a+1,a+top+1,cmp);
}
void xg()
{
string name,dh;
cout<<"请输入修改者的姓名:";
cin>>name;
cout<<"请输入修改后的电话:";
cin>>dh;
for(int i=1; i<=50; i++)
if(a[i].xm==name)
a[i].dh=dh;
sort(a+1,a+top+1,cmp);
}
void ck()
{
cout<<" 姓名 性别 年龄 电话\n";
for(int i=1; i<=50; i++)
if(a[i].xm!="无")
printf("%8s%6s%6s%11s\n",a[i].xm.c_str(),a[i].xb.c_str(),a[i].nl.c_str(),a[i].dh.c_str());
cout<<"共计 "<<top<<" 人\n";
getchar();
getchar();
}
void sc()
{
ofstream outf;
outf.open("通讯录.xls");
outf<<"姓名\t性别\t年龄\t电话\n";
for(int i=1; i<=50; i++)
if(a[i].xm!="无")
outf<<a[i].xm<<"\t"<<a[i].xb<<"\t"<<a[i].nl<<"\t"<<a[i].dh<<"\n";
outf<<"共计 "<<top<<" 人\n";
outf.close();
cout<<"生成成功!\n";
getchar();
getchar();
}
int main()
{
while(1)
{
system("cls");
cout<<"通讯录创建系统\n 1.新增人员\n 2.删除人员\n 3.修改数据\n 4.查看数据\n 5.生成文件\n>>";
int a;
cin>>a;
if(a==1)
jz();
if(a==2)
cz();
if(a==3)
xg();
if(a==4)
ck();
if(a==5)
sc();
}
return 0;
}本回答被网友采纳
第3个回答  2019-12-28
这是一道C语言的增删改查的链表操作操作的典型题目,同时考察对结构体的理解程度。最简单的就是使用顺序链表做。
第4个回答  2019-12-28
你要问什么?
通讯录用结构体储存数据,下面的操作用指针或者干脆构造函数做都可以啊。
看起来好像没难点

C语言求助,哪位大佬帮我看看这道题?一直搞不清楚
if(a[i].xm!="无") printf("%8s%6s%6s%11s\\n",a[i].xm.c_str(),a[i].xb.c_str(),a[i].nl.c_str(),a[i].dh.c_str()); cout<<"共计 "<<top<<" 人\\n"; getchar(); getchar();}void sc(){ ofstream outf; outf.open("通讯录.xls"); outf<<"姓名\\t性别\\t年龄\\t电话...

求C语言编程大佬帮忙!这道题的逻辑哪里出错了!找了几个小时了没搞明白...
思路如下:这个问题实际上是生成0~9的全排列,然后根据每个数在格子里的位置判断每个排列是否符合要求。百度了一个全排列算法稍做修改,得到以下代码,输出的有效方案数是1580,在我这里输出大约在70ms到100ms左右。百度这个代码排版垃圾得无以复加,vs里面排得好好复制过来全乱,不再重排了。另外,生成...

c语言简单程序题把我搞糊涂了 求大佬解疑
第一张图片:根据优先级,先算++,但由于加加在后面,所以返回加加前的值,也就是7。再算等号,赋值给sum,此时sum就是7。然后轮到逗号,逗号之后是sum自加,得8。然后再到下一个num自加,但跟sum已经没有关系了。所以答案是8。第二张图片:由于括号的原因,等号优先级低,所以先算括号里的值。

哪位大佬能帮看看这道c语言?
a,b都是默认输入升序的数(题目没要求验证,我的代码也不验证,请按升序输入,如需验证升序输入,只需定义一个变量记录输入的数字,并在下次循环输入时比大小。)所以,定义2个指针分别指向a,b最后一个输入的元素地址,嵌套循环,分别往前移动,同时比较两数组元素,每次找到对应位置就将a移位并插入b的...

C语言程序分析题 大佬救救我?
答案:这2段程序不相等。第一段程序的输出结果:1 1 1、2 2 2、3 3 3、4 4 4;第二段程序的输出结果:1 1 1。分析:第一段程序使用for循环,每一次循环时,都对变量进行了初始赋值,即i=1,j=1,k=1。就是说,嵌套的内循环变量,如j,k都是从1开始的。而第二段程序使用while循环,...

这个c语言题目有点难,求大佬帮忙
您好,很高兴回答您的问题。您说的这个问题,难点就在正确使用\/和%这两个符号。c语言中%只能使用在两个整数之间,且得到的结果也只能是整数,表示的是将前者除以后者后得到的余数,所以叫取余符号。\/表示除号,但是用在两个整数之间时,得到的结果也只能是整数。比如1\/2的结果是0,1%2的结果是1。...

C语言题目 求大佬帮看一下
首先说一下题目的答案是:11 程序运行了一下, 截图如下:下面解析一下原因:1、根据判断条件来看,当 k = 10时, while 条件不成立。2、但是需要注意的一点是,在while条件中,使用的是 K++, 而++符号在后面。3、++运算符使用有两种, 先+1在用, 和先使用在+1。而此处使用的明明是后者。4...

c语言问题,麻烦大佬帮忙看看
x是输出十六进制数的意思,故题目需要你进行十六进制运算,不过是把十六进制的194与十进制的18相加而已,可以统一转换进制为十六进制,然后运算,不需要进位。运算过程是:0x194+18==0x194+0x12 而 0x194+0x12==0x1A6。下面的watch框是验算

C语言题目,求大佬解答
被2整除的数有7个,被5整除的数有1个,所以count为8.数组被赋了10个数据,所以K数组的第11个数为0,跳出循环,对应K[10],所以i为10.答案B

c语言题目 求大佬
要分清自增\/自减表达式的值和执行表达式后变量的值的区别。后缀自增\/自减表达式的值就是变量的当前值。例如有变量b=4,则表达式b++的值也是4。执行自增\/自减表达式之后,变量的值变为原值+1\/-1。这称为自增\/自减表达式的副作用。例如有变量b=4,执行表达式b++后,b的值变为5。第一道题求...

相似回答