孤世星辰 发表于 2021-5-11 19:54:44

这个函数哪里错了

本帖最后由 孤世星辰 于 2021-5-13 09:18 编辑


#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct Call
{
      char name;
      int phone;
      struct Call *next;
};

void getInput(struct Call *call);
void addPerson(struct Call **head);
struct Call *findPerson(struct Call *head);
void displayContacts(struct Call *head);
void printPerson(struct Call *call);
void changePerson(struct Call *head);
void delPerson(struct Call **head);
void getInput(struct Call *call)
{
      printf("请输入姓名:");
      scanf("%s",call->name);
      printf("请输入电话:");
      scanf("%d",call->phone);
}
void addPerson(struct Call **head)
{
      struct Call *call,*temp;
      static struct Call *tail;
      call=(struct Call *)malloc(sizeof(struct Call));
      if(call==NULL)
      {
                printf("内存分配失败!\n");
                exit(1);
      }
      getInput(call);
      if(*head!=NULL)
      {
                tail->next=call;
                call->next=NULL;
      }
      else
      {
                *head=call;
                call->next=NULL;
      }
      tail=call;
}
struct Call *findPerson(struct Call *head)
{
      struct Call *call;
      char input;
      call=head;
      printf("请输入要查找的姓名:");
      scanf("%s",input);
      while(call!=NULL)
      {
                if(!strcmp(call->name,input)||call!=NULL)
                {
                        break;
                }
                call=call->next;
      }
      return call;
}
void displayContacts(struct Call *head)
{
      struct Call *call;
      int count=1;
      while(call != NULL)
      {
                printf("第%d位联系人",count);
                printf("姓名:%s\n",call->name);
                printf("电话:%d\n",call->phone);
                call=call->next;
                count++;
      }
}
void printPerson(struct Call *call)
{
      printf("姓名:%s",call->name);
      printf("电话:%d",call->phone);
}
void changePerson(struct Call *head)
{
      struct Call *call;
      call=findPerson(head);
      if(call==NULL)
      {
                printf("找不到!\n");
      }
      else
      {
                printf("请输入新的号码:");
                scanf("%s",call->phone);
      }
}
void delPerson(struct Call **head)
{
      struct Call *call;
      struct Call *temp;
      struct Call *pre;
      struct Call *current;
      call=findPerson(*head);
      if(call==NULL)
      {
                printf("没找到!\n");
      }
      else
      {
                current=*head;
                pre=NULL;
                while(current!=NULL&&current!=call)
                {
                        pre=current;
                        current=current->next;
                }
                if(pre==NULL)
                {
                        *head=current->next;
                }
                else
                {
                        pre->next=current->next;
                }
                free(call);
      }
}
void releaseContacts(struct Call **head)
{
      struct Call *temp;
      while(head!=NULL)
      {
                temp=*head;
                *head=(*head)->next;
                free(temp);
      }
}
main(void)
{
      struct Call *head=NULL;
      struct Call *call;
      int input;
      printf("| 欢迎使用通讯录管理程序 |\n");
      printf("|--- 1:插入新的联系人--- |\n");
      printf("|--- 2:查找新的联系人--- |\n");
      printf("|--- 3:更改新的联系人--- |\n");
      printf("|--- 4:删除新的联系人--- |\n");
      printf("|--- 5:显示新的联系人--- |\n");
      printf("|--- 6:退出新的联系人--- |\n");
      while(1)
      {
                printf("\n请输入代码指令:");
                scanf("%d",&input);
                switch(input)
                {
                        case 1:addPerson(&head); break;
                        case 2:findPerson(head);
                              if(call==NULL)
                              {
                                        printf("找不到!\n");
                               }
                              else
                              {
                                        printPerson(call);
                              }
                              break;
                        case 3:changePerson(head);break;
                        case 4:delPerson(&head);break;
                        case 5:displayContacts(head);break;
                        case 6:goto END;
                }
      }
END:
      releaseContacts(&head);

      return 0;

yuxijian2020 发表于 2021-5-12 10:00:32

代码整个发出来

人造人 发表于 2021-5-12 11:20:04

你只贴一个代码片段,是肯定这段代码有问题?
就算是你肯定,问题是我们不知道 struct Call 这个结构体的内容
不知道这个数据结构的创建和销毁方法,简单来说就是不了解这个数据结构的物理布局和逻辑布局
如果要帮你解决问题,只有两种方法
1. 完全靠猜
2. 问你要完整的代码

孤世星辰 发表于 2021-5-13 09:18:37

yuxijian2020 发表于 2021-5-12 10:00
代码整个发出来

发了发了,大佬给看一下

孤世星辰 发表于 2021-5-13 09:19:07

人造人 发表于 2021-5-12 11:20
你只贴一个代码片段,是肯定这段代码有问题?
就算是你肯定,问题是我们不知道 struct Call 这个结构体的 ...

错了错了,我发了

yuxijian2020 发表于 2021-5-13 09:57:01

麻烦你把所有的变量初始化一遍

孤世星辰 发表于 2021-5-13 10:41:23

yuxijian2020 发表于 2021-5-13 09:57
麻烦你把所有的变量初始化一遍


      struct Call *call=NULL;
      struct Call *temp=NULL;
      struct Call *pre=NULL;
      struct Call *current=NULL;
是这样么

人造人 发表于 2021-5-13 11:11:55

你这个代码的问题也太多了吧,有认真检查代码吗

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct Call
{
    char name;
    int phone;
    struct Call *next;
};

void getInput(struct Call *call);
void addPerson(struct Call **head);
struct Call *findPerson(struct Call *head);
void displayContacts(struct Call *head);
void printPerson(struct Call *call);
void changePerson(struct Call *head);
void delPerson(struct Call **head);
void getInput(struct Call *call)
{
    printf("请输入姓名:");
    scanf("%s",call->name);
    printf("请输入电话:");
    scanf("%d",call->phone);
}
void addPerson(struct Call **head)
{
    //struct Call *call,*temp;
    struct Call *call;
    static struct Call *tail;
    call=(struct Call *)malloc(sizeof(struct Call));
    if(call==NULL)
    {
      printf("内存分配失败!\n");
      exit(1);
    }
    getInput(call);
    if(*head!=NULL)
    {
      tail->next=call;
      call->next=NULL;
    }
    else
    {
      *head=call;
      call->next=NULL;
    }
    tail=call;
}
struct Call *findPerson(struct Call *head)
{
    struct Call *call;
    char input;
    call=head;
    printf("请输入要查找的姓名:");
    scanf("%s",input);
    while(call!=NULL)
    {
      if(!strcmp(call->name,input)||call!=NULL)
      {
            break;
      }
      call=call->next;
    }
    return call;
}
void displayContacts(struct Call *head)
{
    //struct Call *call;
    struct Call *call = head;
    int count=1;
    while(call != NULL)
    {
      printf("第%d位联系人",count);
      printf("姓名:%s\n",call->name);
      //printf("电话:%d\n",call->phone);
      printf("电话:%d\n", *call->phone);
      call=call->next;
      count++;
    }
}
void printPerson(struct Call *call)
{
    printf("姓名:%s",call->name);
    //printf("电话:%d",call->phone);
    printf("电话:%d", *call->phone);
}
void changePerson(struct Call *head)
{
    struct Call *call;
    call=findPerson(head);
    if(call==NULL)
    {
      printf("找不到!\n");
    }
    else
    {
      printf("请输入新的号码:");
      //scanf("%s",call->phone);
      scanf("%d",call->phone);
    }
}
void delPerson(struct Call **head)
{
    struct Call *call;
    //struct Call *temp;
    struct Call *pre;
    struct Call *current;
    call=findPerson(*head);
    if(call==NULL)
    {
      printf("没找到!\n");
    }
    else
    {
      current=*head;
      pre=NULL;
      while(current!=NULL&&current!=call)
      {
            pre=current;
            current=current->next;
      }
      if(pre==NULL)
      {
            *head=current->next;
      }
      else
      {
            pre->next=current->next;
      }
      free(call);
    }
}
void releaseContacts(struct Call **head)
{
    struct Call *temp;
    while(head!=NULL)
    {
      temp=*head;
      *head=(*head)->next;
      free(temp);
    }
}
//main(void)
int main(void)
{
    struct Call *head=NULL;
    struct Call *call;
    int input;
    printf("| 欢迎使用通讯录管理程序 |\n");
    printf("|--- 1:插入新的联系人--- |\n");
    printf("|--- 2:查找新的联系人--- |\n");
    printf("|--- 3:更改新的联系人--- |\n");
    printf("|--- 4:删除新的联系人--- |\n");
    printf("|--- 5:显示新的联系人--- |\n");
    printf("|--- 6:退出新的联系人--- |\n");
    while(1)
    {
      printf("\n请输入代码指令:");
      scanf("%d",&input);
      switch(input)
      {
            case 1:addPerson(&head); break;
            //case 2:findPerson(head);
            case 2: call = findPerson(head);
                   if(call==NULL)
                   {
                     printf("找不到!\n");
                   }
                   else
                   {
                     printPerson(call);
                   }
                   break;
            case 3:changePerson(head);break;
            case 4:delPerson(&head);break;
            case 5:displayContacts(head);break;
            case 6:goto END;
      }
    }
END:
    releaseContacts(&head);

    return 0;
}

孤世星辰 发表于 2021-5-13 12:50:35

本帖最后由 孤世星辰 于 2021-5-13 12:52 编辑

人造人 发表于 2021-5-13 11:11
你这个代码的问题也太多了吧,有认真检查代码吗

其实我对这个程序也不是理解的特别深刻,我有好多问题都一知半解,大佬可以帮我解释一下么,真的超级感谢

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct Call
{
    char name;
    int phone;
    struct Call *next;
};

void getInput(struct Call *call);
void addPerson(struct Call **head);
struct Call *findPerson(struct Call *head);
void displayContacts(struct Call *head);
void printPerson(struct Call *call);
void changePerson(struct Call *head);
void delPerson(struct Call **head);

void getInput(struct Call *call)
{
    printf("请输入姓名:");
    scanf("%s",call->name);
    printf("请输入电话:");
    scanf("%d",call->phone);
}
void addPerson(struct Call **head)         //这里传来的是head的地址,所以这里**是代表head指针的指针么,但是我没有定义过这个指针啊,系统自己就会有么
                                                          //还有就是这里不是只要修改head指针就好了么,为什么要传入head指针的指针,像我们平时改一个变量不是让a=1就好了么,不应该只要改head指针就好了嘛
{
    //struct Call *call,*temp;
    struct Call *call;
    static struct Call *tail;
    call=(struct Call *)malloc(sizeof(struct Call));
    if(call==NULL)
    {
      printf("内存分配失败!\n");
      exit(1);
    }
    getInput(call);
    if(*head!=NULL)
    {
      tail->next=call;                                       
      call->next=NULL;
    }
    else
    {
      *head=call;                                           //这个是head指针指向call,意思是结构体跟数组一样是地址么
      call->next=NULL;
    }
    tail=call;
}
struct Call *findPerson(struct Call *head)          //这里find前面为啥要加*,是因为要返回结构体指针么?
{
    struct Call *call;
    char input;
    call=head;
    printf("请输入要查找的姓名:");
    scanf("%s",input);
    while(call!=NULL)
    {
      if(!strcmp(call->name,input)||call!=NULL)
      {
            break;
      }
      call=call->next;
    }
    return call;
}
void displayContacts(struct Call *head)
{
    //struct Call *call;
    struct Call *call = head;
    int count=1;
    while(call != NULL)
    {
      printf("第%d位联系人",count);
      printf("姓名:%s\n",call->name);
      //printf("电话:%d\n",call->phone);
      printf("电话:%d\n", *call->phone);
      call=call->next;
      count++;
    }
}
void printPerson(struct Call *call)
{
    printf("姓名:%s",call->name);
    //printf("电话:%d",call->phone);
    printf("电话:%d", *call->phone);
}
void changePerson(struct Call *head)
{
    struct Call *call;
    call=findPerson(head);
    if(call==NULL)
    {
      printf("找不到!\n");
    }
    else
    {
      printf("请输入新的号码:");
      //scanf("%s",call->phone);
      scanf("%d",call->phone);
    }
}
void delPerson(struct Call **head)
{
    struct Call *call;
    //struct Call *temp;
    struct Call *pre;
    struct Call *current;
    call=findPerson(*head);                        //这里应该是传入head么
    if(call==NULL)
    {
      printf("没找到!\n");
    }
    else
    {
      current=*head;                                //为啥不是*current=*head,这样把head指针给current指针,到底是*current代表指针还是current代表指针?搞不懂这两个区别
      pre=NULL;
      while(current!=NULL&&current!=call)
      {
            pre=current;
            current=current->next;
      }
      if(pre==NULL)
      {
            *head=current->next;
      }
      else
      {
            pre->next=current->next;
      }
      free(call);
    }
}
void releaseContacts(struct Call **head)
{
    struct Call *temp;
    while(head!=NULL)
    {
      temp=*head;
      *head=(*head)->next;
      free(temp);
    }
}
//main(void)
int main(void)
{
    struct Call *head=NULL;
    struct Call *call;
    int input;
    printf("| 欢迎使用通讯录管理程序 |\n");
    printf("|--- 1:插入新的联系人--- |\n");
    printf("|--- 2:查找新的联系人--- |\n");
    printf("|--- 3:更改新的联系人--- |\n");
    printf("|--- 4:删除新的联系人--- |\n");
    printf("|--- 5:显示新的联系人--- |\n");
    printf("|--- 6:退出新的联系人--- |\n");
    while(1)
    {
      printf("\n请输入代码指令:");
      scanf("%d",&input);
      switch(input)
      {
            case 1:addPerson(&head); break;
            //case 2:findPerson(head);
            case 2: call = findPerson(head);          //这边不是返回了call么为什么又要call=find()?是因为局部变量?
                   if(call==NULL)
                   {
                     printf("找不到!\n");
                   }
                   else
                   {
                     printPerson(call);
                   }
                   break;
            case 3:changePerson(head);break;
            case 4:delPerson(&head);break;
            case 5:displayContacts(head);break;
            case 6:goto END;
      }
    }
END:
    releaseContacts(&head);

    return 0;
}

人造人 发表于 2021-5-13 13:43:02

孤世星辰 发表于 2021-5-13 12:50
其实我对这个程序也不是理解的特别深刻,我有好多问题都一知半解,大佬可以帮我解释一下么,真的超级感 ...

void addPerson(struct Call **head)         //这里传来的是head的地址,所以这里**是代表head指针的指针么,但是我没有定义过这个指针啊,系统自己就会有么
                                                            //还有就是这里不是只要修改head指针就好了么,为什么要传入head指针的指针,像我们平时改一个变量不是让a=1就好了么,不应该只要改head指针就好了嘛
要修改这个指针的值,就需要这个指针的地址,就是指向指针的指针,二级指针

*head=call;                                           //这个是head指针指向call,意思是结构体跟数组一样是地址么
是改变调用这个函数的时候传入的那个变量的值
在这里是改变main函数中第149行的那个head变量的值,因为165行调用addPerson这个函数的时候把head的地址作为参数(&head)
149行的head是一个指针
就是改变这个指针变量中保存的值,就是改变这个指针的指向


struct Call *findPerson(struct Call *head)          //这里find前面为啥要加*,是因为要返回结构体指针么?


call=findPerson(*head);                        //这里应该是传入head么
不行,因为findPerson这个函数要求一个struct Call *head,是个一级指针,而delPerson这个函数的head是一个二级指针


current=*head;                              //为啥不是*current=*head,这样把head指针给current指针,到底是*current代表指针还是current代表指针?搞不懂这两个区别
*current是对这个指针解引用,current是一个一级指针,而且没有让这个指针指向一个有效的对象,不能对current解引用
current=*head; *head就是main函数中第149行的那个head变量中的内容,这是让current这个指针和main函数中149行的那个head指向同一个对象

case 2: call = findPerson(head);          //这边不是返回了call么为什么又要call=find()?是因为局部变量?
不明白你的问题,这个是让call指向findPerson函数返回的那个对象

孤世星辰 发表于 2021-5-13 14:18:08

人造人 发表于 2021-5-13 13:43


哦哦哦谢谢,我终于理顺了,最后那个问题就是find函数最后不是return call了么
那么我直接
find(head)
if(call==NULL)这样判断不可以么
为什么还要
call=find(head)
if(call==NULL)

人造人 发表于 2021-5-13 14:35:37

孤世星辰 发表于 2021-5-13 14:18
哦哦哦谢谢,我终于理顺了,最后那个问题就是find函数最后不是return call了么
那么我直接
find(head ...

你没有为变量call赋值呀,把返回值赋值给call

孤世星辰 发表于 2021-5-13 14:42:11

人造人 发表于 2021-5-13 14:35
你没有为变量call赋值呀,把返回值赋值给call

哦哦哦好的吧,那我记住了,但是我的运行功能不对诶,是我编译器的问题么

人造人 发表于 2021-5-13 15:40:50

孤世星辰 发表于 2021-5-13 14:42
哦哦哦好的吧,那我记住了,但是我的运行功能不对诶,是我编译器的问题么

提示让你输入指令,你输入 “蠢才”干嘛

孤世星辰 发表于 2021-5-13 17:25:22

人造人 发表于 2021-5-13 15:40
提示让你输入指令,你输入 “蠢才”干嘛

啊这{:9_239:},还是不对呢

人造人 发表于 2021-5-13 19:20:08

孤世星辰 发表于 2021-5-13 17:25
啊这,还是不对呢

void releaseContacts(struct Call **head)
{
    struct Call *temp;
    //while(head!=NULL)
    while(*head!=NULL)
    {
      temp=*head;
      *head=(*head)->next;
      free(temp);
    }
}

孤世星辰 发表于 2021-5-14 09:44:11

本帖最后由 孤世星辰 于 2021-5-14 09:47 编辑

人造人 发表于 2021-5-13 19:20


还有一个问题是为啥我输入‘蠢才’,但是他给我找到的永远是第一个联系人呢?
      if(!strcmp(call->name,input)||call!=NULL)
是这个有问题么

人造人 发表于 2021-5-14 09:52:37

孤世星辰 发表于 2021-5-14 09:44
还有一个问题是为啥我输入‘蠢才’,但是他给我找到的永远是第一个联系人呢?

是这个有问题么

是不等于还是等于?
if(!strcmp(call->name,input)||call == NULL)

孤世星辰 发表于 2021-5-14 10:16:15

人造人 发表于 2021-5-14 09:52
是不等于还是等于?
if(!strcmp(call->name,input)||call == NULL)

嗯嗯这回好了,谢谢
页: [1]
查看完整版本: 这个函数哪里错了