im new to programming and learning data structures at the moment, i am working on a program that takes input from a file in the following format :
*TEAM1
1-player1
2-player2
3-player3
4-player4
5-player5
6-player6
7-player7
8-player8
9-player9
10-player10
11-player11
12-player12
13-player13
14-player14
15-player15
16-player16
17-player17
18-player18
19-player19
20-player20
21-player21
22-player22
*TEAM2
1-player1
2-player2
3-player3
4-player4
5-player5
6-player6
7-player7
8-player8
9-player9
10-player10
11-player11
12-player12
13-player13
14-player14
15-player15
16-player16
17-player17
18-player18
19-player19
20-player20
21-player21
22-player22
23-player23
24-player24
25-player25
im using a nested linked list because I need each team have its own linked list of players, and if there are more than 11 players in the team they will be inserted into a queue for the same team only
these are the linked lists I created:
typedef struct PLAYERS{
int num;
char name [50];
struct PLAYERS* next;
}PLAYERS;
typedef struct QUEUE{
PLAYERS* front;
PLAYERS* rear;
}QUEUE;
typedef struct teamList{
char code [50];
PLAYERS* player;
QUEUE* playerQueue;
struct teamList* next;
}teamList;
my issue Right now is when I try to insert values from the file in the "Player" linked list part of the nested linked list. it seems like it only saves the latest value inserted into it only, that was made clear to me when I tried to print the contents of the player linked list for a specific team and it only printed the last inserted value, which was 11-player11
, then when I tried to print the next value in the list the program finished executing with a NULL value, which im assuming means I tried to print the NULL value the list is pointing at.
here are the parts of the code related to this issue:
teamList* MakeEmptyList(teamList* L) {
L = (teamList*)malloc(sizeof(teamList));
if(L == NULL)
printf("Out of memory!\n");
L->player = makePlayer(L->player); ;
L->playerQueue = makeQueue(L->playerQueue);
L->next = NULL;
return L;
}
PLAYERS* makePlayer(PLAYERS* player){
player = (PLAYERS*)malloc(sizeof(PLAYERS));
player->next = NULL;
return player;
}
void readFile(teamList* team){
teamList* temp = team;
FILE *f = fopen("teamsinfo.txt","r");
int i, counter = 1;
char playerName [50];
char teamCode [50];
if(fscanf(f," *%s",teamCode)> 0){
printf("*%s\n", teamCode);
strcpy(temp->code,teamCode);
}
while(!feof(f)){
if(fscanf(f," *%s",teamCode)> 0){
counter = 1;
temp->next = MakeEmptyList(temp->next);
temp =temp->next;
strcpy(temp->code,teamCode);
}
else if(counter<12){
if(fscanf(f," %d-%s",&i,playerName)> 0){
temp->player = insert(playerName,i,temp->player);
temp->player = temp->player->next;
}
counter ;
}
else if(counter >11){
if(fscanf(f," %d-%s",&i,playerName)> 0){
enQueue(temp->playerQueue,playerName,i);
}
}
}
fclose(f);
}
PLAYERS* insert(char x[],int num, PLAYERS* p) {
PLAYERS* temp ;
temp = (PLAYERS*)malloc(sizeof (PLAYERS));
strcpy(temp->name,x);
temp->num = num;
temp->next=p->next;
p->next=temp;
return p;
}
how can this be solved?
CodePudding user response:
Give this a try. It loads and displays the test file.
while ( ! feof ( f))
is almost always wrong. Why is “while( !feof(file) )” always wrong? has an explanation.
This uses while ( fgets (...))
to read the file, line by line.
Then use sscanf
to parse the lines.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct PLAYERS {
int num;
char name[50];
struct PLAYERS* next;
} PLAYERS;
typedef struct QUEUE {
PLAYERS* front;
PLAYERS* rear;
} QUEUE;
typedef struct teamList {
char code [50];
PLAYERS* player;
QUEUE* playerQueue;
struct teamList* next;
} teamList;
teamList *readFile ( teamList* team);
PLAYERS* makePlayer ( PLAYERS* player);
QUEUE* makeQueue ( QUEUE* q);
void DeleteTeamList ( teamList* L);
teamList* MakeEmptyList ( teamList* L);
QUEUE *enQueue ( QUEUE* q, char names[], int number);
teamList *insert ( char y[], int num, teamList* p);
void printStrings ( teamList* x);
int main ( void) {
teamList* teams = NULL;
// teams = MakeEmptyList ( teams);
teams = readFile ( teams);
printStrings ( teams);
DeleteTeamList ( teams);
}
teamList *readFile(teamList* team) {
int i = 0;
int counter = 1;
char playerName[50] = "";
char teamCode[50] = "";
char text[100] = "";
teamList* temp = team;
FILE *f = NULL;
if ( NULL != ( f = fopen("teamsinfo.txt","r"))) {
while( fgets ( text, sizeof text, f)) {
if( 1 == sscanf ( text, " *Is", teamCode)) {
counter = 1;
if ( temp) {
temp->next = MakeEmptyList ( temp->next);
temp = temp->next;
} else {
temp = MakeEmptyList ( temp);
team = temp;
}
strcpy ( temp->code, teamCode);
} else if ( 2 == sscanf ( text, "%d-%s", &i, playerName)) {
if ( counter < 12) {
temp = insert ( playerName, i, temp);
} else if ( counter > 11) {
temp->playerQueue = enQueue ( temp->playerQueue, playerName, i);
}
counter ;
}
}
fclose ( f);
} else {
perror ( "teamsinfo.txt");
}
return team;
}
PLAYERS* makePlayer ( PLAYERS* player) {
player = malloc ( sizeof *player);
player->next = NULL;
return player;
}
QUEUE* makeQueue ( QUEUE* q) {
q = malloc ( sizeof *q);
q->front = q->rear = NULL;
return q;
}
void DeleteTeamList ( teamList* L) {
teamList* P = NULL;
teamList* temp = NULL;
P = L;
while(P != NULL) {
PLAYERS *player = P->player;
while ( player != NULL) {
PLAYERS *hold = player->next;
free ( player);
player = hold;
}
player = P->playerQueue->front;
while ( player != NULL) {
PLAYERS *each = player->next;
free ( player);
player = each;
}
temp = P->next;
free ( P);
P = temp;
}
}
teamList* MakeEmptyList ( teamList* L) {
if(L != NULL) {
DeleteTeamList( L );
}
if ( NULL == ( L = malloc ( sizeof *L))) {
fprintf ( stderr, "problem malloc L\n");
return NULL;
}
L->player = NULL;
L->playerQueue = NULL;
L->next = NULL;
return L;
}
QUEUE *enQueue ( QUEUE* q, char names[], int number) {
QUEUE* temp = q;
if ( ! temp) {
temp = makeQueue ( temp);
}
PLAYERS *player = NULL;
if ( NULL == ( player = calloc ( 1, sizeof *player))) {
fprintf ( stderr, "problem calloc player\n");
return q;
}
strcpy ( player->name, names);
player->num = number;
if ( ! q || ! q->rear) {
temp->front = temp->rear = player;
printf("----------------- %d-%s -----------------------\n"
,temp->rear->num, temp->rear->name);
return temp;
}
player->next = q->rear;
q->rear = player;
printf("----------------- %d-%s -----------------------\n"
,q->rear->num, q->rear->name);
return q;
}
teamList *insert ( char x[], int num, teamList* p) {
PLAYERS* temp;
temp = malloc ( sizeof *temp);
strcpy ( temp->name, x);
temp->num = num;
temp->next = p->player;
p->player = temp;
return p;
}
void printStrings ( teamList* x) {
teamList* p = x;
while ( p != NULL) {
PLAYERS *players = p->player;
while ( players != NULL) {
printf ( "%s\n", p->code);
printf ( "%d-%s\n", players->num, players->name );
players = players->next;
}
p = p->next;
}
printf("\n");
}