标题:各位大神,帮我看下这个程序为什么输不出来结果呢?
只看楼主
李童鞋
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2017-3-7
结帖率:100%
已结贴  问题点数:20 回复次数:10 
各位大神,帮我看下这个程序为什么输不出来结果呢?
#include<stdio.h>
#include<stdlib.h>
typedef struct student
{
    int num;
    char name[10];
    char addr[15];
    struct student *next;
}Stu;

int main()
{
    void input(Stu *head);
    void print(Stu *out);
    int flag;
    Stu *Q;
   
star:    printf("\n\n1.输入学生信息\t\t\t2.显示学生信息\t\t\t0.退出\n");
        printf("请您选择序号:");
        scanf("%d",&flag);
        switch(flag)
        {
        case 0:return 0;
        case 1:
            input(Q);
            goto star;
            break;
        case 2:print(Q);
            goto star;
            break;
        }
}

void input(Stu *head)
{
    Stu *p1,*p2;
    int flag=1,n=0;
    p1=p2=(Stu*)malloc(sizeof(Stu));
    while(flag)
    {
        printf("请您输入学号:");
        scanf("%d",&p1->num);
        printf("请您输入姓名:");
        scanf("%s",p1->name);
        printf("请您输入地址:");
        scanf("%s",p1->addr);
        n=n+1;
        if(n==1)
            head=p1;
        else
            p2->next=p1;
        p2=p1;
        p1=(Stu*)malloc(sizeof(Stu));
        printf("是否继续输入(1/0):");
        scanf("%d",&flag);
    }
    p2->next=NULL;
}

void print(Stu *out)
{
    Stu *p;
    p=out;
    if(out!=NULL)
        printf("无学生信息!\n");
    else
    {
        printf("学生信息为:\n");
        while(p!=NULL)
        {
            printf("学号    姓名    地址\n");
            printf("%-8d%-8s%-8s\n",p->num,p->name,p->addr);
            p=p->next;
        }
    }
}
搜索更多相关主题的帖子: include return star 信息 
2017-04-01 22:54
李童鞋
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2017-3-7
得分:0 
2017-04-01 23:18
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:20 
就说说原因~相当于
void fun(int a,int b)
{
    int t=a;
    a=b;
    b=t;
}

这样试图交换ab的值~当然这题相对于来说Q是一个指针~有两个解决方案~要么加个返回值给Q~要么用多一重指针~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-04-02 00:30
李童鞋
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2017-3-7
得分:0 
回复 3楼 九转星河
既然是指针,head是头指针,Q也应该是头指针,然后也应该输出后面的内容勒,大神,详细讲哈原因,纠结这个好久了
2017-04-02 09:46
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
回复 4楼 李童鞋
函数里面head的地址值和传进去head的地址值不同呢~加个return head就可以了~这样顺便改改函数的返回值类型~这样程序可以正常运行了~可以试试输出对比下前后head的值会发现是不同的~不过如果是用二重指针传参就可以不要返回值~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-04-02 10:07
李童鞋
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2017-3-7
得分:0 
回复 5楼 九转星河
大神,为什么同样的,这种又可以带回地址呢?
#include<stdio.h>
#include<stdlib.h>
typedef struct student
{
    int num;
    char name[10];
    char addr[15];
    struct student *next;
}Stu;

int main()
{
    void input(Stu *head);
    void print(Stu *out);
    int flag;
    Stu *Q;
    Q=(Stu*)malloc(sizeof(Stu));
    Q->next=NULL;
star:    printf("\n\n1.输入学生信息\t\t\t2.显示学生信息\t\t\t0.退出\n");
        printf("请您选择序号:");
        scanf("%d",&flag);
        switch(flag)
        {
        case 0:return 0;
        case 1:
            input(Q);
            system("cls");
            goto star;
            break;
        case 2:
            print(Q);
            goto star;
            break;
        }
}

void input(Stu *head)
{
    Stu *s;
    int flag=1,n=0;
    s=(Stu*)malloc(sizeof(Stu));
    while(flag)
    {
        printf("请您输入学号:");
        scanf("%d",&s->num);
        printf("请您输入姓名:");
        scanf("%s",s->name);
        printf("请您输入地址:");
        scanf("%s",s->addr);
        s->next=head->next;
        head->next=s;
        s=(Stu*)malloc(sizeof(Stu));
        printf("是否继续输入(1/0):");
        scanf("%d",&flag);
    }
}

void print(Stu *out)
{
    if(out->next==NULL)
        printf("无学生信息!\n");
    else
    {
        printf("学生信息为:\n");
        while(out->next!=NULL)
        {
            out=out->next;
            printf("学号    姓名    地址\n");
            printf("%-8d%-8s%-8s\n",out->num,out->name,out->addr);
            
        }
    }
}
2017-04-02 10:41
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
回复 6楼 李童鞋
因为~
程序代码:
#include<stdio.h>
void fun(int,int);
int main()
{
    int a=1;
    int b=2;

    int t=a;
    a=b;
    b=t;

    printf("%d %d\n",a,b);

    fun(a,b);

    printf("%d %d\n",a,b);

    return 0;
}

void fun (int a,int b)
{
    int t=a;
    a=b;
    b=t;
}



[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-04-02 11:06
李童鞋
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2017-3-7
得分:0 
回复 7楼 九转星河
我的那个程序输出功能都在单独的子函数里面,然后都是在主函数调用,你写的那个交换第一个是在主函数里面进行交换,我还是没弄明白
2017-04-02 11:17
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
回复 8楼 李童鞋
这样试试~

程序代码:
Stu* input(Stu *head)
{
    Stu *p1,*p2;
    int flag=1,n=0;
    p1=p2=(Stu*)malloc(sizeof(Stu));
    while(flag)
    {
        printf("请您输入学号:");
        scanf("%d",&p1->num);
        printf("请您输入姓名:");
        scanf("%s",p1->name);
        printf("请您输入地址:");
        scanf("%s",p1->addr);
        n=n+1;
        if(n==1)
            head=p1;
        else
            p2->next=p1;
        p2=p1;
        p1=(Stu*)malloc(sizeof(Stu));
        printf("是否继续输入(1/0):");
        scanf("%d",&flag);
    }
    p2->next=NULL;

    return head;
}

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-04-02 11:36
李童鞋
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2017-3-7
得分:0 
回复 9楼 九转星河
谢谢大神!这样返回头指针肯定是行的,我就在想到底我那种是哪里有问题,想不通啊
2017-04-02 16:53



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-475723-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.171882 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved