Cấu trúc tự trỏ

c

(Trần Vinh Quang) #1
#include <stdio.h>
#include <string.h>
#include <malloc.h>
 
typedef struct pp{
	char ht[25];
	char qq[30];
	int tuoi;
	struct pp *tiep;
}person;
 
void input(person *p, person *pdau, char *ht, char *qq){
	int t = 0;
	while(1){
		printf("\nHo ten (Bam enter de ket thuc nhap lieu): ");
		gets(ht);
		if(ht[0] == 0)
			break;
		if(pdau == NULL){
			pdau = (person*)malloc(sizeof(person));
			p = pdau;
		}
		else{
			p->tiep = (person*)malloc(sizeof(person));
			p = p->tiep;
		}
		strcpy(p->ht, ht);
		printf("\nQue quan: ");
		gets(p->qq);
		printf("\nTuoi: ");
		scanf("%d%*c", &t);
		p->tuoi = t;
		p->tiep = NULL;
	}
}
 
void inra(person *p, person *pdau){
	p = pdau;
	while (p != NULL){
		printf("\nHo ten %-25s Que %-30s Tuoi %d", (*p).ht, (*p).qq, (*p).tuoi);
		p = p->tiep;
	}	
}
 
void search(char *qq, person *p, person *pdau){
	while (1){
		printf("\nQue (Bam enter de ket thuc tim kiem): ");
		gets(qq);
		if (qq[0] == 0)
			break;
		p = pdau;
		while(p != NULL){
			if(strcmp(p->qq, qq)==0)
				printf("\nHo ten %-25s Que %-30s Tuoi %d\n", (*p).ht, (*p).qq, (*p).tuoi);
			p = p->tiep;
		}
	}
}
 
void loai(person *p, person *pdau){
	printf("\nLoai phan tu dau danh sach");
	if(pdau!=NULL){
		p = pdau;
		pdau = p->tiep;
		free(p);
	}
}
 
void bosung(person *p, person *pdau){
	int t = 0;
	printf("\nBo sung mot nguoi vao cuoi danh sach ");
	if(pdau==NULL){
		pdau = (person*)malloc(sizeof(person));
		p = pdau;
	}
	else{
		p = pdau;
		while(p->tiep!=NULL)
			p = p->tiep;
		p->tiep = (person*)malloc(sizeof(person));
		p = p->tiep;
	}
 
	printf("\nHo ten: ");
	gets(p->ht);
	printf("\nQue quan: ");
	gets(p->qq);
	printf("\nTuoi: ");
	scanf("%d%*c", &t);
	p->tuoi = t;
	p->tiep = NULL;
}
 
void chen(person *p, person *pdau, person *pl){
	int t = 0;
	printf("Chen them vao truoc nguoi thu hai");
	p = (person*)malloc(sizeof(person));
	printf("\nHo ten: ");
	gets(p->ht);
	printf("\nQue quan: ");
	gets(p->qq);
	printf("\nTuoi: ");
	scanf("%d%*c", &t);
	p->tuoi = t;
 
	pl= pdau->tiep;
	pdau ->tiep=p;
	p->tiep=pl;
}
 
void output(person *p, person *pdau){
	p = pdau;
	while(p!=NULL){
		printf("\nHo ten %-25s Que %-30s Tuoi %d", (*p).ht, (*p).qq, (*p).tuoi);
		p = p->tiep;
	}
	printf("\nHo ten %-25s Que %-30s Tuoi %d", (*p).ht, (*p).qq, (*p).tuoi);
}
 
void main(){
	int t;
	char ht[25], qq[30];
	person *pdau, *p, *pl;
	pdau = NULL;
 
	input(p, pdau, ht, qq);
	inra(p, pdau);
	search(qq, p, pdau);
	loai(p, pdau);
	bosung(p, pdau);
	chen(p, pdau, pl);
	output(p, pdau);
 
	free(p);
	free(pdau);
	free(pl);
}

Các bác cho e hỏi, nếu e để input() vào trong main() thì hàm inra() chạy đc mà để input() ra ngoài như này (???) thì hàm inra() lại ko chạy đc ạ.


(Hùng Phong) #2

khi ở main bạn truyền đối số vào trong hàm input thì nó sẽ tạo ra 1 bản sao và bạn chỉ đang thao tác cấp phát bộ nhớ trên đó và khi kết thúc hàm thì vòng đời của nó sẽ kết thúc sau dấu ‘}’ , và để fix lỗi này thì có 2 cách như sau:

  • cách 1 bạn tham chiếu đến con trỏ của bạn để mỗi thao tác thêm dữ liệu sẽ là thao tác trên vùng nhớ của chính con trỏ đó chứ không phải 1 bản sao nào khác
  • cách 2 bạn dùng 1 tham số có con trỏ cấp cao hơn con trỏ của đối số

(Trần Vinh Quang) #3

Sorry! Nhưng cái mk truyền vào ở đây là con trỏ r mà


(SITUVN.gcd) #4

Cho xem hết mã của bạn được không? Sao chép văn bản ấy, không chụp hình.


(Trần Vinh Quang) #5

(SITUVN.gcd) #6

Là như thế nào? Ý bạn là gì?


(Trần Vinh Quang) #7

thôi mk sửa đc r
cảm ơn mn nhé


83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?