220 likes | 330 Views
Lists, Strings & Multi-dimensional arrays. Data Storage. Static compiled into the disk-image of program always takes up space on disk & RAM usage depends on program logic Dynamic requested at runtime no space taken on disk usage as needed. Static Storage. E xamples:
E N D
Data Storage • Static • compiled into the disk-image of program • always takes up space on disk & RAM • usage depends on program logic • Dynamic • requested at runtime • no space taken on disk • usage as needed
Static Storage • Examples: static int X; // initially=0 static int Y=5; extern int Z; // initially=0 • Compiler reserves space for these • Location for Y contains the 5 • no runtime code used to put it there • All KEEP their values, even after termination of the function
Dynamic Storage • Examples: int X; int Y=5; // re-initialized at each call auto int Z; // "auto" is redundant // cannot use "auto" w/specification of a value auto int Q=5; // ILLEGAL • Compiler adds code in function-start to REQUEST RAM for automatic variables • Location for Y contains the 5 at fcn startup • runtime code IS used to put it there
Dynamic Storage - 2 int X; int *xptr; xptr = &X; //xptr points to X (holds the RAM address of X) (NOT the value of X) printf ("X=%d", *X); (print the value of what X points to)
Dynamic lists • Each node is a struct • Struct data elements are created at "malloc" time • Rules for static & auto apply • Only static, const, integer variables may be initialized in a struct • do it yourself at "malloc" time
Double-linked lists • Simplifies traversals • Slightly slower for insert/remove • No need for temp ptr for internal insert/remove • Uses more storage (trivial vs. data size) first data data data bptr bptr bptr fptr fptr fptr
Structure struct dl_list { mydatatype X; dl_list * prev; dl_list * next; };
List creation dl_list * start; // only creates a pointer start = (*dl_list) malloc (sizeof (dl_list)); // creates a SINGLE element start -> prev = &start; // pt BACK to home start -> next=NULL; // end of list // now add on a new node start -> next = (*dl_list) malloc (sizeof (dl_list)); start -> next -> next=NULL; // new end of list start -> next -> prev=start->next; //<- old end of list
Linked List Performance (textbook's names) • O(n) • Clear_list deletes the whole list • Delete_list deletes ONEentry (one node) • Insert_list inserts ONE entry (new node) • Retreive_list gets ONE value (w/o harm) • Replace_list replace ONE value (destructive) • O(k) • CreateList • ListEmpty/Full state of the list = empty (t/f) • ListSize # nodes
Other useful operations • Insert/Delete_First • Insert/Delete_Last • Swap_entries • Copy_List • Problematic for single-linked list having fptrs: • Traverse_back • Reverse_List
basics • strings are arrays • stored like arrays • accessed "like" arrays • always a collection of "char" • compiler adds the 0x00 ending IF initialized • Example char * mystring = "aha"; // length=4, incl0x00 compiler allocates space, sets ptr to it
Library functions • strcopy – copies a string • strncpy – copies 'n' chars • strcat – appends string 2 to end of string 1 • strcmp – compares 2 strings • strch – finds a char in string • strlen - returns length of string (w/o 0x00)
Danger!!! • You must always ensure the 0x00 is there • likewise, when searching, must be careful of actual max length • compiler • does NOT generate protective code • does NOT check for overruns • but DOES do it for arrays • char * Z
Syntax • Type name [d1][d2][d3] {init list}; • int X [3] [4] [5]; • Leftmost subscript varies most slowly – known as row major order
Arrays as arguments #define SIZE 10 function X (int x, int y, int a [ ] [SIZE]) ; • New standard as of 1999 implemented function X (int a[ ] [SIZE]) { ... } highest dimension is required
Dynamic arrays (1) • Requires the use of the new operator • Syntax: new Type [amount] int * ptr; // a ptr to an array of int's ptr= new int[5]; // note constant size if (dptr==NULL) … is better than if (dptr==0)…
Dynamic arrays (2) int y; cin>>y; int * ptr; // a ptr to an array of int's ptr= new int[y]; // note size determined at //run time BUT: the size of the array is still FIXED (i.e.; size does not vary during execution)
Deleting storage • Given the previous array: delete ptr; // deletes a SINGLE datum • the one memory loc that ptr refers to • Even if it's an array (only deletes array[0]) • delete [ ] ptr; // deletes the whole array
Strings • C-style strings (array of char) • char *x; x=new char [n] • Or • Using namespace std; • #include <cstring> • C++ style (true) strings • #include <string.h> • or • using namespace std; • #include <string>