Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Implementacja Listy
- #include <stdio.h>
- #include <stdlib.h>
- struct list_node{
- int data;
- struct list_node *next;
- } *list_pointer;
- struct list_node *create_list(int data)
- {
- struct list_node *first = (struct list_node*)malloc(sizeof(struct list_node));
- if(first){
- first->data = data;
- first->next = NULL;
- }
- return first;
- }
- struct list_node *add_in_front(struct list_node *list_pointer, struct list_node *new_node)
- {
- new_node->next = list_pointer;
- return new_node;
- }
- struct list_node *find_spot(struct list_node *list_pointer, int data)
- {
- struct list_node *previous = NULL;
- while(list_pointer && list_pointer->data < data){
- previous = list_pointer;
- list_pointer = list_pointer->next;
- }
- return previous;
- }
- void add_in_middle_or_at_back(struct list_node *node, struct list_node *new_node)
- {
- new_node->next = node->next;
- node->next = new_node;
- }
- struct list_node *add_node(struct list_node *list_pointer, int data)
- {
- struct list_node *new_node = (struct list_node*)malloc(sizeof(struct list_node));
- if(list_pointer && new_node){
- new_node->data = data;
- if(list_pointer->data >= data){
- return add_in_front(list_pointer, new_node);
- }
- else{
- struct list_node *tmp = find_spot(list_pointer, data);
- add_in_middle_or_at_back(tmp, new_node);
- }
- }
- return list_pointer;
- }
- struct list_node *delete_at_front(struct list_node *list_pointer)
- {
- struct list_node *next = list_pointer->next;
- free(list_pointer);
- return next;
- }
- struct list_node *find_previous_node(struct list_node *list_pointer, int data)
- {
- struct list_node *previous = NULL;
- while(list_pointer && list_pointer->data != data){
- previous = list_pointer;
- list_pointer = list_pointer->next;
- }
- return previous;
- }
- void delete_in_middle_or_at_back(struct list_node *previous)
- {
- struct list_node *node = previous->next;
- if(node){
- previous->next = node->next;
- free(node);
- }
- }
- struct list_node *delete_node(struct list_node *list_pointer, int data)
- {
- if(list_pointer){
- if(list_pointer->data == data){
- return delete_at_front(list_pointer);
- }
- else{
- struct list_node *tmp = find_previous_node(list_pointer, data);
- delete_in_middle_or_at_back(tmp);
- }
- }
- return list_pointer;
- }
- void print_list(struct list_node *list_pointer)
- {
- while(list_pointer){
- printf("%d ", list_pointer->data);
- list_pointer = list_pointer->next;
- }
- printf("\n");
- }
- void remove_list(struct list_node **list_pointer)
- {
- while(*list_pointer){
- struct list_node *tmp_next = (*list_pointer)->next;
- free(*list_pointer);
- *list_pointer = tmp_next;
- }
- }
- int main(void)
- {
- list_pointer = create_list(3);
- list_pointer = add_node(list_pointer, 9);
- list_pointer = add_node(list_pointer, 2);
- list_pointer = add_node(list_pointer, 5);
- list_pointer = delete_node(list_pointer, 9);
- print_list(list_pointer);
- remove_list(&list_pointer);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement