1 / 46

Understanding NULL and Recursion in C Programming

Learn about the significance of NULL in C programming, covering file operations, recursion, and tree representation for efficient coding. Understand binary tree concepts like depth and counting using recursive cases.

nathany
Download Presentation

Understanding NULL and Recursion in C Programming

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Week 7 Part 2 • Kyle Dewey

  2. Overview • NULL • Recursion • Exam #2 Review

  3. NULL

  4. Recall... • When a file can’t be opened with fopen, it returns NULL • NULL is a special value in C

  5. NULL • Is zero at the binary representation • Is a pointer • Can be assigned to any pointer type char* string = NULL; int* arr = NULL;

  6. NULL • Can be used as a sentinel value • Often used to show that an operation couldn’t be performed • Return NULL if we can’t open a file, etc.

  7. Example #define LENGTH 4 int array[] = { 1, 2, 3, 4 }; int* subarray( int start ) { if ( start >= 0 && start < LENGTH ) { return &(array[ start ]); } else { return NULL; } }

  8. Caveats • If we try to dereference a NULL pointer, the program will crash, usually with a segmentation fault • This means it tried to access memory that it didn’t have permission to access char* string = NULL; string[ 2 ] = ‘f’; // crash printf( “%s\n”, string ); // crash

  9. Caveat • It can also make code trickier • Is NULL a possible value? • In real code, there are places where NULL is impossible but people check anyway (and vice-versa!)

  10. Recursion

  11. Binary Tree • Mathematical concept • A special kind of graph

  12. Counting • Basic operation: how many nodes are in the tree?

  13. Depth • Basic operation: how deep is the tree?

  14. Representation • Nodes: the circles • Edges: things that connect the circles • Nodes in a binary tree have at most two edges connecting to other nodes • No cycles

  15. Representation • Each node has two edges • An edge is either connected or it’s not

  16. Code Representation • Hint: nodes should be represented as structs • What would this definition look like?

  17. Code Representation • Hint: nodes should be represented as structs • What would this definition look like? struct Node { struct Node* left; struct Node* right; };

  18. Code Representation • Represent nodes as struct Nodes • If there is not a connection, use NULL struct Node { struct Node* left; struct Node* right; };

  19. Recursion • A struct Node holds pointers to other struct Nodes • A struct Node is defined in terms of itself!

  20. Recursion • In general, this means there is something defined in terms of itself • Can be data structures (like structs) • Can be functions (a little later) • Broken up into recursive cases and base cases

  21. Base Case • Something not defined in terms of itself • Act to end the recursion • Can be multiple base cases • For a struct Node, this means NULL

  22. Recursive Case • Case that is defined in terms of itself • This is a struct Node that connects to another struct Node

  23. Tree as a Whole • How to represent this? • Interesting note: there are subtrees

  24. Tree as a Whole • Can simply use a struct Node without anything else • This is a very flexible representation

  25. Operations • So keeping this representation in mind...

  26. Counting • Basic operation: how many nodes are in the tree?

  27. Base Case • A tree that is not there (i.e. NULL) has no nodes (i.e. 0 nodes)

  28. Base Case • A tree that is not there (i.e. NULL) has no nodes (i.e. 0 nodes) if ( node == NULL ) { return 0; }

  29. Recursive Case • Given: • The number of nodes on the left • The number of nodes on the right • How many nodes are here? ... ... (3 nodes) (2 nodes)

  30. Recursive Case ... ... (3 nodes) (2 nodes) (3) (2) (current node) nodesLeft + nodesRight + 1;

  31. Full Code

  32. Depth • Basic operation: how deep is the tree?

  33. Base Case • A tree that is not there (i.e. NULL) has no depth (i.e. 0)

  34. Base Case • A tree that is not there (i.e. NULL) has no depth (i.e. 0) if ( node == NULL ) { return 0; }

  35. Recursive Case • Given: • The depth of the tree on the left • The depth of the tree on the right • How deep is the tree? ... ... (depth 3) (depth 2)

  36. Recursive Case ... ... (depth 3) (depth 2) (3) (2) (current node) max( depthLeft, depthRight ) + 1

  37. Full Code

  38. Exam #2

  39. Exam #2 • Exam is unintentionally cumulative • Still need to know how to use if, assignment, etc. • Will not focus on that material

  40. Focus • Functions • Prototype • Definition • Calls • For all of these, what it is and how to do it

  41. Focus • Loops (while, do/while, for) • How to read them • How to write them • Be able to say what code does (i.e. the variable x is 5 after this code runs)

  42. Focus • Arrays • Initialize them • Index into them to get / set values • “Given an array of length 10, find the first element that...”

  43. Focus • File I/O • Opening / closing • Reading / writing

  44. Focus • Types • Be able to identify the type of an expression • Just like last time, except now pointers are fully in the mix

  45. Focus • Structs • You will not have to trace crazy pointer logic • You will need to know how to access them and set fields in them • Know what -> does

  46. Don’t Worry About • Recursion • typedef

More Related