2 djylsy DJYLSY 于 2016.03.30 19:36 提问

程序中定义的全局变量,list 在input中已经赋值,为什么print函数中List=null?

#include
#include
#define N 4
struct node{
int score;
struct node*link;
};
struct node node;
struct node*list,*p,*r,*q;
void input(struct node*list)
{
int i;
int ch;
for(i=0;i {
printf("please input the score of %d\t",i+1);
p=(struct node*)malloc(sizeof(struct node*));
scanf("%d",&p->score);
p->link=NULL;
if(list==NULL)
list=p;
else
r->link=p;
r=p;
printf("数据为%d",p->score);
}
}
void average(struct node*list)
{
int s=0,i;
double average2;
if(list==NULL)
printf("链表为空");
for(i=0;i {
s+=list->score;
list=list->link;
}
average2=(double)s/N;
printf("%f",average2);
}
void print(struct node*list)
{
int i;
printf("顺利进入");
if(list==NULL)
printf("这是空链表");
else
{
q=list;
while(q->link!=NULL)
{
printf("%d",q->score);
q=q->link;
}
}}
int main()
{
void input(struct node*list);
void average(struct node*list);
void print(struct node*list);
int ah;
system("cls");
while(1){
printf("链表操作系统:");
printf("\n1.建立链表\n2.输出数据\n3.求平均数\n");
scanf("%d",&ah);
switch(ah){
case 1:input(list);break;
case 2:print(list);break;
case 3:average(list);break;
default:printf("wrong!");break;
}}}

3个回答

qq423399099
qq423399099   Ds   Rxr 2016.03.30 20:06
已采纳

楼主直接复制跑一下

#include<iostream>
#include<stdio.h>
using namespace std;
#define N 4
struct node{
    int score;
    struct node*link;
};
struct node node;
struct node*list,*p,*r,*q;
void input()
{
    int i;
    int ch;
    list = NULL;
    for(i=0;i < N; i++)
    {
        p=(struct node*)malloc(sizeof(struct node));
        printf("please input the score of %d\t",i+1);
        scanf("%d",&p->score);
        p->link=NULL;
        if(list==NULL)
            list=p;
        else
            r->link=p;
        r=p;
        printf("数据为%d",p->score);
    }
}
void average()
{
    int s=0,i;
    double average2;

    if(list==NULL)
        printf("链表为空");
    for(i=0;i < N; i++)
    {
        s+=list->score;
        list=list->link;
    }
    average2=(double)s/N;
    printf("平均值为:%lf\n",average2);
}
void print()
{
    int i;
    printf("顺利进入\n");
    if(list==NULL)
        printf("这是空链表");
    else
    {
        q=list;
        while(q!=NULL)//这里只需要判断q就行
        {
            printf("%d\n",q->score);
            q=q->link;
        }
    }}
int main()
{
    void input();
    void average();
    void print();
    int ah;
    system("cls");
    while(1){
        printf("链表操作系统:");
        printf("\n1.建立链表\n2.输出数据\n3.求平均数\n");
        scanf("%d",&ah);
        switch(ah){
        case 1:input();break;
        case 2:print();break;
        case 3:average();break;
        default:printf("wrong!");break;
        }
    }
}

有几个问题:
1.既然list指针已经变成全局的了,就不要传参了,楼主那样传一级指针是没有用的,操作的都是list的一个副本,所以就算插入的代码没错,
也会输出是空链表(传二级指针可以解决)
2.输出的函数里while循环只要判断while(q!=NULL)就行了

运行结果:
图片说明

lx624909677
lx624909677   Ds   Rxr 2016.03.30 19:49

你可以在赋值的时候和输出的时候,分别输出下list的地址

DJYLSY
DJYLSY   2016.03.30 19:54

赋值之后不为空,但在另外函数里就变为了null,可是那不是全局变量吗

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!