Week 1: Introduction

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [0/102]


❖ COMP9024 26T1

Data Structures and Algorithms

[Diagram:Pic/COMP9024.png]

Helen Paik


Web Site:   http://www.cse.unsw.edu.au/~cs9024/

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [1/102]


❖ This term, your Teaching Team consists of ...

Lecturer in Charge:Helen Paik
Office:K17-501C
Email:h.paik@unsw.edu.au
Consults:non-technical/personal issue - by appointments ...
technical/course contents - Use CSE Help! (G05), or Course Forum

Course admin:Tim Arney
A team of tutors:David Choulex, Deniz Dilsiz,
Jiangze Zhou, Joey Zhou,
Kanak Maheshwari, Nimish Ukey,
Sachin Singh, Thomas Duffett,
Zhonghao Liu, Ziting Li
Email address to use:cs9024@cse.unsw.edu.au

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [2/102]


❖ Course Goals

COMP9021 …

COMP9024 … Data structures Algorithms
COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [3/102]


❖ Course Goals (cont)

COMP9021 …

[Diagram:Pic/children.jpg]

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [4/102]


❖ Course Goals (cont)

COMP9024 …
 

[Diagram:Pic/hard-work.jpg]

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [5/102]


❖ Pre-conditions

There are no prerequisites for this course.

However we will move at fast pace through the necessary programming fundamentals. You may find it helpful if you are able to:

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [6/102]


❖ Post-conditions

At the end of this course you should be able to:

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [7/102]


❖ Access to Course Material

All course information is placed on the main course website:

Bookmark the page ... a portal to all course related links (e.g., lecture content, forum, submitting assignments, viewing marks).

Access to lecture recordings on Moodle:


Always give credit when you use someone else's work.

Ideas for the COMP9024 material are drawn from

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [8/102]


❖ Schedule (topics are not absolutely fixed ...)

WeekLecturesWeekly PracWeekly TutAssignment
1Introduction, C language prac exercise --
2Analysis of algorithms prac exercise problem set
3Dynamic data structures prac exercise problem set
4Graph data structures prac exercise problem set
5Graph algorithms prac exercise problem setLarge Assignment
6Break --|
7Search tree data structuresprac exercise problem set|
8Search tree algorithms prac exercise problem set|
9String algorithmsprac exercise problem set|
10Randomised algorithms, Review prac exercise problem set| due
Exam Week (Central)Final Exam (on campus) --

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [9/102]


❖ Resources

Textbook is a "double-header"

[Diagram:Pic/AlgsP1-5.jpg]

Good books, useful beyond COMP9024 (but coding style …)

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [10/102]


❖ Resources (cont)

Supplementary textbook:

[Diagram:Pic/moffat.jpg]

Also, numerous online C resources are available.

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [11/102]


❖ Lectures

Lectures will:

Lectures provide an alternative view to textbook

Lecture slides will be made available before lecture

Feel free to ask questions, but No Idle Chatting (disrupts others!)

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [12/102]


❖ Weekly Practicals

In weeks 1-5, 7-10 :

Weekly Practicals (programming exercises) contribute 16% to overall mark ( 2 marks each x 8, best 8 chosen out of 9).

Do them yourself!   and   Don't fall behind!

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [13/102]


❖ Weekly Tutorials (problem sets)

The weekly tutorials/classes, with tutors, aims to:

You may bring your own laptop to access materials or take notes

Important - tutorials are not marked; however, they provide an opportunity for a more intimate classroom experience where you can interact more closely with the tutors and other students.

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [14/102]


❖ Large Assignment

The large assignment gives you experience applying tools/techniques
(but to a larger programming problem than the homework)

The assignment will be carried out individually.

The assignment will be released late Week 5 (or sometime in Week 6 ...) and is due in week 10.

The assignment contributes 24% to overall mark.

The late penalty is a per-day mark reduction equal to 5% of the max assessment mark for up to 5 days.

For example, if an assignment that would receive an on-time mark of 16/24 is submitted 3 days late, it should receive a mark of 12.4/24 (16-(24*0.05*3)).

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [15/102]


❖ Large Assignment (cont)

Advice on doing assignments:

They always take longer than you expect.

Don't leave them to the last minute.

Organising your time no late penalty.

If you do leave them to the last minute:

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [16/102]


❖ Plagiarism

[Diagram:Pic/plagiarism.jpg]

Just Don't Do it

We get very annoyed by people who plagiarise.

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [17/102]


❖ Plagiarism (cont)

Examples of Plagiarism (student.unsw.edu.au/plagiarism):

  1. Copying

    Using same or similar idea without acknowledging the source
    This includes copying ideas from a website, internet

  2. Collusion

    Presenting work as independent when produced in collusion with others
    This includes students providing their work to another student

    • which includes using any form of publicly readable code repository

Any submission based on a work of another student, or a code repository (e.g., github), or generative AI tools (e.g., ChatGPT), or contracted work is considered cheating.

Your submissions will be checked for and will be reported to the Academic Integrity Unit at UNSW.

What about ...

Find and read the use of AI policy from the course homepage

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [18/102]


❖ Final Exam

2-hour torture written exam during the exam period.

Format:

The final exam contributes 60% to overall mark.

Must score at least 25/60 in the final exam to pass the course.

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [19/102]


❖ Final Exam (cont)

How to pass the Final Exam:

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [20/102]


❖ Assessment Summary

weekly_lab   = mark for weekly program exercises (out of 2*(best 8 out of 9)) 
large_assn   = mark for large assignment (out of 24)
exam         = mark for final exam       (out of 60)

if (exam >= 25)
   total = weekly_lab + mid_term + large_assn + exam
else
   total = exam * (100/60)

To pass the course, you must achieve:

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [21/102]


❖ Summary

The goal is for you to become a better Computer Scientist

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [22/102]


❖ C Programming Language

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [23/102]


❖ Why C?

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [24/102]


❖ Brief History of C

C and UNIX operating system share a complex history …

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [25/102]


❖ Basic Structure of a C Program

// include files
// global definitions

// function definitions
function_type f(arguments) {

   // local variables

   // body of function

  return …;
}

.
.

                                       

.
.
.
.
.

// main function
int main(arguments) {

   // local variables

   // body of main function

   return 0;
}

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [26/102]


❖ Exercise: What does this program compute?

#include <stdio.h>

int f(int m, int n) {

   while (m != n) {
      if (m > n) {
	 m = m-n;
      } else {
	 n = n-m;
      }
   }
   return m;
}

int main(void) {

   printf("%d\n", f(30,18));
   return 0;
}

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [27/102]


❖ Example: Insertion Sort in C

Insertion Sort algorithm (in Pseudo Code):

insertionSort(A):
|  Input array A[0..n-1] of n elements
|
|  for all i=1..n-1 do
|  |  element=A[i], j=i-1
|  |  while j≥0 and A[j]>element do
|  |     A[j+1]=A[j]
|  |     j=j-1
|  |  end while
|  |  A[j+1]=element
|  end for

e.g., A = [29, 10, 14, 37, 13]

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [28/102]


❖ Example: Insertion Sort in C (cont)


#include <stdio.h> // include standard I/O library defs and functions

#define SIZE 6     // define a symbolic constant

void insertionSort(int array[], int n) {  // function headers must provide types
   int i;                                 // each variable must have a type
   for (i = 1; i < n; i++) {              // for-loop syntax
      int element = array[i];                                                    
      int j = i-1;
      while (j >= 0 && array[j] > element) {  // logical AND
         array[j+1] = array[j];
         j--;                                 // abbreviated assignment j=j-1 
      }
      array[j+1] = element;                   // statements terminated by ;
   }                                          // code blocks enclosed in { } 
}

int main(void) {                              // main: program starts here
   int numbers[SIZE] = { 3, 6, 5, 2, 4, 1 };  /* array declaration
                                                 and initialisation */
   int i;
   insertionSort(numbers, SIZE);
   for (i = 0; i < SIZE; i++)
      printf("%d\n", numbers[i]);             // printf defined in <stdio>

   return 0;           // return program status (here: no error) to environment
}

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [29/102]


❖ Compiling with gcc

C source code:   prog.c
a.out   (executable program)

To compile a program prog.c, you type the following:

gcc prog.c

To run the program, type:

./a.out

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [30/102]


❖ Compiling with gcc (cont)

Command line options:

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [31/102]


❖ Sidetrack: Printing Variable Values with printf()

Formatted output written to standard output (e.g. screen)

printf(format-string, expr1, expr2, …);

format-string can use the following placeholders:

%d  decimal       %f  floating-point
%c  character       %s  string
\n  new line       \"  quotation mark

Examples:

num = 3;
printf("The cube of %d is %d.\n", num, num*num*num);

The cube of 3 is 27.

id  = 'z';
num = 1234567;
printf("Your \"login ID\" will be in the form of %c%d.\n", id, num);

Your "login ID" will be in the form of z1234567.

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [32/102]


❖ Algorithms in C

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [33/102]


❖ Basic Elements

Algorithms are built using

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [34/102]


❖ Assignments

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [35/102]


❖ Assignments (cont)

C assignment statements are really expressions


v = 5; //The value of the expression is 5.

Useful because it lets you combine: (1) collecting a value (2) testing that value, into a single expression.

Frequently, assignment is used in loop continuation tests

Example: The pattern

v = getNextItem();
while (v != 0) {
   process(v);
   v = getNextItem();
}

is often written as

while ((v = getNextItem()) != 0) {
   process(v);
}

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [36/102]


❖ Exercise: What are the final values of a and b?

  1. 
    a = 1; b = 5;
    while (a < b) {
       a++;
       b--;
    }
    

  2. 
    a = 1; b = 5;
    while ((a += 2) < b) {
       b--;
    }
    

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [37/102]


  1. a == 3, b == 3
  2. a == 5, b == 4
COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [38/102]


❖ Conditionals

if (expression) {
   some statements;
}

if (expression) {
   some statements1;
} else {
   some statements2;
}

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [39/102]


❖ Conditionals (cont)

Indentation is very important in promoting the readability of the code

Each logical block of code is indented:

// Style 1    
if (x)
{
   statements;
}

           

// Style 2 (my preference)
if (x) {
   statements;
}

           

// Preferred else-if style
if (expression1) {
   statements1;
} else if (exp2) {
   statements2;
} else if (exp3) {
   statements3;
} else {
   statements4;
}

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [40/102]


❖ Conditionals (cont)

Relational and logical operators

a > ba greater than b
a >= ba greater than or equal b
a < ba less than b
a <= ba less than or equal b
a == ba equal to b
a != ba not equal to b
a && ba logical and b
a || ba logical or b
! alogical not a

A relational or logical expression evaluates to 1 if true, and to 0 if false

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [41/102]


❖ Exercise: Conditionals

  1. What is the output of the following program fragment?

    if ((x > y) && !(y-x <= 0)) {
        printf("Aye\n");
    } else {
        printf("Nay\n");
    }
    

  2. What is the resulting value of x after the following assignment?

    x = (x >= 0) + (x < 0);
    

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [42/102]


  1. The condition is unsatisfiable, hence the output will always be

    Nay
    

  2. No matter what the value of x, one of the conditions will be true (==1) and the other false (==0)
    Hence the resulting value will be x == 1
COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [43/102]


❖ Loops

C has two different "while loop" constructs

// while loop         
while (expression) {
    some statements; 
}

               

// do .. while loop
do {
   some statements;   
} while (expression);

int x = 5;

while (x < 3) {
    printf("%d\n", x);
    x++;
}
//output: nothing

               

int x = 5;

do {
    printf("%d\n", x);
    x++;
} while (x < 3);
//output: 5

The  do .. while  loop ensures the statements will be executed at least once

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [44/102]


❖ Loops (cont)

The "for loop" in C

for (expr1; expr2; expr3) {
   some statements;
}

 
Example:    

for (i = 1; i < 10; i++) {
   printf("%d %d\n", i, i * i);
}

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [45/102]


❖ Exercise: What is the output of this program?

int i, j;
for (i = 8; i > 1; i /= 2) {
    for (j = i; j >= 1; j--) {
        printf("%d%d\n", i, j);
    }
    printf("\n");
}

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [46/102]


88
87
..
81

44
..
41

22
21


COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [47/102]


❖ Functions

Functions have the form

return-type function-name(parameters) {

    declarations

    statements

    return …;
}

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [48/102]


❖ Functions (cont)

When a function is called:

  1. memory is allocated for its parameters and local variables
  2. the parameter expressions in the calling function are evaluated
  3. C uses "call-by-value" parameter passing …
    • the function works only on its own local copies of the parameters, not the ones in the calling function
  4. local variables need to be assigned before they are used   (otherwise they will have "garbage" values)
  5. function code is executed, until the first return statement is reached
COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [49/102]


❖ Functions (cont)

When a return statement is executed, the function terminates:

return expression;

  1. the returned expression will be evaluated
  2. all local variables and parameters will be thrown away when the function terminates
  3. the calling function is free to use the returned value, or to ignore it
Example:


// Euclid's gcd algorithm (recursive version)
int euclid_gcd(int m, int n) {
    if (n == 0) {
        return m;
    } else {
        return euclid_gcd(n, m % n);
    }
}

The return statement can also be used to terminate a function of return-type void:

return;

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [50/102]


❖ Data Structures in C

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [51/102]


❖ Basic Data Types

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [52/102]


❖ Aggregate Data Types

Families of aggregate data types:

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [53/102]


❖ Arrays

An array is

Examples:

int  a[20];    // array of 20 integer values/variables
char b[10];    // array of 10 character values/variables

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [54/102]


❖ Arrays (cont)

Larger example:

#define MAX 20

int i;           // integer value used as index
int fact[MAX];   // array of 20 integer values

fact[0] = 1;
for (i = 1; i < MAX; i++) {
    fact[i] = i * fact[i-1];
}

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [55/102]


❖ Sidetrack: C Style

We can define a symbolic constant at the top of the file

#define SPEED_OF_LIGHT 299792458.0
#define ERROR_MESSAGE "Out of memory.\n"

Symbolic constants make the code easier to understand and maintain

#define NAME replacement_text

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [56/102]


❖ Sidetrack: C Style (cont)

UNSW Computing provides a style guide for C programs:

C Coding Style Guide    (http://wiki.cse.unsw.edu.au/info/CoreCourses/StyleGuide)


Not strictly mandatory for COMP9024, but very useful guideline

Style considerations that do matter for your COMP9024 assignments:

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [57/102]


❖ Sidetrack: C Style (cont)

C has a reputation for allowing obscure code, leading to …

The International Obfuscated C Code Contest

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [58/102]


❖ Sidetrack: C Style (cont)

Most artistic code (Eric Marshall, 1986)


                                                   extern int
                                                       errno
                                                         ;char
                                                            grrr
                             ;main(                           r,
  argv, argc )            int    argc                           ,
   r        ;           char *argv[];{int                     P( );
#define x  int i,       j,cc[4];printf("      choo choo\n"     ) ;
x  ;if    (P(  !        i              )        |  cc[  !      j ]
&  P(j    )>2  ?        j              :        i  ){*  argv[i++ +!-i]
;              for    (i=              0;;    i++                   );
_exit(argv[argc- 2    / cc[1*argc]|-1<4 ]    ) ;printf("%d",P(""));}}
  P  (    a  )   char a   ;  {    a  ;   while(    a  >      "  B   "
  /* -    by E            ricM    arsh             all-      */);    }

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [59/102]


❖ Sidetrack: C Style (cont)

Just plain obscure (Ed Lycklama, 1985)


#define o define
#o ___o write
#o ooo (unsigned)
#o o_o_ 1
#o _o_ char
#o _oo goto
#o _oo_ read
#o o_o for
#o o_ main
#o o__ if
#o oo_ 0
#o _o(_,__,___)(void)___o(_,__,ooo(___))
#o __o (o_o_<<((o_o_<<(o_o_<<o_o_))+(o_o_<<o_o_)))+(o_o_<<(o_o_<<(o_o_<<o_o_)))
o_(){_o_ _=oo_,__,___,____[__o];_oo ______;_____:___=__o-o_o_; _______:
_o(o_o_,____,__=(_-o_o_<___?_-o_o_:___));o_o(;__;_o(o_o_,"\b",o_o_),__--);
_o(o_o_," ",o_o_);o__(--___)_oo _______;_o(o_o_,"\n",o_o_);______:o__(_=_oo_(
oo_,____,__o))_oo _____;}

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [60/102]


❖ Strings

"String" is a special word for an array of characters

Example:

If a character array s[11] contains the string "hello", this is how it would look in memory:

  0   1   2   3   4   5   6   7   8   9   10
---------------------------------------------
| h | e | l | l | o | \0|   |   |   |   |   |
---------------------------------------------

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [61/102]


❖ Array Initialisation

Arrays can be initialised by code, or you can specify an initial set of values in declaration.

Examples:

char s[6]   = {'h', 'e', 'l', 'l', 'o', '\0'};

char t[6]   = "hello";

int fib[20] = {1, 1};

int vec[]   = {5, 4, 3, 2, 1};

In the third case, fib[0] == fib[1] == 1 while the initial values fib[2] .. fib[19] are undefined.

In the last case, C infers the array length   (as if we declared vec[5]).

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [62/102]


❖ Exercise: What is the output of this program?

 1  #include <stdio.h>
 2
 3  int main(void) {
 4     int arr[3] = {10,10,10};
 5     char str[] = "Art";
 6     int i;
 7
 8     for (i = 1; i < 3; i++) {
 9        arr[i] = arr[i-1] + arr[i] + 1;
10        str[i] = str[i+1];
11     }
12     printf("Array[2] = %d\n", arr[2]);
13     printf("String = \"%s\"\n", str);
14     return 0;
15  }

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [63/102]


Array[2] = 32
String = "At"

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [64/102]


❖ Sidetrack: Reading Variable Values with scanf() and atoi()

Formatted input read from standard input (e.g. keyboard)

scanf(format-string, expr1, expr2, …);

Converting string into integer

int value = atoi(string);

Example:


#include <stdio.h>   // includes definition of BUFSIZ (usually =512) and scanf()
#include <stdlib.h>  // includes definition of atoi()

...

char str[BUFSIZ];
int n;

printf("Enter a string: ");
scanf("%s", str);
n = atoi(str);
printf("You entered: \"%s\". This converts to integer %d.\n", str, n);


Enter a string: 9024
You entered: "9024". This converts to integer 9024.

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [65/102]


❖ Arrays and Functions

When an array is passed as a parameter to a function

Example:

int total, vec[20];
…
total = sum(vec);

Within the function …

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [66/102]


❖ Arrays and Functions (cont)

Since functions do not know how large an array is:

So, the previous example would be more likely done as:

int total, vec[20];
…
total = sum(vec,20);

Also, since the function doesn't know the array size, it can't check whether we've written an invalid subscript (e.g. in the above example 100 or 20).

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [67/102]


❖ Exercise: Arrays and Functions

Implement a function that sums up all elements in an array.

Use the prototype

int sum(int[], int)

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [68/102]


int sum(int vec[], int dim) {
   int i, total = 0;

   for (i = 0; i < dim; i++) {
      total += vec[i];
   }
   return total;
}

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [69/102]


❖ Multi-dimensional Arrays

Examples:

[Diagram:Pic/matrices.png]


Note:   q[0][1]==2.7    r[1][3]==8    q[1]=={3.1,0.1}

Multi-dimensional arrays can also be initialised (must provide # of columns):

float q[][2] = {
   { 0.5, 2.7 },
   { 3.1, 0.1 }
};

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [70/102]


❖ Sidetrack: Defining New Data Types

C allows us to define new data type (names) via typedef:

typedef ExistingDataType NewTypeName;

Examples:

typedef float Temperature;

typedef int Matrix[20][20];

Using these types

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [71/102]


❖ Sidetrack: Defining New Data Types (cont)

Reasons to use typedef:

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [72/102]


❖ Structures

A structure

Example:

typedef struct {
       char name[30];
       int  zID;
} StudentT;

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [73/102]


❖ Structures (cont)

One structure can be nested inside another:

typedef struct {
	int day, month;
} DateT;

typedef struct {
	int hour, minute;
} TimeT;

typedef struct {
	char   plate[7];   // e.g. "DSA42X"
	double speed;
        DateT  d;
	TimeT  t;
} TicketT;

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [74/102]


❖ Structures (cont)

Possible memory layout produced for TicketT object:

---------------------------------
| D | S | A | 4 | 2 | X | \0|   |    7 bytes + 1 padding
---------------------------------
|                          68.4 |    8 bytes
---------------------------------
|             2 |             6 |    8 bytes
---------------------------------
|            20 |            45 |    8 bytes
---------------------------------

 

Note: padding is needed to ensure that plate lies on an 8-byte block.

Don't normally care about internal layout, since fields are accessed by name.

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [75/102]


❖ Structures (cont)

Defining a structured data type itself does not allocate any memory

We need to declare a variable in order to allocate memory

DateT christmas;

The components of the structure can be accessed using the "dot" operator

christmas.day   =   25;
christmas.month =   12;

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [76/102]


❖ Structures (cont)

With the above TicketT type, we declare and use variables as …


#define NUM_TICKETS 1500

typedef struct {…} TicketT;

TicketT tickets[NUM_TICKETS];  // array of structs

// Print all speeding tickets in a readable format
for (i = 0; i < NUM_TICKETS; i++) {
    printf("%s %6.2f %d/%d at %d:%d\n", tickets[i].plate,
                                        tickets[i].speed,
                                        tickets[i].d.day,
                                        tickets[i].d.month,
                                        tickets[i].t.hour,
                                        tickets[i].t.minute);
}

// Sample output:
//
// DSA42X  68.40 2/6 at 20:45

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [77/102]


❖ Structures (cont)

A structure can be passed as a parameter to a function:

void print_date(DateT d) {

	printf("%d/%d\n", d.day, d.month);
}

int is_winter(DateT d) {

	return ( (d.month >= 6) && (d.month <= 8) );
}

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [78/102]


❖ Data Abstraction

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [79/102]


❖ Abstract Data Types

A data type is …

An abstract data type

[Diagram:Pic/ADT.png]

e.g. integer stackse.g. push, pop, isEmpty?

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [80/102]


❖ Abstract Data Types (cont)

Users of the ADT see only the interface

Builders of the ADT provide an implementation

ADT interface provides

ADT implementation gives
COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [81/102]


❖ Abstract Data Types (cont)

ADT interfaces are opaque

ADTs are important because …
COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [82/102]


❖ ADOs and ADTs

We want to distinguish …

Warning: Sedgewick's first few examples are ADOs, not ADTs.
COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [83/102]


❖ Example: Abstract Stack Data Object

Stack, aka pushdown stack or LIFO data structure (last in, first out)

Assume (for the time being) stacks of char values

Operations:

Applications:
COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [84/102]


❖ Example: Abstract Stack Data Object (cont)

Example of use:

Stack  Operation  Return value
?  create  -
-  isempty  true
-  push a  -
a  push b  -
a b  push c  -
a b c  pop  c
a b  isempty  false
COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [85/102]


❖ Stack vs Queue

Queue, aka FIFO data structure (first in, first out)

Insert and delete are called enqueue and dequeue

Applications:

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [86/102]


❖ Exercise: Stack vs Queue

Consider the previous example but with a queue instead of a stack.

Which element would have been taken out ("dequeued") first?

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [87/102]



a
COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [88/102]


❖ Stack as ADO

Interface (a file named Stack.h)

// Stack ADO header file

#define MAXITEMS 10

void StackInit();      // set up empty stack
int  StackIsEmpty();   // check whether stack is empty
void StackPush(char);  // insert char on top of stack
char StackPop();       // remove char from top of stack

Note:

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [89/102]


❖ Stack as ADO (cont)

Implementation may use the following data structure:

[Diagram:Pic/stack.png]

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [90/102]


❖ Stack as ADO (cont)

Implementation (in a file named Stack.c):


#include "Stack.h"
#include <assert.h>

// define the Data Structure
typedef struct {
   char item[MAXITEMS];
   int  top;
} stackRep;

// define the Data Object
static stackRep stackObject;

// set up empty stack
void StackInit() {
   stackObject.top = -1;
}

// check whether stack is empty
int StackIsEmpty() {
   return (stackObject.top < 0);
}






// insert char on top of stack
void StackPush(char ch) {
   assert(stackObject.top < MAXITEMS-1);
   stackObject.top++;
   int i = stackObject.top;
   stackObject.item[i] = ch;
}

// remove char from top of stack
char StackPop() {
   assert(stackObject.top > -1);
   int i = stackObject.top;
   char ch = stackObject.item[i];
   stackObject.top--;
   return ch;
}


COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [91/102]


❖ Exercise: Bracket Matching

Bracket matching … check whether all opening brackets such as '(', '[', '{' have matching closing brackets ')', ']', '}'

Which of the following expressions are balanced?

  1. (a+b) * c
  2. a[i]+b[j]*c[k])
  3. (a[i]+b[j])*c[k]
  4. a(a+b]*c
  5. void f(char a[], int n) {int i; for(i=0;i<n;i++) { a[i] = (a[i]*a[i])*(i+1); }}
  6. a(a+b * c
COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [92/102]


  1. balanced
  2. not balanced (case 1: an opening bracket is missing)
  3. balanced
  4. not balanced (case 2: closing bracket doesn't match opening bracket)
  5. balanced
  6. not balanced (case 3: missing closing bracket)
COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [93/102]


❖ Exercise: Bracket Matching (cont)

Bracket matching algorithm, to be implemented as a client for Stack ADO:


bracketMatching(s):
|  Input  stream s of characters
|  Output true if parentheses in s balanced, false otherwise
|
|  for each ch in s do
|  |  if ch = open bracket then
|  |     push ch onto stack
|  |  else if ch = closing bracket then
|  |  |  if stack is empty then
|  |  |     return false                    // opening bracket missing (case 1)
|  |  |  else
|  |  |     pop top of stack
|  |  |     if brackets do not match then
|  |  |        return false                 // wrong closing bracket (case 2)
|  |  |     end if
|  |  |  end if
|  |  end if
|  end for
|  if stack is not empty then return false  // some brackets unmatched (case 3)
|                        else return true

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [94/102]


❖ Exercise: Bracket Matching (cont)

Execution trace of client on sample input:

( [ { } ] )

Next char  Stack  Check
- empty -
( ( -
[ ( [ -
{ ( [ { -
} ( [ {  vs  }   ✓
] ( [  vs  ]   ✓
) empty (  vs  )   ✓
eof empty -
COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [95/102]


❖ Exercise: Bracket Matching Algorithm

Trace the algorithm on the input

void f(char a[], int n) {
   int i;
   for(i=0;i<n;i++) { a[i] = a[i]*a[i])*(i+1); }
}

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [96/102]


Next bracket  Stack  Check
start empty -
( ( -
[ ( [ -
] ( 
) empty 
{ { -
( { ( -
) { 
{ { { -
[ { { [ -
] { {  
[ { { [ -
] { {  
[ { { [ -
] { {  
) { false
COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [97/102]


❖ Exercise: Implement Bracket Matching Algorithm in C

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [98/102]


❖ Managing Abstract Data Types and Objects in C

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [99/102]


❖ Compilers

Compilers are programs that

The Gnu C compiler (gcc)

[Diagram:Pic/gcc.png]

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [100/102]


❖ Compilers (cont)

Compilation/linking with gcc

gcc -c Stack.c
produces Stack.o, from Stack.c and Stack.h

gcc -c brackets.c
produces brackets.o, from brackets.c and Stack.h

gcc -o rbt brackets.o Stack.o
links brackets.o, Stack.o and libraries
producing executable program called rbt

Note that stdio,assert included implicitly.

gcc is a multi-purpose tool

COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [101/102]


❖ Summary


COMP9024 26T1 ♢ Elementary Data and Control Structures in C ♢ [102/102]



Produced: 19 Feb 2026