Click here to Skip to main content
15,881,588 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
The objective is to make a linked-list tree of groups of students of a subject. the tree should work with the subject being the root, the group leaders being the first level of leaves, and the members of the group branching from their respective group leaders. each leaf should show the name, id and role of the student. the output should traverse the tree in preorder. I've been on this problem for two days.

What I have tried:

This is my attempt so far. I cant get it to output the members but it lists the subject and the leaders in a broken way

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define MAXSTRINGSIZE 100

typedef struct treenode
{

char name[MAXSTRINGSIZE];

long id;

char role[MAXSTRINGSIZE];

struct treenode *leader1;
struct treenode *leader2;
struct treenode *leader3;
struct treenode *leader4;
struct treenode *leader5;
struct treenode *leader6;
struct treenode *leader7;

struct treenode *member1;
struct treenode *member2;
struct treenode *member3;
struct treenode *member4;
struct treenode *member5;

} treenode;

treenode *createnode(char name[], long id, char role[]) {
treenode *p;
p = malloc(sizeof(struct treenode));
if (p != NULL)
   {
       strcpy(p->name, name);
       p->id = id;
       strcpy(p->role, role);
  
       p->leader1 = NULL;
       p->leader2 = NULL;
       p->leader3 = NULL;
       p->leader4 = NULL;
       p->leader5 = NULL;
       p->leader6 = NULL;
       p->leader7 = NULL;
  
       p->member1 = NULL;
       p->member2 = NULL;
       p->member3 = NULL;
       p->member4 = NULL;
       p->member5 = NULL;
   }
   return(p);
}

void printtree(treenode *root)
{

if(root == NULL)


   {
       printf("---<empty>---\n");
      
       return;
   }
  
   printf("%s \t", root->name);
   printf("%d \t", root->id);
   printf("%s \n", root->role);
  
   printf("Group 1\n");
   printtree(root->leader1);
  
   printf("Group 2\n");
   printtree(root->leader2);
  
   printf("Group 3\n");
   printtree(root->leader3);
  
   printf("Group 4\n");
   printtree(root->leader4);
  
   printf("Group 5\n");
   printtree(root->leader5);
  
   printf("Group 6\n");
   printtree(root->leader6);
  
   printf("Group 7\n");
   printtree(root->leader7);

}

//Tree Growth
int main()
{
   treenode *n1 = createnode("EEE1111", 3333, "___");
   treenode *n2 = createnode("AAA", 1181, "Group Leader");
   treenode *n3 = createnode("BBB", 1201, "Group Leader");
   treenode *n4 = createnode("CCC", 1209, "Group Leader");
   treenode *n5 = createnode("DDD", 1191, "Group Leader");
   treenode *n6 = createnode("FFF", 1183, "Group Leader");
   treenode *n7 = createnode("GGG", 1197, "Group Leader");
   treenode *n8 = createnode("HHH", 1199, "Group Leader");
   treenode *n9 = createnode("III", 1171, "Member");
   treenode *n10 = createnode("JJJ", 1185, "Member");
   treenode *n11 = createnode("KKK", 1208, "Member");
   treenode *n12 = createnode("LLL", 1193, "Member");
   treenode *n13 = createnode("MMM", 1204, "Member");
   treenode *n14 = createnode("NNN", 1192, "Member");
   treenode *n15 = createnode("OOO", 12049, "Member");
   treenode *n16 = createnode("PPP", 119215, "Member");
   treenode *n17 = createnode("QQQ", 12286, "Member");
   treenode *n18 = createnode("RRR", 11192, "Member");
   treenode *n19 = createnode("SSS", 1926, "Member");
   treenode *n20 = createnode("TTT", 119417, "Member");
   treenode *n21 = createnode("UUU", 120225, "Member");
   treenode *n22 = createnode("VVV", 11587, "Member");
   treenode *n23 = createnode("WWW", 11101, "Member");
   treenode *n24 = createnode("XXX", 10648, "Member");
   treenode *n25 = createnode("YYY", 10779, "Member");
   treenode *n26 = createnode("ZZZ", 1858, "Member");
   treenode *n27 = createnode("ABC", 12222, "Member");
  
  
  
  
   n1 -> leader1 = n2;
   n1 -> leader2 = n3;
   n1 -> leader3 = n4;
   n1 -> leader4 = n5;
   n1 -> leader5 = n6;
   n1 -> leader6 = n7;
   n1 -> leader7 = n8;
  
   n2 -> member1 = n9;
   n2 -> member2 = n10;
   n3 -> member1 = n11;
   n3 -> member2 = n12;
   n4 -> member1 = n13;
   n4 -> member2 = n14;
   n4 -> member3 = n15;
   n4 -> member4 = n16;
   n5 -> member1 = n17;
   n5 -> member2 = n18;
   n5 -> member3 = n19;
   n6 -> member1 = n20;
   n6 -> member2 = n21;
   n6 -> member3 = n22;
   n7 -> member1 = n23;
   n7 -> member2 = n24;
   n7 -> member3 = n25;
   n8 -> member1 = n26;
   n8 -> member2 = n27;
  
  
  
   //Traversal and Print
   printtree(n1);
  
   return (0);
}
Posted
Updated 27-Mar-22 20:51pm
v2
Comments
Richard MacCutchan 27-Mar-22 11:02am    
This is not a good design. Your tree should be built dynamically as you process each data item. Using static items as you have done, means the application can only handle the fixed number of nodes.

1 solution

I think you should revise your data structure. I propose you a skeleton (you might complete it adding dynamic memory allocation and all the details)
C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZE 100

struct MemberNode
{
  char name[SIZE];
  int id;
  struct MemberNode * p_next_member;
};

struct LeaderNode
{
  char name[SIZE];
  int id;
  struct LeaderNode * p_next_leader;
  struct MemberNode * p_first_member;
};

struct Subject
{
  char name[SIZE];
  struct LeaderNode * p_first_leader;
};

void show_all_id(struct Subject * p_subject);

int main()
{
  struct MemberNode m1, m2;
  struct LeaderNode l1;
  struct Subject s;

  s.p_first_leader = &l1;

  l1.id = 1;
  l1.p_next_leader = NULL;
  l1.p_first_member = &m1;

  m1.id = 11;
  m1.p_next_member = &m2;
  m2.id = 12;
  m2.p_next_member = NULL;

  show_all_id( &s );
  return 0;
}

void show_all_id(struct Subject * p_subject)
{
  struct LeaderNode * p_leader = p_subject->p_first_leader;
  while ( p_leader )
  {
    printf("leader id: %d\n", p_leader->id);
    struct MemberNode * p_member = p_leader->p_first_member;
    while ( p_member )
    {
      printf("\tmember id: %d\n", p_member->id);
      p_member = p_member->p_next_member;
    }
    p_leader = p_leader->p_next_leader;
  }
}
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900