910201513 发表于 2018-9-8 10:11:13

新手求助

可以正常运行,但是没有输出链表,求指错,蟹蟹







#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define LEN sizeof(struct list)
struct list                                                                                        //定义链表
{
        char *name;
        long int num;
        struct list *next;
};
int main(void)
{
        struct list *p1,*p2,*head,*p;
        p1=p2=(struct list *)malloc(LEN);                                //申请第一个节点
        printf("请输入姓名:");
        scanf("%s",&p1->name);
        printf("请输入学号:");
        scanf("%d",&p1->num);
        head = NULL;
        int n=0;
        while(p1->num)                                                                        //动态申请节点并输入
        {
                n++;
                if(n==1)
                        head=p1;
                else
                        p2->next=p1;
                p2=p1;
                p1=(struct list *)malloc(LEN);
                printf("请输入姓名:");
                scanf("%s",&p1->name);
                printf("请输入学号:");
                scanf("%d",&p1->num);
        }
        p2->next=NULL;

        p=head;                                                                                        //打印链表
        while(head)
        {
                do
                {
                        printf("%d:        姓名:%s    学号:%d\n",n+1,p->name,p->num);
                        p=p->next;
                }while(p);
        }
        return 0;
}

gpf谦默 发表于 2018-9-8 10:58:21

你好我在你的程序上做了修改有些地方你写的不合理我这只是个参考

注意循环的时候一定要有结束条件

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define LEN sizeof(struct list)
struct list                                                                                        //定义链表
{
      char *name;
      long int num;
      struct list *next;
};
int main(void)
{
      struct list *p1,*p2,*head,*p;
      printf("LEN = %d\n",LEN);
      p1=p2=(struct list *)malloc(LEN);                              //申请第一个节点
      printf("请输入姓名:");
      scanf("%s",p1->name);
      printf("请输入学号:");
      scanf("%d",&p1->num);
      head = NULL;
      int n=0;
      while(p1->num != 0)                                                                        //动态申请节点并输入
      {
                n++;
                if(n==1)
                  head=p1;
                else
                        p2->next=p1;
                p2=p1;
                p1=(struct list *)malloc(LEN);
                printf("请输入姓名:");
                scanf("%s",p1->name);
                printf("请输入学号:");
                scanf("%d",&p1->num);
                p2->next=p1;
                p2=p1;
      }
      p2->next=NULL;

      p2=head;                                                                                        //打印链表
      while(p2->next)
      {
            
            printf("%d:姓名:%s 学号:%d\n",n+1,p2->name,p2->num);
            p2=p2->next;
   
      }
      return 0;
}

910201513 发表于 2018-9-8 19:24:01

gpf谦默 发表于 2018-9-8 10:58
你好我在你的程序上做了修改有些地方你写的不合理我这只是个参考

注意循环的时候一定要有结束条 ...

你好,你的程序我运行了,还是不能正常打印链表

910201513 发表于 2018-9-8 19:25:15

910201513 发表于 2018-9-8 19:24
你好,你的程序我运行了,还是不能正常打印链表

而且我觉得循环结束条件省略不等于0完全ok

gpf谦默 发表于 2018-9-8 20:27:26

910201513 发表于 2018-9-8 19:25
而且我觉得循环结束条件省略不等于0完全ok

等于0只是个循环终止条件,也可以有其他的写法
我用的是Dev C++ 编译的没问题的 你用的是啥?

gpf谦默 发表于 2018-9-8 20:29:00

C:\Users\huipu\Desktop\捕获.PNG

几番离愁 发表于 2018-9-9 14:31:53

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define LEN sizeof(struct list)
struct list                                                                                        //定义链表
{
      char *name;
      long int num;
      struct list *next;
};
int main(void)
{               
                int n=0;
      struct list *p1,*p2,*head;
      printf("LEN = %d\n",LEN);
      p1=p2=(struct list *)malloc(LEN);                              //申请第一个节点
                if(p1==NULL)
                {
                        printf("分配内存失败\n");
                }
               
      printf("请输入姓名:");
      scanf("%s",&p1->name);
      printf("请输入学号:");
      scanf("%d",&p1->num);
      head = NULL;
      
      while(p1->num != 0)                                                                        //动态申请节点并输入
      {
                n++;
                if(n==1)
                                {
                  head=p1;
                }
                                else
                                {   
                                        p2->next=p1;
                                        p2=p1;
                                }
               
                p1=(struct list *)malloc(LEN);
                printf("请输入姓名:");
                scanf("%s",&p1->name);
                printf("请输入学号:");
                scanf("%d",&p1->num);
               
      }
      p2->next=NULL;

      p2=head;                                                                                        //打印链表
      while( p2!=NULL )
      {
            
            printf("%d:姓名:%s 学号:%d\n",n+1,&p2->name,p2->num);
            p2=p2->next;
   
      }
      return 0;
}

几番离愁 发表于 2018-9-9 14:33:37

觉得name那里用数组会比指针简单,不会有这么多错误

910201513 发表于 2018-9-10 13:29:08

gpf谦默 发表于 2018-9-8 20:27
等于0只是个循环终止条件,也可以有其他的写法
我用的是Dev C++ 编译的没问题的 你用的是啥?

vc6.0

910201513 发表于 2018-9-10 13:31:11

几番离愁 发表于 2018-9-9 14:31
#include
#include
#include


蟹蟹

gpf谦默 发表于 2018-9-10 14:23:17

910201513 发表于 2018-9-10 13:29
vc6.0

思想是没问题的

910201513 发表于 2018-9-10 18:13:30

gpf谦默 发表于 2018-9-10 14:23
思想是没问题的

蟹蟹指点
页: [1]
查看完整版本: 新手求助