initial commit

This commit is contained in:
2026-03-12 13:22:29 +05:30
commit 44e461b5f6
2 changed files with 246 additions and 0 deletions

212
llist.c Normal file
View File

@@ -0,0 +1,212 @@
#include "llist.h"
#include <stdio.h>
List *create_list(void *data)
{
ListNode *new_node;
List *new_list = (List *) malloc(sizeof(List));
*new_list = (ListNode *) malloc(sizeof(ListNode));
new_node = *new_list;
new_node->data = data;
new_node->next = NULL;
return new_list;
}
List *list_remove(List *list, uint32_t position)
{
ListNode *head;
ListNode *current;
ListNode *tmp;
if (list == NULL || *list == NULL)
{
return list;
}
if (position == 0)
{
head = *list;
head = head->next;
*list = head;
return list;
}
if (position >= list_size(list))
{
current = *list;
while(current->next)
{
tmp = current;
current=current->next;
}
tmp->next = NULL;
free(current);
return list;
}
current = *list;
tmp = current;
while (current && position > 0)
{
tmp = current;
current = current->next;
position--;
}
tmp->next = current->next;
free(current);
return list;
}
List *list_add(List *list, void *data, uint32_t position)
{
ListNode *new_node;
ListNode *head;
ListNode *current;
if (list == NULL || *list == NULL)
{
return NULL;
}
head = *list;
if (head == NULL)
{
head->data = data;
head->next = NULL;
return list;
}
new_node = (ListNode*) malloc(sizeof(ListNode));
new_node->data = data;
if (position == 0)
{
new_node->next = *list;
*list = new_node;
return list;
}
if (position >= list_size(list))
{
current = *list;
while (current->next)
{
current = current->next;
}
current->next = new_node;
return list;
}
/* add at any position */
current = *list;
while (current && position-- >1)
{
current = current->next;
}
ListNode *tmp = current->next;
current->next = new_node;
new_node->next = tmp;
return list;
}
void print_list(List *list)
{
ListNode *current;
uint32_t index = 0;
if (list == NULL || *list == NULL)
return;
current = *list;
while (current)
{
printf("At %d value = %p\n", index, current);
index++;
current = current->next;
}
}
void list_delete(List *list)
{
ListNode *current;
ListNode *next;
if (list == NULL || *list == NULL)
return;
current = *list;
while (current->next)
{
next = current->next;
free(current);
current = next;
}
free(list);
}
uint32_t list_size(List *list)
{
uint32_t size = 0;
ListNode *current;
if (list == NULL || *list == NULL)
return size;
current = *list;
while (current)
{
size++;
current = current->next;
}
return size;
}
void print_size_and_list(List *list)
{
printf("size = %d\n", list_size(list));
print_list(list);
}
int main(int argc, char **argv)
{
void *new_data = (void *) malloc(sizeof(void));
void *new_data2 = (void *) malloc(sizeof(void));
void *new_data3 = (void *) malloc(sizeof(void));
void *new_data4 = (void *) malloc(sizeof(void));
List *new_list = create_list(new_data);
print_size_and_list(new_list);
list_add(new_list, new_data2, 0);
print_size_and_list(new_list);
list_add(new_list, new_data3, 3);
print_size_and_list(new_list);
list_add(new_list, new_data4, 2);
print_size_and_list(new_list);
list_remove(new_list, 2);
print_size_and_list(new_list);
list_delete(new_list);
new_list = NULL;
print_size_and_list(new_list);
return 0;
}