MHB Destroying a Planetary System: Analyzing Solid's Destruction Function

AI Thread Summary
The discussion focuses on implementing a function to destroy a planetary system identified as "solid" and manage the associated asteroids based on their gap values. Asteroids with a gap smaller than a specified threshold are deleted, while those with a larger gap are converted into free-floating planets. Concerns are raised about the correctness of node deletion and whether all nodes are being properly managed, particularly regarding the handling of pointers during deletion. Suggestions include modifying the deletion logic to ensure that nodes are not inadvertently lost and clarifying the implications of pointer reassignment during the deletion process. The conversation emphasizes the importance of maintaining the integrity of the linked structures while performing these operations.
mathmari
Gold Member
MHB
Messages
4,984
Reaction score
7
Hey! :o

I have to write a function for the destruction of the planetary system "solid".
With the destruction of the planetary system, the asteroids where the gap between this one and the object, is smaller that "gap" will also be destructed. (so, they have to be deleted) The asteroids for which the gap is greater are converted to free-floating planets so they have to be inserted into the tree of free-floating planets. The total cost of the transport of all the asteroids that are converted into free-floating planets in the tree of free-floating planets should be $O(n)$, where $n$ is the maximal between the elements of the tree of free-floating planets of the star system to which the object belongs and the elements of the tree of asteroids of the planetary system of which the object has identifier "solid". The field "gap" of the new tree should have the value $0$. The destructed planetary system should be deleted from the list of planetary systems of the star system to which it belonged.
(The tree of free-floating planets is not a binary search tree)

I have done the following:

Code:
int destruction(int solid, int gap){
	int ffplanpos=-1;
	int i, j=-1;
	int sum=0;
	asteroid_t *planf = calloc(1, sizeof(asteroid_t));
	asteroid_t *f=NULL;
	plansys_t *p=NULL;
	asteroid_t *next=NULL;
	starsy_t *fflp=NULL;
	starsy_t *prev_fflp=NULL;
	
	for(i=0; i<Sfreep; i++){
		p=StarS[i].plasy;
		while (p != NULL && p->solid != solid){
			p=p->next;
		}
		if(p != NULL && p->solid == solid){
			j=i;
		}
	}
	
	if(j == -1){
		return -1;
	}
	
	p=StarS[j].plasy;
	
	
	if(p == NULL){
		printf("The planetary system with identifier %d couldn't be found\n", solid);
		return -1;
	}
	
	if(p->asteroids == NULL){
		printf("The planetary system doesn't contain any asteroids\n");
		return -1;
	}
	
	
	f=p->asteroids;
	
	while(f != NULL){
		if(gap<f->gap){
    	                next=f->RC;
    	                free(f);    
    	                f = next;
    	        }
    	        else{
    			next=f->LC;
    	                free(f);    
    	                f = next;
    	        }
	}
	p->asteroids = f;
	if (f != NULL) {
    	        f->PARENT=NULL;
	}

	fflp=StarS[j].ff;
	
	if(f != NULL){
	       planf->as=f->as;
	       planf->gap=0;
	       planf->RC=NULL;
	       planf->LC=NULL;
	       planf->PARENT=NULL;

		   if(fflp == NULL){
			   fflp = planf;
		   }
		   else{
			   while(fflp->RC != NULL){
				   prev_fflp=fflp;
				   fflp=fflp->RC;
			   } 
			   prev_fflp->RC=planf;
		   }
	}
	
	return 0;
	
}

Is it correct?? (Wondering)

Is the way I deleted the nodes correct?? (Wondering)
 
Technology news on Phys.org
I had defined some pointers wrong...

Code:
int destruction(int solid, int gap){
	int ffplanpos=-1;
	int i, j=-1;
	int sum=0;
	asteroid_t *planf = calloc(1, sizeof(asteroid_t));
	asteroid_t *f=NULL;
	plansys_t *p=NULL;
	asteroid_t *next=NULL;
	asteroid_t *fflp=NULL;
	asteroid_t *prev_fflp=NULL;
	
	for(i=0; i<Sfreep; i++){
		p=StarS[i].plasy;
		while (p != NULL && p->solid != solid){
			p=p->next;
		}
		if(p != NULL && p->solid == solid){
			j=i;
		}
	}
	
	if(j == -1){
		return -1;
	}
	
	p=StarS[j].plasy;
	
	
	if(p == NULL){
		printf("The planetary system with identifier %d couldn't be found\n", solid);
		return -1;
	}
	
	if(p->asteroids == NULL){
		printf("The planetary system doesn't contain any asteroids\n");
		return -1;
	}
	
	
	f=p->asteroids;
	
	while(f != NULL){
		if(gap<f->gap){
    	                next=f->RC;
    	                free(f);    
    	                f = next;
    	        }
    	        else{
    			next=f->LC;
    	                free(f);    
    	                f = next;
    	        }
	}
	p->asteroids = f;
	if (f != NULL) {
    	        f->PARENT=NULL;
	}

	fflp=StarS[j].ff;
	
	if(f != NULL){
	       planf->as=f->as;
	       planf->gap=0;
	       planf->RC=NULL;
	       planf->LC=NULL;
	       planf->PARENT=NULL;

		   if(fflp == NULL){
			   fflp = planf;
		   }
		   else{
			   while(fflp->RC != NULL){
				   prev_fflp=fflp;
				   fflp=fflp->RC;
			   } 
			   prev_fflp->RC=planf;
		   }
	}
	
	return 0;
	
}

Is the way I deleted the nodes correct?? (Wondering)
 
Code:
	f=p->asteroids;
	
	while(f != NULL){
		if(gap<f->gap){
    	                next=f->RC;
    	                free(f);    
    	                f = next;
    	        }
    	        else{
    			next=f->LC;
    	                free(f);    
    	                f = next;
    	        }
	}
	p->asteroids = f;
	if (f != NULL) {
    	        f->PARENT=NULL;
	}

	fflp=StarS[j].ff;
	
	if(f != NULL){
	       planf->as=f->as;
	       planf->gap=0;
	       planf->RC=NULL;
	       planf->LC=NULL;
	       planf->PARENT=NULL;

		   if(fflp == NULL){
			   fflp = planf;
		   }
		   else{
			   while(fflp->RC != NULL){
				   prev_fflp=fflp;
				   fflp=fflp->RC;
			   } 
			   prev_fflp->RC=planf;
		   }
	}
	
	return 0;
	
}

With the red part do we not delete all the nodes, no matter if the gap between the asteroid and the object is smaller that "gap" or not?? (Wondering)

Should it maybe be as followed??

Code:
while(f != NULL){
		if(gap < f->gap){
    	                f=f->RC;
    	        }
    	        else{
    			next=f->LC;
    	                free(f);    
    	                f = next;
    	        }
	}

(Wondering)

At the else-statement when we delete the node [m]f[/m] and we set that [m]f[/m] points to [m]f->LC[/m], what happens with [m]f->RC[/m] ?? (Wondering)
 
Dear Peeps I have posted a few questions about programing on this sectio of the PF forum. I want to ask you veterans how you folks learn program in assembly and about computer architecture for the x86 family. In addition to finish learning C, I am also reading the book From bits to Gates to C and Beyond. In the book, it uses the mini LC3 assembly language. I also have books on assembly programming and computer architecture. The few famous ones i have are Computer Organization and...
I have a quick questions. I am going through a book on C programming on my own. Afterwards, I plan to go through something call data structures and algorithms on my own also in C. I also need to learn C++, Matlab and for personal interest Haskell. For the two topic of data structures and algorithms, I understand there are standard ones across all programming languages. After learning it through C, what would be the biggest issue when trying to implement the same data...

Similar threads

Replies
119
Views
16K
Replies
1
Views
1K
Replies
20
Views
4K
Replies
48
Views
9K
Back
Top