Dynamic allocation problem with linked lists

AI Thread Summary
The discussion centers on a homework assignment requiring the creation of a data structure with three linked lists connected to a root node. The original code attempts to implement this but encounters issues, particularly with memory allocation and initialization of linked list pointers. Participants suggest that the code should properly allocate memory for the linked list nodes instead of initializing them to zero. There is a call for the original poster to provide more details about compilation or runtime errors to facilitate troubleshooting. The conversation emphasizes the importance of correctly managing memory and understanding data structure initialization.
gruba
Messages
203
Reaction score
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: 521
Physics news on Phys.org
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.
 
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.
 
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.
 

Similar threads

Replies
1
Views
10K
Replies
2
Views
2K
Replies
1
Views
3K
Replies
1
Views
1K
Replies
2
Views
2K
Replies
10
Views
2K
Replies
15
Views
2K
Replies
5
Views
2K
Back
Top