I'm having some trouble with my insertion method for a linked list in C. It looks like every insertion i make only replaces the previous one. so at the end the list always contains only one cell . i think the problem starts with "insertToEndList" function. Do you see any reason why it's failing?
#include <stdio.h>
#include <stdlib.h>
typedef struct listNode{
int* dataPtr;
struct listNode* next;
}ListNode;
typedef struct list
{
ListNode* head;
ListNode* tail;
}List;
void deleteFromBeginnigOfList (List *list);
void deallocateListCell (ListNode *cell);
void freeList (List *list);
void printList (List *list);
void insertDataToBeginningList (List *list, int num);
void addToBeginningList (List *list, ListNode *cell);
List merge (List list1, List list2);
ListNode *createCell (int num);
void addToEmtyList(List *list, ListNode *cell);
void addToEndList(List *list, ListNode *cell);
void insertDataToEndList(List *list, int num);
void makeEmptyList(List *list);
List getList();
void main()
{
List lst1, lst2, mergedList;
lst1 = getList();
lst2 = getList();
mergedList = merge(lst1,lst2);
printf("Merged list:\n");
printList(&mergedList);
freeList(&lst1);
freeList(&lst2);
freeList(&mergedList);
}
List getList()
{
List res;
int size, num, i;
makeEmptyList(&res);
printf("Please enter the number of items to be entered:\n");
scanf("%d", &size);
printf("Please enter the numbers:\n");
for(i = 0; i < size; i++)
{
scanf("%d", &num);
insertDataToEndList(&res, num);
}
return res;
}
void makeEmptyList(List *list){
list->head=list->tail=NULL;
}
void insertDataToEndList(List *list, int num){
ListNode *cell_to_add= createCell (num);
if (list->head==NULL)
addToEmtyList(list, cell_to_add);
else
addToEndList(list, cell_to_add);
}
ListNode *createCell (int num){
ListNode *cell=(ListNode*)malloc(sizeof(ListNode));
if (!cell)
{
printf("memory allocation failed\n");
exit(1);
}
cell->dataPtr=#
cell->next=NULL;
return cell;
}
void addToEmtyList(List *list, ListNode *cell){
list->head=list->tail=cell;
}
void addToEndList(List *list, ListNode *cell){
list->tail->next=cell;
list->tail=cell;
}
List merge (List list1, List list2){
List merge_res;
ListNode *curr_cell1=list1.head, *curr_cell2=list2.head;
ListNode *cell_to_add;
makeEmptyList (&merge_res);
while (curr_cell1 && curr_cell2)
{
if (*(curr_cell1->dataPtr)>*(curr_cell2->dataPtr))
{
insertDataToEndList(&merge_res, *(curr_cell1->dataPtr));
curr_cell1=curr_cell1->next;
}
else
{
insertDataToEndList(&merge_res, *(curr_cell2->dataPtr));
curr_cell2=curr_cell1->next;
}
}
while (curr_cell1)
{
insertDataToEndList(&merge_res, *(curr_cell1->dataPtr));
curr_cell1=curr_cell1->next;
}
while (curr_cell2)
{
insertDataToEndList(&merge_res, *(curr_cell2->dataPtr));
curr_cell2=curr_cell2->next;
}
return merge_res;
}
void printList (List *list){
ListNode *curr_cell=list->head;
while (curr_cell)
{
printf("%d, ", *(curr_cell->dataPtr));
curr_cell=curr_cell->next;
}
}
void freeList (List *list){
while (list->head)
deleteFromBeginnigOfList(list);
}
void deleteFromBeginnigOfList (List *list){
ListNode *cell_to_delete=list->head;
list->head=list->head->next;
if (list->head==NULL)
list->tail=NULL;
deallocateListCell (cell_to_delete);
}
void deallocateListCell (ListNode *cell){
free(cell->dataPtr);
free (cell);
}