标题:为什么每次输出的只有最后一个节点的信息,前面的节点为什么输出不了呢
只看楼主
LGD335060087
Rank: 2
等 级:论坛游民
帖 子:36
专家分:13
注 册:2020-3-15
结帖率:80%
已结贴  问题点数:17 回复次数:9 
为什么每次输出的只有最后一个节点的信息,前面的节点为什么输出不了呢
程序代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct player{
    int number;
    char name[20];
    struct player*next;
}Player;
Player*game(int sum);
int main()
{
    int sum;
    printf("请输入玩家个数");
    scanf("%d",&sum);
    Player*head;
    head=game(sum);
    int i;
    while(head!=NULL){
            printf("%d,%s",head->number,head->name);
            
    }
    return 0; 
}
Player*game(int sum)
{
    int i;
    Player*head,*pt,*pre;    //头节点过度节点,尾节点 
    for(i=0;i<sum;i++){
     
        pt=(Player*)malloc(sizeof(Player));
        scanf("%d%s",&pt->number,pt->name);
        if(pt!=NULL){
            head=pt;
            pre=pt;
            pre->next=pt;
        }
        pt->next=NULL;
    }
    return head; 
}
搜索更多相关主题的帖子: head 节点 输出 player int 
2020-04-08 14:14
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:9 
    while(head!=NULL){
            printf("%d,%s",head->number,head->name);
            head = head->next;
    }
2020-04-08 14:38
LGD335060087
Rank: 2
等 级:论坛游民
帖 子:36
专家分:13
注 册:2020-3-15
得分:0 
回复 2楼 吹水佬
不行呢还是只能输出最后一个节点的信息

知识改变命运,代码更改时代
2020-04-09 09:04
fulltimelink
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:171
专家分:752
注 册:2020-4-1
得分:9 
程序代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct player {
    int number;
    char name[20];
    struct player*next;
}Player;
Player*game(int sum);
int main()
{
    int sum;
    printf("请输入玩家个数");
    scanf("%d", &sum);
    Player*head = game(sum);
    while (head != NULL) {
        printf("%d,%s", head->number, head->name);
        head = head->next;

    }
    return 0;
}
Player*game(int sum)
{
    int i;
    Player*head = NULL, *pt, *pre = NULL;    //头节点过度节点,尾节点 
    for (i = 0; i < sum; i++) {

        pt = (Player*)malloc(sizeof(Player));
        scanf("%d%s", &pt->number, pt->name);
        if (pt != NULL) {
            if (i == 0) {
                head = pt;
                pre = pt;
            }
            else {
                pre->next = pt;
                pre = pt;
            }
            
            
        }
        pt->next = NULL;
    }
    return head;
}
2020-04-09 11:37
fulltimelink
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:171
专家分:752
注 册:2020-4-1
得分:0 
以下是引用fulltimelink在2020-4-9 11:37:08的发言:


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct player {
    int number;
    char name[20];
    struct player*next;
}Player;
Player*game(int sum);
int main()
{
    int sum;
    printf("请输入玩家个数");
    scanf("%d", &sum);
    Player*head = game(sum);
    while (head != NULL) {
        printf("%d,%s", head->number, head->name);
        head = head->next;

    }
    return 0;
}
Player*game(int sum)
{
    int i;
    Player*head = NULL, *pt, *pre = NULL;    //头节点过度节点,尾节点
    for (i = 0; i < sum; i++) {

        pt = (Player*)malloc(sizeof(Player));
        scanf("%d%s", &pt->number, pt->name);
        if (pt != NULL) {
            if (i == 0) {
                head = pt;
                pre = pt;
            }
            else {
                pre->next = pt;
                pre = pt;
            }
            
            
        }
        pt->next = NULL;
    }
    return head;
}

不能编辑了, 输出完还需要free  
程序代码:
while (head != NULL) {
        printf("%d,%s", head->number, head->name);
        head = head->next;

    }
    free(head);
    return 0;
2020-04-09 11:44
LGD335060087
Rank: 2
等 级:论坛游民
帖 子:36
专家分:13
注 册:2020-3-15
得分:0 
以下是引用fulltimelink在2020-4-9 11:37:08的发言:


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct player {
    int number;
    char name[20];
    struct player*next;
}Player;
Player*game(int sum);
int main()
{
    int sum;
    printf("请输入玩家个数");
    scanf("%d", &sum);
    Player*head = game(sum);
    while (head != NULL) {
        printf("%d,%s", head->number, head->name);
        head = head->next;

    }
    return 0;
}
Player*game(int sum)
{
    int i;
    Player*head = NULL, *pt, *pre = NULL;    //头节点过度节点,尾节点
    for (i = 0; i < sum; i++) {

        pt = (Player*)malloc(sizeof(Player));
        scanf("%d%s", &pt->number, pt->name);
        if (pt != NULL) {
            if (i == 0) {
                head = pt;
                pre = pt;
            }
            else {
                pre->next = pt;
                pre = pt;
            }
            
            
        }
        pt->next = NULL;
    }
    return head;
}

  if (i == 0) {
                head = pt;
                pre = pt;
            }
问题1:为什么不可以把if(i==0)改为if(head!=NULL)呢????因为刚开始game函数里head就是空的,进入第二次循环时它就是非空了
问题2:我在game函数里给pt动态申请了内存空间我应该在哪里给它返回内存空间呢?

知识改变命运,代码更改时代
2020-04-10 11:01
fulltimelink
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:171
专家分:752
注 册:2020-4-1
得分:0 
回复 6楼 LGD335060087
head != null也可以的,都是用来判断第一次而已, 如果你愿意,也可以把首次malloc放到for外面,这样循环里面就不用每次都if了,这个看你自己的想法!
第二个问题,没明白你想说啥?
2020-04-10 11:18
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用LGD335060087在2020-4-9 09:04:39的发言:

不行呢还是只能输出最后一个节点的信息

我只看了输出,输入也有问题,看代码应该是头插入。

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

typedef struct player
{
    int number;
    char name[20];
    struct player *next;
} Player;

Player* game(int sum);

int main()
{
    int sum;
    printf("请输入玩家个数");
    scanf("%d",&sum);
    Player* head;
    head=game(sum);
    int i;
    for (; head; head=head->next)
        printf("%d,%s\n",head->number,head->name);
    return 0;
}

Player* game(int sum)
{
    int i;
    Player *head=NULL,*pt;
    for(i=0; i<sum; i++)
    {
        pt=(Player*)malloc(sizeof(Player));
        if(pt!=NULL)
        {
            scanf("%d%s",&pt->number,pt->name);
            pt->next = head;
            head = pt;
        }
    }
    return head;
}
2020-04-10 11:36
LGD335060087
Rank: 2
等 级:论坛游民
帖 子:36
专家分:13
注 册:2020-3-15
得分:0 
以下是引用fulltimelink在2020-4-10 11:18:30的发言:

第二个问题,没明白你想说啥?

问题2:给pt  malloc应该在哪里free(pt)。申请内存空间不还需要返还内存空间吗

知识改变命运,代码更改时代
2020-04-10 13:29
fulltimelink
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:171
专家分:752
注 册:2020-4-1
得分:0 
回复 9楼 LGD335060087
整体确认不使用了就可以一起free掉  ,可以封装成一个函数
程序代码:
void freeList(struct node* head)
{
   struct node* tmp;

   while (head != NULL)
    {
       tmp = head;
       head = head->next;
       free(tmp);
    }

}


[此贴子已经被作者于2020-4-10 13:45编辑过]

2020-04-10 13:35



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




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

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