【问题标题】:My Linked List does not print out from the beginning我的链接列表没有从头打印出来
【发布时间】:2014-06-30 15:08:39
【问题描述】:

我的程序遇到的问题是我创建了一个链接列表,但是当我打印出我的链接列表时,它只会打印出列表中的最后一个人。它应该打印出列表中的每个人。这是我的程序中唯一的问题,如果有人能指出我正确的方向,我将不胜感激。

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

#define MAX_PLAYERS 9
#define MAX_STR_LEN 25

typedef struct Player_ {
    char name[MAX_STR_LEN];
    int number_of_hits;
    int number_of_strikes;
    struct Player_ *next;
} Player;

int pitch_result(void);
Player *add_player(Player *first_player, const char *name);
void destroy_team(Player *first_player);
void display_line_up(Player* first);
void readFile(Player **lineup, const char* file);

int main(int argc, char *argv[]) {
    if(argc < 2){
        exit(1);
    }
    srand(time(NULL));
    int strikes = 0;
    int hits = 0;
    Player *lineup = NULL;
    readFile(&lineup, argv[1]);
    printf("\nLine up for this team is: ");
    display_line_up(lineup);

    printf("\n\n%s is batting \n", lineup->name);

    for ( ; strikes < 3; ) {
        int result = pitch_result();
        if (result) {
            ++hits;
        }
        else
            ++strikes;
    }

    printf("\nScore of game was: %d\n", hits/4);
    return 0;
}

void readFile(Player **lineup, const char* file){
    FILE *input;
    input = fopen(file, "r");
    if(input == NULL){
        printf("Failed to open");
    }
    char player[MAX_STR_LEN];
    while(fscanf(input, "%s", &player) != EOF){
        //      printf("\n%s", player);
        *lineup = add_player(*lineup, player);
    }
}

int pitch_result(void) {
    int result;
    result = rand() % 2;
    return result;
}

void destroy_team(Player *first_player){
    Player *temp = first_player->next;
    Player *free_player;

    while (temp) {
        free_player = temp;
        temp = temp->next;
        free(free_player->name);
        free(free_player);
    }
}

Player *add_player(Player *first_player, const char *name) {
    Player *new_player = (Player*)malloc(sizeof(Player));

    int nameLength;
    nameLength = strlen(name);

    // new_player->name = malloc(nameLength * sizeof(char));

    new_player->next = NULL;

    strncpy(new_player->name, name, nameLength);
    new_player->number_of_hits = 0;
    new_player->number_of_strikes = 0;

    return new_player;
}

void display_line_up(Player *first){

    if(first == NULL)
        printf("\nThe list is empty");
    else {
        while(first != NULL){
            printf("\n%s", first->name);
            first = first->next;
        }
    }
}

这是我在运行程序时读入的文件(stats.txt)

Yadier_Molina
Allen_Craig
Daniel_Descalso
Rafael_Furcal
David_Freese
Matt_Holiday
Jon_Jay
Carlos_Beltran
Matt_Adams

这是我为我的程序提供的示例输出

Line up for this team is:   

Yadier_Molina   
Allen_Craig 
Daniel_Descalso 
Rafael_Furcal   
David_Freese    
Matt_Holliday   
Jon_Jay 
Carlos_Beltran  
Matt_Adams  
Yadier_Molina   is  batting 
Strike! 
hit!    
Strike! 
Strike! 

Score   of  game    was:    0

【问题讨论】:

    标签: c linked-list malloc


    【解决方案1】:

    您的add_player 函数返回一个指向包含新播放器的节点的指针——并且与先前存在的列表没有任何连接(变量first_player 甚至从未使用过)。

    您的readFile 函数使用它,每次读取新玩家的名字时都会丢弃旧列表:

    *lineup = add_player(*lineup, player);
    

    所以结果列表只包含最后一个玩家。

    【讨论】:

    • 看起来像内存泄漏。
    • @FiddlingBits:这是内存泄漏,但更糟糕的是它是数据丢失。
    【解决方案2】:

    正如 Beta 所说,您没有将玩家连接到列表中。您可以保留指向最后一个元素的指针,该指针是您从 readFile 修改的:

    void readFile(Player **lineup, const char* file){
        Player* last = NULL;
        FILE *input;
        input = fopen(file, "r");
        if(input == NULL){
            printf("Failed to open");
        }
        char player[MAX_STR_LEN];
        while(fscanf(input, "%s", &player) != EOF){
            //      printf("\n%s", player);
            Player* p = add_player(player);
            if (!last)
              *lineup = p;
            else 
              last->next = p;
            last = p;
        }
    }
    

    函数 add_player 只是创建了一个新播放器,所以我将它重命名为:create_player(const char* name)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-29
      • 2023-03-28
      • 2023-03-16
      • 2010-10-24
      • 2014-03-02
      • 2020-04-10
      • 1970-01-01
      • 2017-08-16
      相关资源
      最近更新 更多