Nhờ giải thích hàm xoá phần tử của linked list

Ở hàm xóa, thầy giảng e không hiểu lắm.

#include <stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<iostream.h>
typedef struct _num
{
	char* number;
	_num *next;
}_num_node;
typedef _num_node *type_num;

typedef struct _contact
{
	char *name;
	type_num list_of_number;
	_contact *down;
}_contact_node;
typedef _contact_node *type_contact;

void contact_intialize (type_contact &head);
void num_intialize (type_num &first);
type_contact create_contact_node();
type_num create_num_node();
type_contact add_contact_Flist(type_contact &head, type_contact p);
type_num add_num_Flist(type_num &first, type_num p);
type_contact add_contact_Llist(type_contact &head, type_contact p);
type_contact Search_Mid_Node(type_contact head);
type_contact add_contact_Mlist(type_contact &head,type_contact &mid_node,type_contact p);
type_contact create_contact_list(type_contact &head, int n);
void create_num_list(type_num &first);
void travelling_contact_list(type_contact head);
int count_contact_list(type_contact head);
type_contact searching_contact_list(type_contact head,char *name_search);
type_contact search_delete(type_contact &head , char* name_delete);
int delete_node_contact_list(type_contact &head,char* name_delete);
void delete_contact_list(type_contact &head);

int main(int argc, char *argv[])
{
	type_contact head;
	type_num first;
	int chon;
	contact_intialize(head);
	num_intialize(first);
	
	do
	{
		printf("\t|--MENU: Danh Ba Dien Thoai--|\n");
        printf("\t|   0.Thoat.                 |\n");
        printf("\t|   1.Nhap danh ba.          |\n");
        printf("\t|   2.Xuat danh ba.          |\n");
        printf("\t|   3.Them 1 node vao dau.   |\n");
        printf("\t|   4.Them 1 node vao cuoi.  |\n");
        printf("\t|   5.Them 1 node vao giua.  |\n");
        printf("\t|   6.Dem so nut             |\n");
        printf("\t|   7.Tim kiem theo ten.     |\n");
        printf("\t|   8.Xoa 1 nut.             |\n");
        printf("\t|   9.Xoa toan bo.           |\n");
        printf("\t|----------------------------|\n");
        printf("\n \tNhap chon yeu cau cua ban(0->9): ");
        scanf("%d",&chon);
        switch(chon)
        {
        	case 0:
            {
                printf("THOAT!!!\n");
                break;
            };
            case 1: //Them
            {
            	int n;
                printf("\nNhap tong so nguoi trong danh ba cua ban: ");
                scanf("%d",&n);  
                create_contact_list(head,n);
				 
                printf("\n");
				break;       
             };
            case 2: // Xuat
            {
            	printf("-------------------------------------------------------------\n");
				printf("|%-20s|%-38s|\n", "         Ten", "              So Dien Thoai");
				printf("-------------------------------------------------------------\n");
            	travelling_contact_list(head);
            	
            	printf("\n");
            	break;
            };
            case 3: // Them vao dau
                {
                printf("Nhap ten va so dien thoai muon them vao dau: ");
                type_contact p;
                p =new _contact_node;
                p = create_contact_node();
                add_contact_Flist(head, p);
				 
                printf("THEM THANH CONG!\n");
                printf("\n");
                break;
            };
            case 4: //Them vao cuoi
                {
                printf("Nhap ten va so dien thoai muon them vao cuoi: ");
                type_contact p;
                p = new _contact_node;
                p = create_contact_node();
                add_contact_Llist(head,p); 
                
                printf("THEM THANH CONG!\n");
                printf("\n");
                break;
                };
	         case 5: // Them vao giua
            {
               	printf("Nhap ten va so dien thoai muon them vao: ");
                type_contact p;
                type_contact mid_node = Search_Mid_Node(head);
                p = new _contact_node;
               	p = create_contact_node();
                add_contact_Mlist(head,mid_node,p); 
               
				printf("THEM THANH CONG!\n");
                printf("\n");  
				break;         
            };   
            case 6: //Dem
            {
            	int t;
                t=count_contact_list(head);
                printf("\nDanh ba cua ban co tong so lien lac la: %d !\n",t);
                break;
            };
            case 7: // Tim kiem
            {   
            	char name_search[20];
 	
				printf("Nhap ten trong danh ba can tim: ");  
				fflush(stdin);
				gets(name_search);
            	searching_contact_list(head,name_search);
            	
				printf("\n");	
            	break;
            };
            case 8: // Xoa 1 nut
            {
            	char name_delete[20];
            	printf("Nhap ten ban muon xoa: ");
            	fflush(stdin);
            	gets(name_delete);
 	
            	int k = delete_node_contact_list(head,name_delete);         	
            	if(k==0)
            		printf("Khong tim thay ten can xoa!!! \n");
           		else{
           			printf("XOA THANH CONG! \n");
	           }
            	break;		
            };
            case 9: // Xoa toan bo
                {
                delete_contact_list(head);
                
                printf("XOA THANH CONG!\n");
            	printf("\n");
                break;
            };
        }
	}while(chon <=9 && chon >=0);
        
	return 0;
}

// 1.Ham khoi tao danh ba, quan ly con tro dau la head
void contact_intialize (type_contact &head)
{
	head = NULL;
}

void num_intialize (type_num &first)
{
	first = NULL;
}

// 2.Ham tao 1 nut
type_contact create_contact_node()
{
    type_contact p;
    p = new _contact_node;
    p->list_of_number=NULL;
    if(p == NULL)
        return NULL;
    else
    {
        p->name= new char[20];
        printf("\nNhap ten luu trong danh ba: ");
        fflush(stdin);
        gets(p->name);
        create_num_list(p->list_of_number);
        p->down=NULL;
        return p;
    }
}
type_num create_num_node()
{
    type_num first;
    first= new _num_node;
    first->number=new char[12];
    fflush(stdin);
    gets(first->number);
    return first; 
}

//3.Ham bo sung nut p vao dau danh sach
type_contact add_contact_Flist(type_contact &head, type_contact p)
{
	if(head==NULL)
    {
  	 	head=p;
        p->down = NULL;
    }
    else
    {
        p->down=head;
        head=p;
    }
}

type_num add_num_Flist(type_num &first, type_num p)
{
    if(first==NULL)
    {
  	 	first=p;
        p->next = NULL;
    }
    else
    {
        p->next=first;
        first=p;
    }          
}


// 4.Ham bo sung nut p vao cuoi danh sach
type_contact add_contact_Llist(type_contact &head, type_contact p)
{
	type_contact q;
    if(head == NULL)
		head = p;
	else{
		q = head;
		while(q->down!= NULL)
			q = q->down;
		q->down = p;
		p->down = NULL;
	}
}

// Ham tim nut giua danh ba
type_contact Search_Mid_Node(type_contact head)
{
	type_contact p= head;
	int i=0;
	while (p!= NULL)
	{
		p=p->down;
		i++	;
	}	
	type_contact q= head;
	for(int j=0; j<i/2;j++)
	{
		q=q->down;
	}
	return q;	
}
// 5.Ham bo sung nut p vao sau nut mid_node 
type_contact add_contact_Mlist(type_contact &head,type_contact &mid_node,type_contact p)
{
	type_contact a = head;
	while(a!=NULL)
	{	if(strcmp(a->name,p->name)==0)
		 	return head ;	
		a=a->down;
	}
 	if (mid_node!=NULL && p !=NULL)  
		{
			p->down = mid_node->down;
			mid_node->down = p; 	
		}	
}

// 6.Hàm tao danh ba dien thoai.
type_contact create_contact_list(type_contact &head, int n)
{
    type_contact p;
    for(int i=0; i<n; i++)
    {
        p=create_contact_node();
        add_contact_Flist(head,p);
    }
}
 
// Ham tao danh sach cac so dien thoai
void create_num_list(type_num &first)       
{
        type_num p;
        int tong;
        printf("Tong so dien thoai cua nguoi nay la:");
        scanf("%d",&tong);
        for(int i=1;i<=tong;i++)
        {
        	printf("So thu %d la: ", i);
         	p=create_num_node();
          	add_num_Flist(first,p);      
        }       
}
 
// 7. Ham duyet danh ba
void travelling_contact_list(type_contact head)
{
    type_num first;
    while(head!=NULL)
    {
        printf("|%-20s|",head->name);
        first = head ->list_of_number;
        head = head ->down;   
        while(first!=NULL)
        {
            printf("%-12s|",first->number);
            first=first->next;
        }
        printf("\n");
    }
}

// 8. Hàm dem so node cua danh ba
int count_contact_list(type_contact head)
{
    int dem=0;
    while(head!= NULL)
    {
        head=head->down;
        dem++;
    }
    return dem;
}
// 9. Ham tim nut co truong ten la name_search
type_contact searching_contact_list(type_contact head,char *name_search)
{
	int k = 0;
	
	for(type_contact p = head; p != NULL; p = p->down)
	{
		if(strcmp(p->name,name_search) == 0)
		{
			printf("Dia chi nut can tim la: %d \n", p);
			printf("\n");
			k++;			
		}
	}
	if(k == 0)
		printf("Khong tim thay!!!\n");
}

// Ham tim xoa
type_contact search_delete(type_contact &head , char* name_delete)
{
		type_contact p=head;
		while( p!=NULL && strcmp(p->down->name,name_delete)!=0)
			p=p->down;
		return p;
}
// 10. Ham xoa 1 nut co truong ten la name_delete
int delete_node_contact_list(type_contact &head,char* name_delete)
{
	int k = 0;
	if(strcmp(head->name,name_delete)==0){
		if(head!= NULL)
		{
			type_contact p=head;
			head=p->down;
			p->down = NULL;
			free(p);
		}
		k++;
	}
	else{
		type_contact q = search_delete(head,name_delete);
		if(q!=NULL){
			if(q!=NULL)
			{
				_contact_node *p = q->down;
				if(p->down==NULL)	 
					q->down==NULL;
				q->down = p->down;
				p->down = NULL;
				free(p);
			}
			k++;
		}
	}
	return k;
}
// 11. Ham xoa tat ca cac nut trong danh ba
void delete_contact_list(type_contact &head)
{
    type_contact p = new _contact_node;
    while(head!=NULL)
    {
        p = head;
        head = head->down;
        free(p);
    }
}

Hi vọng là bạn chép sai, trùng lặp nhiều quá.

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