Dynamic Allocation and Linked Lists

Download Report

Transcript Dynamic Allocation and Linked Lists

Dynamic Allocation
and Linked Lists
Dynamic memory allocation in C
• C uses the functions malloc() and free() to
implement dynamic allocation.
• malloc is defined in <stdlib.h> header files.
• malloc returns a void pointer.
• the pointer returned from malloc requires a
type cast to make it usable. (void *: just a
memory address)
Null Pointers
• When a memory allocation function is
called, there’s always a possibility that it
won’t be able to locate a block of memory
large enough to satisfy the requres.
• A null pointer will be returned.
• Test the return value:
p = malloc(10000);
if(p == NULL){
}
Example
struct rec
{
char
LastName[41];
char
FirstName[41];
};
struct rec *r;
r = (struct rec *) malloc(sizeof(struct rec));
Freeing Memory
• Memory allocated with malloc must be
released after you are done with them.
• this memory is released by calling the
function free().
• free expects as an argument the pointer
returned by malloc.
• free( r );
Allocate Memory for Arrays
int *p; // one dimension
int **q; // tow dimension
int i;
p = (int *) malloc( sizeof(int) * n);
q = (int **) malloc( sizeof(int*) * n);
for(i=0; i<n; ++i)
{
q[i] = (int *) malloc( sizeof(int) * n);
}
//……
free(p);
free(q);
The “Dangling Pointer” Problem
char *p = malloc(4);
….
free(p);
….
strcpy(p, “abc”); // WRONG
Linked List
• A linked list is a basic data structure.
• For easier understanding divide the linked
list into two parts.
• Nodes make up linked lists.
• Nodes are structures made up of data and a
pointer to another node.
• Usually the pointer is called next.
Nodes
struct node
{
struct rec r;
struct node *next;
};
LIST
• The list will contain a pointer to the start of
the list.
• For our purposes all data will be added to
the start of the list.
• Initialize the start pointer to NULL.
Creating a New Node
• Allocate space for a new node.
• Set the next pointer to the value of NULL
• Set the data value for the node.
Adding Nodes to the List
• If the start node is null then the start node
becomes the new node.
• If start is not null then start becomes the
new node’s next and the start becomes the
new node.
START
Data
Next
START
Data
Next
START
Data
Next
START
Data
Next
Deleting a node
P
I want to delete Q
Q
R
Deleting a node
P
P->next = Q->next;
Q->next = NULL;
Free(Q);
I want to delete Q
Q
R