

Übungsblatt 2, Aufgabe 2
ADS_2.2_acritox.cpp
# kompilieren:
g++ -o ADS_2.2_acritox -Wall ADS_2.2_acritox.cpp
# ausführen:
./ADS_2.2_acritox
head: 0x83B8008, tail: 0x83B8018
node 0: 0x83B8028
node 1: 0x83B8038
node 2: 0x83B8048
node 3: 0x83B8058
node 4: 0x83B8068
node 5: 0x83B8078
node 6: 0x83B8088
node 7: 0x83B8098
node 8: 0x83B80A8
node 9: 0x83B80B8
node 10: 0x83B80C8
node 11: 0x83B80D8
node 12: 0x83B80E8
node 13: 0x83B80F8
node 14: 0x83B8108
node 15: 0x83B8118
node 16: 0x83B8128
list:
data: 0, addr: 0x83B8028, prev: 0x83B8008, next: 0x83B8038, np: 0x30
data: 1, addr: 0x83B8038, prev: 0x83B8028, next: 0x83B8048, np: 0x60
data: 2, addr: 0x83B8048, prev: 0x83B8038, next: 0x83B8058, np: 0x60
data: 3, addr: 0x83B8058, prev: 0x83B8048, next: 0x83B8068, np: 0x20
data: 4, addr: 0x83B8068, prev: 0x83B8058, next: 0x83B8078, np: 0x20
data: 5, addr: 0x83B8078, prev: 0x83B8068, next: 0x83B8088, np: 0xE0
data: 6, addr: 0x83B8088, prev: 0x83B8078, next: 0x83B8098, np: 0xE0
data: 7, addr: 0x83B8098, prev: 0x83B8088, next: 0x83B80A8, np: 0x20
data: 8, addr: 0x83B80A8, prev: 0x83B8098, next: 0x83B80B8, np: 0x20
data: 9, addr: 0x83B80B8, prev: 0x83B80A8, next: 0x83B80C8, np: 0x60
data: 10, addr: 0x83B80C8, prev: 0x83B80B8, next: 0x83B80D8, np: 0x60
data: 11, addr: 0x83B80D8, prev: 0x83B80C8, next: 0x83B80E8, np: 0x20
data: 12, addr: 0x83B80E8, prev: 0x83B80D8, next: 0x83B80F8, np: 0x20
data: 13, addr: 0x83B80F8, prev: 0x83B80E8, next: 0x83B8108, np: 0x1E0
data: 14, addr: 0x83B8108, prev: 0x83B80F8, next: 0x83B8118, np: 0x1E0
data: 15, addr: 0x83B8118, prev: 0x83B8108, next: 0x83B8128, np: 0x20
data: 16, addr: 0x83B8128, prev: 0x83B8118, next: 0x83B8018, np: 0x100
found node with value 7 at 0x83B8098, will delete the next 4 nodes now.
deleted node (data: 8, addr: 0x83B80A8)
deleted node (data: 9, addr: 0x83B80B8)
deleted node (data: 10, addr: 0x83B80C8)
deleted node (data: 11, addr: 0x83B80D8)
mirrored list:
data: 16, addr: 0x83B8128, prev: 0x83B8018, next: 0x83B8118, np: 0x100
data: 15, addr: 0x83B8118, prev: 0x83B8128, next: 0x83B8108, np: 0x20
data: 14, addr: 0x83B8108, prev: 0x83B8118, next: 0x83B80F8, np: 0x1E0
data: 13, addr: 0x83B80F8, prev: 0x83B8108, next: 0x83B80E8, np: 0x1E0
data: 12, addr: 0x83B80E8, prev: 0x83B80F8, next: 0x83B8098, np: 0x60
data: 7, addr: 0x83B8098, prev: 0x83B80E8, next: 0x83B8088, np: 0x60
data: 6, addr: 0x83B8088, prev: 0x83B8098, next: 0x83B8078, np: 0xE0
data: 5, addr: 0x83B8078, prev: 0x83B8088, next: 0x83B8068, np: 0xE0
data: 4, addr: 0x83B8068, prev: 0x83B8078, next: 0x83B8058, np: 0x20
data: 3, addr: 0x83B8058, prev: 0x83B8068, next: 0x83B8048, np: 0x20
data: 2, addr: 0x83B8048, prev: 0x83B8058, next: 0x83B8038, np: 0x60
data: 1, addr: 0x83B8038, prev: 0x83B8048, next: 0x83B8028, np: 0x60
data: 0, addr: 0x83B8028, prev: 0x83B8038, next: 0x83B8008, np: 0x30
// ADS, Uebungsblatt 2, Aufgabe 2
// 03.11.2009
// Andreas Loibl <aloibl@mytum.de>
#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
unsigned int np;
};
node *new_node()
{
node *n = (node *) malloc(sizeof(node));
n->np = NULL;
return n;
}
node *next(node *cur, node *prev)
{
return (struct node*)(cur->np ^ (unsigned int)prev);
}
node *prev(node *cur, node *next)
{
return (struct node*)(cur->np ^ (unsigned int)next);
}
node *insert(node *after, node *before, int data)
{
node *tmp = new_node();
tmp->data = data;
tmp->np = (unsigned int)after ^ (unsigned int)before;
after->np ^= (unsigned int)before ^ (unsigned int)tmp;
before->np ^= (unsigned int)after ^ (unsigned int)tmp;
return tmp;
}
node *search_node(int value, node *head, node *tail, node** prev_ptr)
{
node *next_ptr = NULL;
*prev_ptr = NULL;
node *cur_ptr = head;
while(next(cur_ptr, *prev_ptr)!=tail)
{
next_ptr = next(cur_ptr, *prev_ptr);
*prev_ptr = cur_ptr;
cur_ptr = next_ptr;
if(cur_ptr->data == value) return cur_ptr;
}
return NULL;
}
void delete_node(node *prev_ptr, node *del)
{
node *next_ptr = next(del, prev_ptr);
prev_ptr->np ^= (unsigned int)del;
prev_ptr->np ^= (unsigned int)next_ptr;
next_ptr->np ^= (unsigned int)del;
next_ptr->np ^= (unsigned int)prev_ptr;
free(del);
}
int main(int argc, char *argv[])
{
node *head = new_node();
node *tail = new_node();
head->np = (unsigned int)tail;
tail->np = (unsigned int)head;
node *cur_ptr = head;
node *prev_ptr = NULL;
node *next_ptr = NULL;
printf("head: 0x%X, ", (unsigned int)head);
printf("tail: 0x%X\n", (unsigned int)tail);
// fill list
for(int i=0; i < 17; i++)
{
cur_ptr = insert(cur_ptr, tail, i);
printf("node %d: 0x%X\n", i, (unsigned int)cur_ptr);
}
// search node with value 7
if((cur_ptr = search_node(7, head, tail, &prev_ptr)))
{
// delete the following 4 nodes (8,9,10,11)
for(int i=0; i < 4; i++)
{
delete_node(cur_ptr, next(cur_ptr, prev_ptr));
}
}
// mirror
node *tmp;
tmp = head;
head = tail;
tail = tmp;
// delete all nodes
prev_ptr = NULL; cur_ptr = head;
while(next(cur_ptr, prev_ptr)!=tail)
{
delete_node(cur_ptr, next(cur_ptr, prev_ptr));
}
// delete head and tail
free(head);
free(tail);
return 0;
}
ADS_2.2_acritox.cpp