Advertisement
Mr_kindle

AdjacencyListAllOp

Oct 22nd, 2022 (edited)
35
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.73 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. struct edge;
  4. struct vertex
  5. {
  6.         int info;
  7.         struct vertex * next_vertex;//next vertex in link list of vertices
  8.         struct edge * first_edge; //first edge of adjacency list of this vertex
  9. };
  10.  
  11. struct edge
  12. {
  13.         struct vertex * dest_vertex; // destination vertex of the edge
  14.         struct edge * next_edge; // next edge of adjacency list
  15. };
  16. struct vertex * start = NULL;
  17.  
  18. /*Declaration of all SEVEN function being used in this code*/
  19. struct vertex * findvertex(int);
  20. void InsertVertex(int);
  21. void InsertEdge(int, int);
  22. void DeleteVertex(int);
  23. void DeleteEdge(int, int);
  24. void DeleteIncomingEdges(int);
  25. void Display();
  26.  
  27.  
  28. int main()
  29. {   int choice,origin,destination,u;
  30.     while(1)
  31.         {   printf("1.Insert a vetex: \n");
  32.             printf("2.Insert an edge:  \n");
  33.             printf("3.Delete a vetex: \n");
  34.             printf("4.Delete an edge: \n");
  35.             printf("5.Display \n");
  36.             printf("6.Exit\n");
  37.            
  38.             printf("Enter your choice: \n");
  39.             scanf("%d",&choice);
  40.            
  41.             switch(choice)
  42.                 {   case 1: printf("Enter a vertex to be inserted: ");
  43.                             scanf("%d",&u);
  44.                             InsertVertex(u);
  45.                             break;
  46.                     case 2: printf("Enter an edge to be inserted: ");
  47.                             scanf("%d %d",&origin,&destination);
  48.                             InsertEdge(origin,destination);
  49.                             break;
  50.                     case 3: printf("Enter a vertex to be deleted: ");
  51.                             scanf("%d",&u);
  52.                             //call a fun to delete all incoming edges on this vertex
  53.                             DeleteIncomingEdges(u);
  54.                             //now call a fun to delete vertex from vertex list
  55.                             DeleteVertex(u);
  56.                             break;
  57.                     case 4: printf("Enter an edge to be deleted: ");
  58.                             scanf("%d %d",&origin,&destination);
  59.                             DeleteEdge(origin,destination);
  60.                             break;
  61.                     case 5: Display();
  62.                             break;
  63.                     case 6: exit(1);
  64.                     default: printf("Wrong choice: \n");
  65.                                 break;
  66.                 }//switch
  67.         }//while
  68. }//main
  69.  
  70. void InsertVertex(int u)
  71.     {   struct vertex *tmp, *ptr;
  72.         tmp = malloc(sizeof(struct vertex));//creating a node of same struct size (same memory size)
  73.         tmp->info = u;
  74.         tmp->first_edge = NULL;
  75.         tmp->next_vertex = NULL;
  76.         if(start == NULL)
  77.             {   start = tmp;
  78.                 return;
  79.             }  
  80.         ptr = start; // we do that so that while traversing start does not changes
  81.         while(ptr->next_vertex != NULL)
  82.                 ptr = ptr->next_vertex;
  83.         ptr->next_vertex=tmp;
  84.            
  85.     }//end of insertvertex
  86.    
  87.    
  88. void DeleteVertex(int u)
  89.     {       struct vertex *tmp, *ptr;
  90.             struct edge *p, *temporary;
  91.             /*tmp will point to the node we have to delete*/
  92.             if(start == NULL)
  93.                 {   printf("No vertices to be deleted: \n");
  94.                     return;
  95.                 }
  96.         /*If vertex to be deleted is start itself or we can say the first vertex in list*/
  97.             if(start->info == u)
  98.                 {   tmp = start;//tmp is pointing to start because it has to be deleted
  99.                     start = start->next_vertex;
  100.                 }
  101.             /*if vertex to be deleted is in between or last*/
  102.             else
  103.                 {   /*first we need to traverse to find the vertex to be deletd*/
  104.                     ptr = start; //while traversing start should not be changed
  105.                     while(ptr->next_vertex != NULL)
  106.                         {   /*we will traveerse up to the node just before the desired node (node to be deleted)*/
  107.                             if(ptr->next_vertex->info == u)
  108.                                 break;
  109.                             /*keep traversing untill we found the if condition */
  110.                             ptr = ptr->next_vertex;
  111.                         }
  112.                     /*if we did not find the desired node*/
  113.                     if(ptr->next_vertex == NULL)
  114.                         {   printf("Vertex not found: \n");
  115.                             return;
  116.                         }
  117.                     /*if vertex found*/
  118.                     else
  119.                         {   tmp = ptr->next_vertex;//ptr->nextvertex is the desired one
  120.                             ptr->next_vertex = tmp->next_vertex;
  121.                         }
  122.                 }
  123.             /*we have found the desired vertex but before deliting it we need to free all edges going from  it*/
  124.             p = tmp->first_edge;//p is a struct edge pointer
  125.             while(p!= NULL)
  126.                 {   temporary = p;
  127.                     p = p->next_edge;
  128.                     free(temporary);
  129.                 }
  130.             /*finally we can free tmp which is a pointer to the node to be deleted*/
  131.                 free(tmp);         
  132.     }//end of deletevertex
  133.    
  134. void InsertEdge(int origin, int destination)
  135.     {       struct vertex *locu, *locv;
  136.             struct edge *ptr, *tmp;
  137.             locu = findvertex(origin);
  138.             locv = findvertex(destination);
  139.             /*first check both vertex are present or not*/
  140.             if(locu == NULL)
  141.                 {   printf("Start vertex does not found, first insert %d vertex:  ", origin);
  142.                     return;
  143.                 }
  144.             if(locv == NULL)
  145.                 {   printf("Destination vertex doesnot found, first insert %d vertex: ",destination);
  146.                     return;
  147.                 }
  148.                
  149.             /*tmp will point to the edge to be inserted*/
  150.            
  151.             tmp = malloc(sizeof(struct edge));
  152.             tmp->dest_vertex = locv;
  153.             tmp->next_edge = NULL;
  154.            
  155.             /*if origin vertex does not have any first edge*/
  156.            
  157.             if(locu->first_edge== NULL)
  158.                 {   locu->first_edge = tmp;
  159.                     return;
  160.                 }
  161.             ptr = locu->first_edge;
  162.            
  163.             /*Now start traversing in edges*/
  164.            
  165.             while(ptr->next_edge != NULL)
  166.                 ptr = ptr->next_edge;
  167.             ptr->next_edge = tmp;
  168.                
  169.     }//end of insert edge
  170.    
  171. struct vertex * findvertex(int u)
  172.     {   struct vertex *ptr, *loc;
  173.         ptr = start;
  174.         while(ptr != NULL)
  175.             {   if(ptr->info == u)
  176.                 {   loc = ptr;
  177.                     return loc;
  178.                 }
  179.                 ptr = ptr->next_vertex;
  180.             }
  181.             /*if no such vertex found*/
  182.             loc = NULL;
  183.             return loc;
  184.     }//end of find vertex
  185.    
  186. void DeleteEdge(int origin, int destination)
  187.     {   struct vertex *locu;
  188.         struct edge *tmp, *ptr;
  189.         locu = findvertex(origin);
  190.        
  191.         /*cheking whether origin vertex of the edge present or not*/
  192.        
  193.         if (locu == NULL)
  194.             {   printf("Start vertex does not present:  \n");
  195.                 return;
  196.             }
  197.         /*Checking whether first edge present or not*/\
  198.        
  199.         if(locu->first_edge == NULL)
  200.             {   printf("edge not present:  \n");
  201.                 return;
  202.             }
  203.         /*cheking if first edge is the 'edge' to be deleted*/
  204.        
  205.         if(locu->first_edge->dest_vertex->info == destination)
  206.             {   tmp = locu->first_edge;
  207.                 locu->first_edge = tmp->next_edge;
  208.                 free(tmp);
  209.                 return;
  210.             }
  211.         /*If required edge is not the firtedge then traverse to find it*/
  212.         ptr = locu->first_edge;
  213.         while(ptr->next_edge != NULL)
  214.             {   if(ptr->next_edge->dest_vertex->info == destination)
  215.                     {   tmp = ptr->next_edge;
  216.                         ptr->next_edge = tmp->next_edge;
  217.                         free(tmp);
  218.                         return;
  219.                     }
  220.                 ptr = ptr->next_edge;
  221.             }
  222.         printf("Edge not present in the graph:\n");
  223.        
  224.     }//end of delete edge
  225.    
  226.    
  227. void DeleteIncomingEdges(int u)
  228.     {   struct vertex *ptr;
  229.         struct edge *tmp, *p;
  230.         ptr = start;
  231.         while(ptr!=NULL)// pay attention to it here can't be ptr->next_vertex != NULL
  232.             {   /*keep traversing untill you found a vertex with edge*/
  233.                 if(ptr->first_edge == NULL)
  234.                     {   ptr = ptr->next_vertex;
  235.                         continue;
  236.                     }
  237.                 /*when found a vertex with edge then check whether it's first edge is the edge to be deleted:*/
  238.                 if(ptr->first_edge->dest_vertex->info == u)
  239.                     {   tmp = ptr->first_edge;
  240.                         ptr->first_edge = tmp->next_edge;
  241.                         free(tmp);
  242.                         continue; /*now search in other edgelist*/
  243.                     }
  244.                 /*if the desiredlist is not the first list then traverse in edge list to find that one*/
  245.                
  246.                 p = ptr->first_edge;
  247.                 while(p->next_edge != NULL)
  248.                     {   /*checking for each edges whether it is desired edges or not*/
  249.                         if(p->next_edge->dest_vertex->info == u)
  250.                             {   tmp = p->next_edge;
  251.                                 p->next_edge = tmp->next_edge;
  252.                                 free(tmp);
  253.                                 continue;
  254.                             }
  255.                         p = p->next_edge;
  256.                     }
  257.                 ptr = ptr->next_vertex;
  258.             }  
  259.     }// end of delete incoming edges
  260.    
  261.    
  262. void Display()
  263.     {   struct vertex *ptr;
  264.         struct edge *p;
  265.         ptr = start;
  266.             printf("\n\n");
  267.         while(ptr != NULL)
  268.             {   printf("%d ->",ptr->info);
  269.                 /*Now traverse through edges*/
  270.                 p = ptr->first_edge;
  271.                 while(p != NULL)
  272.                     {   printf(" %d",p->dest_vertex->info);
  273.                         p = p->next_edge;
  274.                     }
  275.                 printf("\n");
  276.                 ptr = ptr->next_vertex;
  277.             }
  278.             printf("\n\n");
  279.     }//end of display
  280.  
  281.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement