Dynamic allocation problem with linked lists

I would like the OP to tell us what compiler and/or linker errors are occurring, if any, or what run-time errors are occurring, if any, or what incorrect results are being produced, if any. Without this information, it's difficult to know where to focus effort.
  • #1
gruba
206
1

Homework Statement


I need to create data structure which contains three linked lists that are connected to one root node.

Homework Equations


-Data structures

The Attempt at a Solution


I can't find what is wrong with the following code:
Code:
#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
  struct node *next;
  int y;
}NODE;

typedef struct root
{
  struct node *first;
  struct node *middle;
  struct node *last;
  int x;
}ROOT;

ROOT *form_root(int x)
{
  ROOT *new_root=(ROOT *)malloc(sizeof(ROOT));
  new_root->first=new_root->middle=new_root->last=0;
  new_root->x=x;
  return new_root;
}

void add_in_list(NODE *list,int y)
{
  NODE *new_node=(NODE *)malloc(sizeof(NODE));
  new_node->y=y;
  new_node->next=NULL;
  if(list == 0)
  list=new_node;
  else
  return ;
}

ROOT *add(ROOT *root,int x)
{
  if(root==0)
  return form_root(x);
  if(x < root->x)
  add_in_list(root->first,x);
  else
  if(x > root->x)
  add_in_list(root->last,x);
  else
  add_in_list(root->middle,x);
  return root;
}

int erase_from_list_(NODE *node,int y)
{
  NODE *p=node->next;
  if(p==0)
  return 0;
  node->y=p->y;
  node->next=p->next;
  free(p);
  return 1;
}

ROOT *erase(ROOT *root, int x)
{
  if(root==0)
  return 0;
  else if(x < root->x)
  root->first=erase_from_list_(root->first,x);
  else if(x > root->x)
  root->last=erase_from_list_(root->last,x);
  else if(x==root->x)
  root->middle=erase_from_list_(root->middle,x);
  else
  return 0;
  return root;
}

void sort_list(NODE *head)
{
  for(;head && head->next;head=head->next)
  {
  NODE *min=head,*p;
  for(p=head->next;p;p=p->next)
  if(min->y > p->y)
  min=p;
  if(min!=head)
  {
  int temp=head->y;
  head->y=min->y;
  min->y=temp;
  }
  }
}

void sort(ROOT *root)
{
  sort_list(root->first);
  sort_list(root->middle);
  sort_list(root->last);
}

void print_list(NODE *head)
{
  while(head)
  {
  printf("%d",head->y);
  head=head->next;
  }
}

void print(ROOT *root)
{
  print_list(root->first);
  print_list(root->middle);
  print_list(root->last);
}

int main()
{
  ROOT *root=0;
  int array[][3]={{0,1,2},{3,4,5},{12,7,8}};
  int i;
  for(i=0;i<3;i++)
  root=add(root,*array[i]);
  int num;
  printf("enter the number to be removed:");
  scanf("%d",&num);
  root=erase(root,num);
  sort(root);
  NODE *head=0;
  print(head);
  return 0;
}

Could someone help?
 

Attachments

  • image.PNG
    image.PNG
    1.4 KB · Views: 487
Physics news on Phys.org
  • #2
gruba said:

Homework Statement


I need to create data structure which contains three linked lists that are connected to one root node.

Homework Equations


-Data structures

The Attempt at a Solution


I can't find what is wrong with the following code:
<omitted>

Could someone help?
A clue as to what's wrong would be helpful. Does your code compile? If not, what compiler and/or linker errors are you getting (including the line number where the error occurs)? Does your code compile, but produce run-time errors? Does your code run, but produce incorrect results?

We're happy to help, but please give us some information to go on.
 
  • #3
Just looking at this function:

Code:
ROOT *form_root(int x)
{
  ROOT *new_root=(ROOT *)malloc(sizeof(ROOT));
  new_root->first=new_root->middle=new_root->last=0; ********* Really look at this line.
  new_root->x=x;
  return new_root;
}

Can you see why your code is wrong? It should read like so:

Code:
ROOT *new_root = (Insert a new root here);
new_root->first = (Insert a new node here);
new_root->second = (Insert a new node here);
new_root->third = (Insert a new node here);
new_root->x = x;

The first, second and third fields are not integers you can set to zero. They are actually nodes with a next and y field.

Look at your code more.
 
  • #4
Zondrina said:
Just looking at this function:

Code:
ROOT *form_root(int x)
{
  ROOT *new_root=(ROOT *)malloc(sizeof(ROOT));
  new_root->first=new_root->middle=new_root->last=0; ********* Really look at this line.
  new_root->x=x;
  return new_root;
}

Can you see why your code is wrong? It should read like so:

Code:
ROOT *new_root = (Insert a new root here);
new_root->first = (Insert a new node here);
new_root->second = (Insert a new node here);
new_root->third = (Insert a new node here);
new_root->x = x;
The OP's first line of code uses malloc() to allocate heap memory for a new node. This is the appropriate thing to do, not "insert a new root here" as you wrote.
Zondrina said:
The first, second and third fields are not integers you can set to zero. They are actually nodes with a next and y field.
Correct, they are not integers, but the OP is initializing these pointers to NULL What the OP has done is not the best way to do things, but I get what the intent is.
Zondrina said:
Look at your code more.
This is also good advice for you, @Zondrina.

I'm waiting for the OP to give us more information about what is wrong with the posted code.
 

FAQ: Dynamic allocation problem with linked lists

1. What is dynamic allocation in the context of linked lists?

Dynamic allocation in linked lists refers to the process of allocating and deallocating memory space for nodes in a linked list as needed. This allows for the list to grow or shrink in size dynamically, as opposed to a fixed-size array where the size cannot be changed.

2. What is the main issue with dynamic allocation in linked lists?

The main issue with dynamic allocation in linked lists is the possibility of memory leaks. If nodes are not properly deallocated when they are no longer needed, they can take up memory space unnecessarily and cause memory issues.

3. How can memory leaks be prevented in dynamic allocation with linked lists?

Memory leaks can be prevented by properly deallocating nodes that are no longer needed. This can be done by keeping track of the head and tail of the list and using a loop to traverse and free all nodes in the list when the list is no longer needed.

4. What is the role of the "free" function in dynamic allocation with linked lists?

The "free" function is used to deallocate memory space that was previously allocated with the "malloc" or "calloc" functions. In the context of linked lists, the "free" function is used to deallocate memory space for nodes that are no longer needed in the list.

5. Can dynamic allocation be used in other data structures besides linked lists?

Yes, dynamic allocation can be used in other data structures besides linked lists. It is commonly used in other dynamic data structures such as trees, graphs, and queues, where the size of the data structure may change over time.

Similar threads

Replies
1
Views
9K
Replies
2
Views
2K
Replies
1
Views
2K
Replies
1
Views
1K
Replies
2
Views
1K
Replies
10
Views
2K
Replies
15
Views
2K
Back
Top