* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Download PPT
Survey
Document related concepts
Transcript
Complex Structures
Nested Structures
Self referential structures
A structure may have
Data variables
Internal structures/unions
Pointer links
Function pointers
struct course
{
int course_num;
struct student[20];
struct course *next;
int (*average)(int []);
};
Dynamic Structures
Link Lists
A type of data structure that have its elements linked together
Generic on-demand dynamic structure
Easy manipulation, but may not be efficient
Trees
A type of data structures in which elements are connected in a tree form
Complex data structures
More efficient, use only if the number of elements are large
Link Lists
Single Link Lists
head
struct slink {
int data;
struct slink *next;
};
Double Link lists
head
struct dlink {
int data;
struct dlink *next;
struct dlink *prev;
};
Other Link Lists
Hash link lists
bin[size]
Other variants: queues and stacks
Queue: a link list grown at one end, shrink at another, i.e. FIFO
Stack: a LIFO link list
Trees – binary trees
root
left
right
struct node {
int data;
struct node *left;
struct node *right;
};
height
leaf
More Trees
Tertiary Trees
K-ary Trees
Each node has K children
B (Balanced)- Trees
Each node has three children
…
A tree that maintains a balanced height as it grows/shrinks
Sample Usage
Important functions
insert
delete
search
…
Maintain a dynamic structure of sorted numbers using
any of the previous structures
Double link list
void insert (struct dlink *head,
struct dlink *entry)
{
struct dlink * search (struct dlink *head, int val)
{
struct dlink * tmp;
for (tmp = head->next; tmp!= head && tmp->data !=
val; tmp = tmp->next);
return (tmp==head)? NULL : tmp;
struct dlink *tmp;
for (tmp = head->next; tmp!= head && tmp>data < entry->data; tmp = tmp->next);
tmp->prev->next = entry;
entry->prev= tmp->prev;
tmp->prev = entry;
entry->next = tmp;
};
}
int main()
{
struct dlink num[10] = { … };
void delete (struct dlink *entry)
{
struct dlink head={0, NULL, NULL};
for (int i=0; i<10; i++)
insert (&head, &num[i]);
…
return 0;
entry>next->prev = entry->prev;
entry>prev->next = entry->next;
entry->next = entry->prev = NULL;
};
}
Binary Search Tree
void insert (struct node *root,
struct node *entry)
{
/* where to insert is really algorithm dependent.
A generic case only: entry is to replace the left node of
head */
if (head->left) {
entry->left = head->left->left;
entry->right = head->left->right;
}
head->left = entry;
};
void delete (struct node *root, struct node *entry)
{
/* The key is to find a node that has an entry as a child */
};
struct node * search (struct node *root, int val)
{
if (!root)
return NULL;
else if (root->data != val)
tmp = search(root->left, val);
if (!tmp)
tmp = search(root->right, val);
return tmp;
}
int main()
{
struct node num[10] = { … };
struct node root = {0, NULL, NULL};
for (int i=0; i<10; i++) {
insert (&root, &num[i]);
}
…
return 0;