манипуляции со списками

// Programming 1. Sample at 2016-12-01-13-56.32 #include <stdio.h> struct Person { struct Person * next; int value; }; int len(struct Person *head) { int counter = 0; while(head->next) { counter++; head=head->next; } return counter; } void print(struct Person *head) { int length = len(head); printf("{ "); head= head->next; while(head) { printf("%d ",head->value); head = head->next; } printf(" }:%d\n",length); } struct Person *find_prev(struct Person *a, struct Person *head) { while(head->next !=a) { head = head->next; } return head; } int compare_and_swap (struct Person *head, struct Person *a, struct Person *b) { if( a->value > b->value) { struct Person *prev =find_prev(a,head); prev->next = b; a->next = b->next; b->next = a; return 1; } return 0; } struct Person* sort(struct Person *head) { int was_changed = 1; while(was_changed) { struct Person *current = head->next; struct Person *next = current->next; was_changed = 0; while( next ) { if(compare_and_swap(head,current,next)) { was_changed = 1; break; } current = current->next; next = next->next; } } } int main(/*int c, char **v */) { struct Person head; struct Person a ={NULL, 1}; struct Person b ={NULL, -2}; struct Person c ={NULL, 8}; head.next = &a; a.next = &b; b.next = &c; print(&head); sort(&head); print(&head); return 0; }