Tin h c c s 3
ọ ơ ở
Structure
Outline
• Structured Data types • Structures as function arguments • Self-referential types: linked list
Lê Nguyên Khôi 2
Structure
• 2nd aggregate data type: struct
• Recall: aggregate meaning "grouping"
– Recall array: collection of values of same type – Structure: collection of values of different types
• Treated as a single item, like arrays
• Major difference: Must first "define" struct
– Prior to declaring any variables
Lê Nguyên Khôi 3
Structure
• Many structured collections of data are:
– Heterogeneous (components are different types) – Fixed-size (well-defined set of components)
• For example:
Student Record
Name
Nguyen Van A
Student Id
1234567
Course
INT1005
Date of Birth
01/01/1993
Gender
Male
Lê Nguyên Khôi 4
Structured Data Types
• A structure is a collection of variables, perhaps of different types, grouped together under a single name.
• Structures:
– Help to organize complicated data into manageable
entities.
– Expose the connection between data within an entity – Are defined using the struct keyword. – Sometimes referred as records.
Lê Nguyên Khôi 5
Structured Data Types
• Define struct globally (typically) • No memory is allocated
– Just a “placeholder” for what struct will “look like”
• To define struct, we must give:
– Name of struct – Name of each field – Type of each field (could be another record/struct)
Lê Nguyên Khôi 6
Defining Struct
• Defining a new data type using struct
name of new "type"
member names
“;” after “}”
struct date { int day; int month; int year; }; struct date yesterday;
• Once defined, this new data type could be used as other
data types: –Variable of this type could be assigned to another variable of the same type –Variable of this type could be passed as a parameter to a function 7
Lê Nguyên Khôi
Declare Structure Variable
• With structure type defined, now declare
variables of this new type: struct date today; – Just like declaring simple types – Variable today now of type struct date – It contains "member values" • Each of the struct "parts"
Lê Nguyên Khôi 8
Accessing Structure Members
• Dot Operator to access members
– today.day – today.month – today.year
• Called "member variables"
– The "parts" of the structure variable – Different structs can have same name member
variables
• No conflicts
Lê Nguyên Khôi 9
Defining New Type Struct
• Could use typedef to define a new type struct
typedef struct date Date;
• And then we could use Date as other basic type
without the need of including struct Date today;
• Compare to previous declaration of yesterday
struct date yesterday;
Lê Nguyên Khôi 10
Structure Example
void printData(Date today) { printf("The day is: %i", today.day); printf("The month is: %i", today.month); printf("The year is: %i", today.year); }
void getData(Date *today);
Lê Nguyên Khôi 11
Structure Initialization
• Can initialize at declaration
– Example:
struct date { int day; int month; int year; }; typedef struct date Date; Date dueDate = {31, 12, 2013};
– Declaration provides initial data to all three
member variables Lê Nguyên Khôi
12
Structure Assignments
• Given structure named Fruit
• Declare two structure variables:
Fruit apples, oranges; – Both are variables of type "Fruit" – Simple assignments are legal:
apples = oranges;
• Simply copies each member variable from apples
into member variables from oranges
Lê Nguyên Khôi 13
Structure Other Operations
• Operations which are NOT defined for struct type:
– compare for equality/inequality
(i.e. apples == oranges is not a legal expression)
– compare based on ordering (<, >, ...)
(i.e. apples < oranges is not a legal expression)
(i.e. apples + oranges is not a legal expression)
– arithmetic operations – reading from or writing to text files
(i.e. no printf(apples) no scanf(&oranges)) • If you need such operations, write your own
functions.
Lê Nguyên Khôi 14
Structure and Pointer
• As for other types:
– (struct x)* is a pointer to struct x – & gives the address of a structure
• There are precedence problems because . binds
•
more tightly than * If p is a pointer to a struct and a is a field of the struct: – *p.a means *(p.a) which is ILLEGAL. – You must use (*p).a – For convenience , the operator -> combines indirection and
component selection.
– p->a is equivalent to (*p).a
Lê Nguyên Khôi 15
Structure and Pointer
struct point {
int x, y;
}; struct point a; struct point *ap; ap = &a; *ap.x = 0; /* wrong */ /* equivalent to *(ap.x) = 0;*/ (*ap).y = 0; /* right */ ap->x = 0; /* right */
Lê Nguyên Khôi 16
Structure and Pointer
void getData(Date *today) { printf("Enter day: "); scanf("%i", &((*today).day)); printf("Enter month: "); scanf("%i", &(today->month)); printf("Enter year: "); scanf("%i", &today->year); }
Lê Nguyên Khôi
Structure as Function Argument
• Passed like any simple data type
– Pass-by-value – Pass-by-reference – Or combination
• Can also be returned by function
– Return-type is structure type – Return statement in function definition sends structure variable back to caller
Lê Nguyên Khôi 18
Other Type Definition
• We can use the keyword typedef to make our
own definitions: typedef float Floating;
• This means variables can be declared as
Floating but they will actually be of type float. • If we later decide we need more precision, we
can change to: typedef double Floating; without changing the codes.
Lê Nguyên Khôi 19
Combining struct and typedef
struct employee { char name[30]; int id; char position[20]; float salary; }; typedef struct employee Employee; Employee john;
• Note: we use the convention that the name of the defined type is the same as the struct modifier, but with the first letter capitalized. Lê Nguyên Khôi
20
Self-referential types
• A very powerful programming technique is to
create struct with fields which contain a reference to an object in the same struct. For example: struct list_node { int data; struct list_node *next; };
• This approach can be used to create some
very useful data structures.
Lê Nguyên Khôi 21
Linked Lists
• Consider the following data structure:
– A list that grow over time – Items are added one by one – Each item is a number • It might grow like this:
Lê Nguyên Khôi 22
Linked Lists
• How do you implement such a list in C++? • You can use an array but you must check the array doesn't overflow and allocate memory for a new larger array if the array fills.
• Can be implemented using a self-referential type. • Each element in the linked list need:
– some information (the data) – a connection to the next item
• The individual elements in data structures like this
are often called nodes.
Lê Nguyên Khôi 23
Linked Lists
• A node could be represented by this
struct list_node { int data; struct list_node *next; };
• How can we represent the whole list? • We need a pointer to the first node:
struct list_node *list_start; • How can we represent the ``end of list''? The next field of the struct will be NULL.
Lê Nguyên Khôi 24
Linked Lists
Lê Nguyên Khôi 25
Linked Lists
• Some methods: – insert a node – append a node – delete a node – print a list
Lê Nguyên Khôi 26