Could some one help me out with the basics of Structures ? How to use them in C programs ? etc..
Thanx in advance.
Jump to PostHere is a demo of sorting an array of struct (the array holds a 'Contact list'.)
typedef struct Contacts { char name[16]; int area; int phone; } Contacts;
Here is the program:
/* C qsort examples ... NOTE: needs a C compiler with …
Hi, Structures are those with which you can wrap together variables of different datatypes. But the memory is allocated separately which is the only difference with unions.
For a detailed description of your question , pls visit
http://www.fixoncloud.com/Home/LoginValidate/OneProblemComplete_Detailed.php?problemid=311
Hope i answered your question completely.
Here is a demo of sorting an array of struct (the array holds a 'Contact list'.)
typedef struct Contacts
{
char name[16];
int area;
int phone;
} Contacts;
Here is the program:
/*
C qsort examples ...
NOTE: needs a C compiler with qsort and const var's
demos ... qsort ...
sorting an array of struct on various fields ... and combined fields
sorting an array of C strings with (and without) ignoring case
sorting an array of int's
*/
/* this version 2010-05-16 */
/* http://developers-heaven.net/forum/index.php/topic,46.0.html */
#include <stdio.h>
#include <stdlib.h> /* qsort */
#include <string.h>
#include <ctype.h> /* tolower */
typedef struct Contacts
{
char name[16]; /* max length of name is 15 char's ... */
int area;
int phone;
} Contacts;
/* will only handle ints where difference is a valid int ... */
int compareInt( const void* x, const void* y )
{
return( *(const int*)x - *(const int*)y );
}
int compareStr( const void* x, const void* y )
{
return strcmp( *(const char**)x, *(const char**)y );
}
int compareStrIgnoreCase( const void* x, const void* y )
{
const char* s1 = *(const char**)x;
const char* s2 = *(const char**)y;
while( *s1 != 0 && *s2 != 0 )
{
if( tolower(*s1) != tolower(*s2) )
break;
++s1; ++s2;
}
/* now test end conditions .... */
return tolower(*s1) - tolower(*s2);
}
int compareContactsNameIgnoreCase( const void* x, const void* y )
{
const Contacts* c1 = (const Contacts*)x;
const Contacts* c2 = (const Contacts*)y;
int i = 0;
while( c1->name[i] != 0 && c2->name[i] != 0 )
{
if( tolower(c1->name[i]) != tolower(c2->name[i]) )
break;
++i;
}
/* now test end conditions .... */
if( c1->name[i] == 0 && c2->name[i] == 0 )
{
if( c1->area == c2->area ) return c1->phone - c2->phone;
else return c1->area - c2->area;
}
/* else ... */
return tolower(c1->name[i]) - tolower(c2->name[i]);
}
int compareContactsPhone( const void* x, const void* y )
{
const Contacts* c1 = (const Contacts*)x;
const Contacts* c2 = (const Contacts*)y;
if( c1->area == c2->area && c1->phone == c2->phone )
return strcmp(c1->name, c2->name);
if( c1->area == c2->area )
return c1->phone - c2->phone;
return c1->area - c2->area;
}
void print_book( const Contacts c[], int size );
int main () /* * * * * * * * * * MAIN BEGINS * * * * * * * * * * * */
{
/* get some test data into arrays of type struct, C string, int ... */
Contacts book[] =
{
{"joe", 416, 4442388}, {"zam", 519, 1234567}, {"anne", 705, 1234455},
{"Tam", 905, 5555555}, {"Fran", 416, 7778900}, {"Anne", 705, 1116789 }
};
char* aryStr[] = { "joe", "zam", "anne", "Tam", "Fran", "Anne" };
int values[] = { 40, 10, 100, -1, 123, -7, 0, 90, 20, 25 };
/* qsort an array of type int ... */
int i,
len = sizeof values / sizeof values[0];
qsort( values, len, sizeof(int), compareInt );
for( i = 0; i < len; ++i )
printf( "%d ", values[i] );
putchar( '\n' );
/* qsort an array of type C string, i.e. an array of pointers to char ... */
len = sizeof aryStr / sizeof aryStr[0];
qsort( aryStr, len, sizeof(char*), compareStr );
for( i = 0; i < len; ++i )
printf( "%s ", aryStr[i] );
putchar( '\n' );
/* or sorted with case ignored ... */
qsort( aryStr, len, sizeof(char*), compareStrIgnoreCase );
for( i = 0; i < len; ++i )
printf( "%s ", aryStr[i] );
putchar( '\n' );
/* show unsorted array of struct ... */
len = (sizeof book / sizeof book[0]);
print_book( book, len );
putchar( '\n' );
/* sort array of struct under name field FIRST ... and ignore case ... */
qsort( book, len, sizeof(Contacts), compareContactsNameIgnoreCase );
print_book( book, len );
putchar( '\n' );
/* sort array of struct under phone fieldS FIRST ... */
qsort( book, len, sizeof(Contacts), compareContactsPhone );
print_book( book, len );
printf( "\nPress 'Enter' to continue ... " );
getchar();
return 0;
}/* * * * * * * * * * * * * * MAIN ENDS * * * * * * * * * * * * * * */
void print_book( const Contacts c[], int size )
{
int i;
for( i = 0; i < size; ++i )
printf( "%-15s %3d-%7d\n", c[i].name, c[i].area, c[i].phone );
}
We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.