Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- struct list_node{
- int data;
- struct list_node *previous, *next;
- };
- struct list_node *create_list(int data)
- {
- struct list_node *first_node = (struct list_node*)malloc(sizeof(struct list_node));
- if(first_node){
- first_node->data = data;
- first_node->previous = first_node->next = first_node;
- }
- return first_node;
- }
- struct list_node *find_minimum_value_node(struct list_node *list_pointer)
- {
- struct list_node *start, *result;
- start = result = list_pointer;
- int minimum = list_pointer->data;
- do{
- if(minimum > list_pointer->data){
- minimum = list_pointer->data;
- result = list_pointer;
- }
- list_pointer = list_pointer->next;
- }while(start != list_pointer);
- return result;
- }
- struct list_node *find_next_node(struct list_node *list_pointer, int data)
- {
- list_pointer = find_minimum_value_node(list_pointer);
- struct list_node *start = list_pointer;
- do{
- if(list_pointer->data > data)
- break;
- list_pointer = list_pointer->next;
- }while(start != list_pointer);
- return list_pointer;
- }
- void add_node(struct list_node *list_pointer, int data)
- {
- if(list_pointer){
- struct list_node *new_node = (struct list_node*)malloc(sizeof(struct list_node));
- if(new_node){
- new_node->data = data;
- list_pointer = find_next_node(list_pointer, data);
- new_node->next = list_pointer;
- new_node->previous = list_pointer->previous;
- list_pointer->previous->next = new_node;
- list_pointer->previous = new_node;
- }
- }
- }
- struct list_node *delete_node(struct list_node *list_pointer, int data)
- {
- if(list_pointer){
- list_pointer = find_next_node(list_pointer, data);
- list_pointer = list_pointer->previous;
- if(list_pointer->data == data){
- if(list_pointer == list_pointer->next){
- free(list_pointer);
- return NULL;
- }
- struct list_node *next_node = list_pointer->next;
- list_pointer->previous->next = list_pointer->next;
- list_pointer->next->previous = list_pointer->previous;
- free(list_pointer);
- list_pointer = next_node;
- }
- else
- fprintf(stderr, "Brak elementu w liscie!\n");
- }
- return list_pointer;
- }
- void print_list(struct list_node *list_pointer)
- {
- if(list_pointer){
- list_pointer = find_minimum_value_node(list_pointer);
- struct list_node *start = list_pointer;
- do{
- printf("%d ", list_pointer->data);
- list_pointer = list_pointer->next;
- }while(start != list_pointer);
- }
- else
- fprintf(stderr, "Lista jest pusta!\n");
- printf("\n");
- }
- void remove_list(struct list_node **list_pointer)
- {
- if(*list_pointer){
- struct list_node *start = *list_pointer;
- do{
- struct list_node *next_node = (*list_pointer)->next;
- free(*list_pointer);
- *list_pointer = next_node;
- }while(start != (*list_pointer));
- *list_pointer = NULL;
- }
- else
- fprintf(stderr, "Lista jest pusta!\n");
- }
- int main(void)
- {
- srand(time(NULL));
- struct list_node *list_pointer = (struct list_node*)malloc(sizeof(struct list_node));
- list_pointer = create_list(10);
- int i;
- for(i = 0; i < 10; i++)
- add_node(list_pointer, rand()%10);
- print_list(list_pointer);
- list_pointer = delete_node(list_pointer, 10);
- print_list(list_pointer);
- remove_list(&list_pointer);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment