I need to do is read in an input file into a linked list. Part of the file is:
NameA, 25
NameB, 33
NameC, 23
NameD, 39
And after i need to sort by the number (bubble sort) and write it to another file.
Here is what i have:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node{
char name[20];
int number;
struct node *next;
struct node *prev;
}*head;
int main(void) {
struct node *temp;
temp = malloc(sizeof(struct node));
temp->next = NULL;
head = temp;
FILE *ifp;
char fnamer[100] = "";
char line[128];
// printf("\n\nPlease Enter the Full Path of the file: \n");
// scanf("%s",&fnamer);
ifp = fopen("mintaadatok.txt", "r");
if (ifp == NULL) {
printf("\n%s\" File NOT FOUND!", fnamer);
exit(1);
}
int c = 0;
char buffer[1024];
memset(buffer, 0, 1024);
while (c < 15) {
fgets(buffer, 1024, ifp);
sscanf(buffer, "%19[^,], %d", temp->name, &temp->number);
printf("%d %s %d\n", c, temp->name, temp->number);
temp->next = malloc(sizeof(struct node));
temp = temp->next;
temp->next = NULL;
c++;
}
int i,step;
for (temp = head; temp; temp = temp->next) {
printf("%s", temp->name);
printf("%d\n", temp->number);
for(step=0;step<10-1;++step)
for(i=0;i<10-step-1;++i)
{
temp->next = malloc(sizeof(struct node));
if(temp->number>temp->next)
{
temp=temp->number;
temp->number=temp->next;
temp->next=temp;
}
}
}
printf("In ascending order: ");
}
Can you help me to sort these data?
We beginners should help each other.:)
I did not look through all your code. However it is obviously incorrect for example due to the incorrect order of allocations of nodes in this loop
while (c < 15) {
fgets(buffer, 1024, ifp);
sscanf(buffer, "%19[^,], %d", temp->name, &temp->number);
printf("%d %s %d\n", c, temp->name, temp->number);
temp->next = malloc(sizeof(struct node));
temp = temp->next;
temp->next = NULL;
c++;
}
So the last node will have data members with indeterminate values except the data member next
.
I am trying to answer your question how to write a bubble sort function for a singly-linked list.
To write a bubble sort function for a singly-linked list is not an easy task for such beginners as you and me. For example you need to write correctly a swap function for nodes of the list.
Here you are.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node
{
char name[20];
int id;
struct node *next;
};
int push_back( struct node **head, const char *name, int id )
{
struct node *tmp = malloc( sizeof( struct node ) );
int success = tmp != NULL;
if ( success )
{
while ( *head != NULL ) head = &( *head )->next;
strcpy( tmp->name, name );
tmp->id = id;
tmp->next = NULL;
*head = tmp;
}
return success;
}
void display( struct node **head )
{
for ( struct node *current = *head; current != NULL; current = current->next )
{
printf( "{ %s, %d } ", current->name, current->id );
}
}
void swap( struct node **current )
{
struct node *tmp = ( *current )->next->next;
( *current )->next->next = *current;
*current = ( *current )->next;
( *current )->next->next = tmp;
}
void bubble_sort( struct node **head, int cmp( const void *, const void * ) )
{
if ( *head != NULL )
{
for ( struct node *last = NULL, *swapped = NULL; ( *head )->next != last; last = swapped )
{
swapped = ( *head )->next;
for ( struct node **first = head; ( *first )->next != last; first = &( *first )->next )
{
if ( cmp( ( *first )->next, *first ) < 0 )
{
swap( first );
swapped = ( *first )->next;
}
}
}
}
}
int cmp_id( const void *a, const void *b )
{
const struct node *left = a;
const struct node *right = b;
return ( right->id < left->id ) - ( left->id < right->id );
}
int cmp_name( const void *a, const void *b )
{
const struct node *left = a;
const struct node *right = b;
return strcmp( left->name, right->name );
}
int main(void)
{
struct node *head = NULL;
push_back( &head, "NameA", 25 );
push_back( &head, "NameB", 33 );
push_back( &head, "NameC", 23 );
push_back( &head, "NameD", 39 );
display( &head );
putchar( '\n' );
bubble_sort( &head, cmp_id );
display( &head );
putchar( '\n' );
bubble_sort( &head, cmp_name );
display( &head );
putchar( '\n' );
return 0;
}
The program output is
{ NameA, 25 } { NameB, 33 } { NameC, 23 } { NameD, 39 }
{ NameC, 23 } { NameA, 25 } { NameB, 33 } { NameD, 39 }
{ NameA, 25 } { NameB, 33 } { NameC, 23 } { NameD, 39 }
In the demonstrative program at first the list is sorted by IDs and then by names.
Thus all you need now is to build correctly the list from data in the used file.