a905448839 发表于 2023-4-8 22:39:46

我又来了。。————求助!

今天学完单链表用单链表的方式做之前的题,但是还是遇到一个类似之前的问题!
录入完第一个人资料 录第二个人资料就会有卡住 有问题。。求助


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

struct Ym
{
      char name;
      int age;
      char one_time;
      char two_time;
      struct Ym *next;

};

getInput(struct Ym *ym)
{
       
        char ch;
        printf("请输入姓名:");
        scanf("%s",ym->name);
        printf("请输入年龄:");
        scanf("%d",ym->age);
        while ((ch = getchar()) != '\n' && ch != EOF); // 添加这行以清空输入缓冲区

    printf("请问是否接种过疫苗(Y/N):");


      
      if((ch = getchar()) == 'Y')
      {
                printf("请输入第一针疫苗接种的日期(yyyy-mm-dd):");
                scanf("%s",ym->one_time);
               
      }
      else
      {
                ym->one_time = '0';
                return ;
      }
      
      while ((ch = getchar()) != '\n' && ch != EOF); // 添加这行以清空输入缓冲区

      printf("请问是否接种过第二针疫苗(Y/N):");
               
               if((ch = getchar()) == 'Y')
      {
      
                printf("请输入第二针疫苗接种的日期(yyyy-mm-dd):");
                scanf("%s",ym->two_time);
      }
      else
      ym->two_time = '0';
       
}


void addYm(struct Ym **library)
{
        struct Ym *ym, *temp;
        ym = (struct Ym*)malloc(sizeof(struct Ym));
        if(ym == NULL)
        {
                printf("内存分配失败了!\n");
                exit(1);
        }
       
        getInput(ym);
       
        if(*library != NULL)
        {
                temp = *library;
                *library = ym;
                ym->next = temp;
               
        }
        else
        {
                *library = ym;
                ym->next = NULL;
        }
       
       
}

       
void printLibrary(struct Ym *library)
{
        struct Ym *ym;
//        int count = 1;
       
        ym = library;
        while(ym != NULL)
        {
                printf("姓名:%s        ",ym->name);
                printf("年龄:%d",ym->age);
               if(ym->one_time != '0')
      printf("第一针疫苗接种日期:%s,",ym->one_time);
      else
      {
            printf("未接种疫苗!");
      }
      if(ym->two_time != '0')
      printf("第二针疫苗接种日期:%s\n\n",ym->two_time);
      else
      printf("未接种第二针疫苗!\n\n");
      
                ym = ym->next;
                //count++;
        }
}

void releaseLibrary(struct Ym *library)
{
      struct Ym *temp;
   
      while (library != NULL)
      {
                temp = library;
                library = library->next;
                free(temp);
      }
}




int main(void)
{
        struct Ym *library = NULL;
        char ch;
       
        while(1)
        {
                printf("请问是否需要录入疫苗信息(Y/N):");
                do
                {
                        ch = getchar();
                }
                while(ch != 'Y' && ch != 'N');

                if(ch == 'Y')
                {
                        addYm(&library); //如果用library是指向空间的地址 用&library是library指针本身的地址
                       
       
                }
                else
                {
                        break;
                }
        }

        printf("请问是否需要打印疫苗信息(Y/N):");
        do
        {
                ch = getchar();
        }
        while(ch != 'Y' && ch != 'N');
       
        if(ch == 'Y')
        {
                printLibrary(library);
        }
        releaseLibrary(library);
       
        return 0;
}

isdkz 发表于 2023-4-8 22:41:56

你好!我发现你在 getInput 函数中调用 scanf() 函数时,ym->age 需要传递一个整数指针,而不是整数本身。请将 scanf("%d",ym->age); 更改为 scanf("%d",&ym->age);。

下面是修改后的 getInput() 函数:


void getInput(struct Ym *ym)
{
      char ch;
      printf("请输入姓名:");
      scanf("%s",ym->name);
      printf("请输入年龄:");
      scanf("%d",&ym->age); // 这里修改了
      while ((ch = getchar()) != '\n' && ch != EOF); // 添加这行以清空输入缓冲区

      // ... 其他代码保持不变 ...
}

使用上述修改后的 getInput() 函数,程序应该可以正常运行并录入多个人的资料。如果还有其他问题,请随时告诉我!

a905448839 发表于 2023-4-8 23:05:49

isdkz 发表于 2023-4-8 22:41
你好!我发现你在 getInput 函数中调用 scanf() 函数时,ym->age 需要传递一个整数指针,而不是整数本身。 ...

修改后 为什么只录入了最后一个人的数据呢?

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

struct Ym
{
      char name;
      int age;
      char one_time;
      char two_time;
      struct Ym *next;

};

void getInput(struct Ym *ym)
{
       
        char ch;
        printf("请输入姓名:");
        scanf("%s",ym->name);
        printf("请输入年龄:");
        scanf("%d",&ym->age);
        while ((ch = getchar()) != '\n' && ch != EOF); // 添加这行以清空输入缓冲区

    printf("请问是否接种过疫苗(Y/N):");


      
      if((ch = getchar()) == 'Y')
      {
                printf("请输入第一针疫苗接种的日期(yyyy-mm-dd):");
                scanf("%s",ym->one_time);
               
      }
      else
      {
                ym->one_time = '0';
                printf("\n\n");
                return ;
      }
      
      while ((ch = getchar()) != '\n' && ch != EOF); // 添加这行以清空输入缓冲区

      printf("请问是否接种过第二针疫苗(Y/N):");
               
               if((ch = getchar()) == 'Y')
      {
      
                printf("请输入第二针疫苗接种的日期(yyyy-mm-dd):");
                scanf("%s",ym->two_time);
      }
      else
      ym->two_time = '0';
      
      //while ((ch = getchar()) != '\n' && ch != EOF); // 添加这行以清空输入缓冲区
                printf("\n\n");
       
}


void addYm(struct Ym **library)
{
        struct Ym *ym, *temp;
        ym = (struct Ym*)malloc(sizeof(struct Ym));
        if(ym == NULL)
        {
                printf("内存分配失败了!\n");
                exit(1);
        }
       
        getInput(ym);
       
        if(*library != NULL)
        {
                temp = *library;
                *library = ym;
                ym->next = temp;
               
        }
        else
        {
                *library = ym;
                ym->next = NULL;
        }
       
       
}

       
void printLibrary(struct Ym *library)
{
        struct Ym *ym;
//        int count = 1;
       
        ym = library;
        while(ym != NULL)
        {
                printf("姓名:%s        ",ym->name);
                printf("年龄:%d\n",ym->age);
               
               if(ym->one_time != '0')
      printf("第一针疫苗接种日期:%s,        ",ym->one_time);
      else
      {
            printf("未接种疫苗!");
            ym = ym->next;
            break;
         
      }
      
          if(ym->one_time != '0' && ym->two_time != '0')
      printf("第二针疫苗接种日期:%s\n\n",ym->two_time);
      else
      {
                        printf("未接种第二针疫苗!\n\n");
         
                }
                ym = ym->next; //指向下一个结构体就可以跳出循环了
                        //count++;
        }
}

void releaseLibrary(struct Ym *library)
{
      struct Ym *temp;
   
      while (library != NULL)
      {
                temp = library;
                library = library->next;
                free(temp);
      }
}



int main(void)
{
        struct Ym *library = NULL;
        char ch;
       
        while(1)
        {
                printf("请问是否需要录入疫苗信息(Y/N):");
                do
                {
                        ch = getchar();
                }
                while(ch != 'Y' && ch != 'N');

                if(ch == 'Y')
                {
                        addYm(&library); //如果用library是指向空间的地址 用&library是library指针本身的地址
                       
       
                }
                else
                {
                        printf("\n");
       
                        break;
                }
        }

        printf("请问是否需要打印疫苗信息(Y/N):");
        do
        {
                ch = getchar();
        }
        while(ch != 'Y' && ch != 'N');
       
        if(ch == 'Y')
        {
                printLibrary(library);
        }
        releaseLibrary(library);
       
        return 0;
}

isdkz 发表于 2023-4-8 23:09:28

a905448839 发表于 2023-4-8 23:05
修改后 为什么只录入了最后一个人的数据呢?

录入的信息都有呀

a905448839 发表于 2023-4-8 23:25:23

isdkz 发表于 2023-4-8 23:09
录入的信息都有呀

是我这个修改后的代码能够录入多个人员的数据吗? 我尝试了很多次都不行。。。

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

struct Ym
{
      char name;
      int age;
      char one_time;
      char two_time;
      struct Ym *next;

};

void getInput(struct Ym *ym)
{
      
      char ch;
      printf("请输入姓名:");
      scanf("%s",ym->name);
      printf("请输入年龄:");
      scanf("%d",&ym->age);
      while ((ch = getchar()) != '\n' && ch != EOF); // 添加这行以清空输入缓冲区

    printf("请问是否接种过疫苗(Y/N):");


      
      if((ch = getchar()) == 'Y')
      {
                printf("请输入第一针疫苗接种的日期(yyyy-mm-dd):");
                scanf("%s",ym->one_time);
               
      }
      else
      {
                ym->one_time = '0';
                printf("\n\n");
                return ;
      }
      
      while ((ch = getchar()) != '\n' && ch != EOF); // 添加这行以清空输入缓冲区

      printf("请问是否接种过第二针疫苗(Y/N):");
               
               if((ch = getchar()) == 'Y')
      {
      
                printf("请输入第二针疫苗接种的日期(yyyy-mm-dd):");
                scanf("%s",ym->two_time);
      }
      else
      ym->two_time = '0';
      
      //while ((ch = getchar()) != '\n' && ch != EOF); // 添加这行以清空输入缓冲区
                printf("\n\n");
      
}


void addYm(struct Ym **library)
{
      struct Ym *ym, *temp;
      ym = (struct Ym*)malloc(sizeof(struct Ym));
      if(ym == NULL)
      {
                printf("内存分配失败了!\n");
                exit(1);
      }
      
      getInput(ym);
      
      if(*library != NULL) //可以分开看 * (*library)看成一个整体 这个代表**library指针指向空间的地址
      {
                temp = *library;
                *library = ym;
                ym->next = temp;
               
      }
      else
      {
                *library = ym;
                ym->next = NULL;
      }
      
      
}

      
void printLibrary(struct Ym *library)
{
      struct Ym *ym;
//      int count = 1;
      
      ym = library;
      while(ym != NULL)
      {
                printf("姓名:%s      ",ym->name);
                printf("年龄:%d\n",ym->age);
               
               if(ym->one_time != '0')
      printf("第一针疫苗接种日期:%s,      ",ym->one_time);
      else
      {
            printf("未接种疫苗!");
            ym = ym->next;
            break;
         
      }
      
            if(ym->one_time != '0' && ym->two_time != '0')
      printf("第二针疫苗接种日期:%s\n\n",ym->two_time);
      else
      {
                        printf("未接种第二针疫苗!\n\n");
         
                }
                ym = ym->next; //指向下一个结构体就可以跳出循环了
                        //count++;
      }
}

void releaseLibrary(struct Ym *library)
{
      struct Ym *temp;
   
      while (library != NULL)
      {
                temp = library;
                library = library->next;
                free(temp);
      }
}



int main(void)
{
      struct Ym *library = NULL;
      char ch;
      
      while(1)
      {
                printf("请问是否需要录入疫苗信息(Y/N):");
                do
                {
                        ch = getchar();
                }
                while(ch != 'Y' && ch != 'N');

                if(ch == 'Y')
                {
                        addYm(&library); //如果用library是指向空间的地址 用&library是library指针本身的地址
                        
      
                }
                else
                {
                        printf("\n");
      
                        break;
                }
      }

      printf("请问是否需要打印疫苗信息(Y/N):");
      do
      {
                ch = getchar();
      }
      while(ch != 'Y' && ch != 'N');
      
      if(ch == 'Y')
      {
                printLibrary(library);
      }
      releaseLibrary(library);
      
      return 0;
}

isdkz 发表于 2023-4-8 23:26:01

本帖最后由 isdkz 于 2023-4-8 23:31 编辑

a905448839 发表于 2023-4-8 23:20
是我这个修改后的代码能够录入多个人员的数据吗? 我尝试了很多次都不行。。。

暂且称你修改前的代码为第一个代码,修改后的为第二个代码,我给你解释以下只能输出一个数据的原因:

在第二个代码的 printLibrary 函数中,当第一个疫苗未接种时,程序会直接跳到下一个记录,这是因为使用了 break 语句。

实际上,应该使用 continue 语句,以便跳过当前记录的剩余部分并继续处理下一个记录。以下是修复后的第二个代码中的 printLibrary 函数的相关部分:

else
{
    printf("未接种疫苗!");
    ym = ym->next;
    continue;
}

将 break 语句替换为 continue 语句后,第二个代码应该可以正确地输出所有已录入的信息。
页: [1]
查看完整版本: 我又来了。。————求助!