Từ 1 tới 2 trên tổng số 2 kết quả

Đề tài: Tìm lỗi hàm xóa những phần tử có khóa x(DSLKD)

  1. #1
    Ngày gia nhập
    10 2010
    Bài viết
    14

    Angry Tìm lỗi hàm xóa những phần tử có khóa x(DSLKD)

    Đề bài yêu cầu là xóa "tất cả" những sinh viên theo năm sinh do người dùng nhập vào.Nhưng mình làm thì toàn thấy xóa 1 phần tử thôi. Mọi người xem code và hướng dẫn mình cách sửa nhé .TKs
    Hàm xóa:
    Code:
    void XoaDau(LIST&L)
    {
    	SVNode*p;
    	p=L.pHead;
    	if(p!=NULL)
    	{
    	L.pHead=L.pHead->pNext;
    	delete p;
    	if(L.pHead==NULL)
    	L.pTail=NULL;
    	}
    }
    	/////////////
    void XoaPT(LIST&L,int f)
    {
    	SVNode*p,*q;
    	p=q=L.pHead;
    	while(p!=NULL)
    	{
    		{
    		if(p->info.NamSinh==f)
    		{
    			if(p==L.pHead)
    				if(p->pNext==NULL)
    					L.pHead=L.pTail=NULL;
    				else
    					L.pHead=L.pHead->pNext;
    			else
    				if(p->pNext==NULL)
    					{
    						L.pTail=q;
    						L.pTail->pNext=NULL;
    					}
    				else
    						q->pNext=p->pNext;
    		}
    		q=p;
    		p=p->pNext;
    		}
    	}
    }
    	/////////////
    void Xoa(LIST&L)
    {
    	int a;
    	cout<<"Nhap NamSinh: ";
    	cin>>a;
    	SVNode*p;
    	p=L.pHead;
    	while(p!=NULL)
    	{
    		if(p->info.NamSinh==a)
    		{
    			if(p==L.pHead)
    				XoaDau(L);
    			else
    				XoaPT(L,a);
    		}
    		p=p->pNext;	
    	}
    }
    Còn đây là cả bài:
    Code:
    #include<iostream.h>
    #include<conio.h>
    #include<stdio.h>
    #include<string.h>
    #include<iomanip.h>
    #include<stdlib.h>
    struct SinhVien{
    	char MSSV[50];
    	char HoTen[30];
    	int NamSinh;
    	char NoiSinh[30];
    	float DTB;
    };
    struct SVNode{
    	SinhVien info;
    	SVNode*pNext;
    };
    struct LIST{
    	SVNode*pHead;
    	SVNode*pTail;
    };
    ///////////////////////////////////
    void KhoiTao(LIST&L)
    {
    	L.pHead=L.pTail=NULL;
    }
    ///////////////////////////////////
    void Nhap(SinhVien&S)
    {
    	cout<<"	\n		Nhap ma so sinh vien: ";
    	fflush(stdin);
    	gets(S.MSSV);
    	cout<<"		Nhap ho ten sinh vien: ";
    	fflush(stdin);
    	gets(S.HoTen);
    	cout<<"		Nhap nam sinh: ";
    	cin>>S.NamSinh;
    	cout<<"		Nhap noi sinh cua sinh vien: ";
    	fflush(stdin);
    	gets(S.NoiSinh);
    	cout<<"		Nhap vao Diem Trung Binh: ";
    	cin>>S.DTB;
    }
    	////////////
    SVNode*GetNode(SinhVien S)
    {
    	SVNode*p;
    	p=new SVNode;
    	if(p==NULL)
    	cout<<"Khong cap phat duoc";
    	else
    	{
    		strcpy(p->info.MSSV,S.MSSV);
    		strcpy(p->info.HoTen,S.HoTen);
    		p->info.NamSinh=S.NamSinh;
    		strcpy(p->info.NoiSinh,S.NoiSinh);
    		p->info.DTB=S.DTB;
    		p->pNext=NULL;
    	}
    	return p;
    }
    	//////////
    void AddHead(LIST&L,SVNode*p)
    {
    	if(L.pHead==NULL)
    	L.pHead=L.pTail=p;
    	else{
    		p->pNext=L.pHead;
    		L.pHead=p;
    	}
    }
    	///////////
    SVNode*InsertHead(LIST&L,SinhVien S)
    {
    	SVNode*p;
    	p=GetNode(S);
    	if(p!=NULL)
    	{
    		AddHead(L,p);
    		return p;
    	}
    	return NULL; 
    }
    /////////////////////////////////////////////////
    void XuatSinhVien(SVNode*p)
    {
    	cout<<"\n		Ma So sinh vien: "<<p->info.MSSV;
    	cout<<"\n		Ten sinh vien: "<<p->info.HoTen;
    	cout<<"\n		Nam sinh: "<<p->info.NamSinh;
    	cout<<"\n		Noi Sinh: "<<p->info.NoiSinh;
    	cout<<"\n		Diem trung binh: "<<p->info.DTB;
    }
    	////////////
    void XuatDS(LIST L)
    {
    	SVNode*p;
    	p=L.pHead;
    	while(p!=NULL)
    	{
    		XuatSinhVien(p);
    		cout<<"\n		------------";
    		p=p->pNext;
    	}
    }
    /////////////////////////////////////////////////////
    void XoaDau(LIST&L)
    {
    	SVNode*p;
    	p=L.pHead;
    	if(p!=NULL)
    	{
    	L.pHead=L.pHead->pNext;
    	delete p;
    	if(L.pHead==NULL)
    	L.pTail=NULL;
    	}
    }
    	/////////////
    void XoaPT(LIST&L,int f)
    {
    	SVNode*p,*q;
    	p=q=L.pHead;
    	while(p!=NULL)
    	{
    		{
    		if(p->info.NamSinh==f)
    		{
    			if(p==L.pHead)
    				if(p->pNext==NULL)
    					L.pHead=L.pTail=NULL;
    				else
    					L.pHead=L.pHead->pNext;
    			else
    				if(p->pNext==NULL)
    					{
    						L.pTail=q;
    						L.pTail->pNext=NULL;
    					}
    				else
    						q->pNext=p->pNext;
    		}
    		q=p;
    		p=p->pNext;
    		}
    	}
    }
    	/////////////
    void Xoa(LIST&L)
    {
    	int a;
    	cout<<"Nhap NamSinh: ";
    	cin>>a;
    	SVNode*p;
    	p=L.pHead;
    	while(p!=NULL)
    	{
    		if(p->info.NamSinh==a)
    		{
    			if(p==L.pHead)
    				XoaDau(L);
    			else
    				XoaPT(L,a);
    		}
    		p=p->pNext;	
    	}
    }
    /////////////////////////////////////////////////////
    void TimKiem(LIST L)
    {
    	char*ch=new char;
    	cout<<"Nhap vao Noi Sinh cua sinh vien muon tim";
    	fflush(stdin);
    	gets(ch);
    	SVNode*p;
    	p=L.pHead;
    	while(p!=NULL)
    	{
    		if(strcmp(p->info.NoiSinh,ch)==0)
    		{
    			XuatSinhVien(p);
    			cout<<"\n		-------------";
    		}
    		p=p->pNext;
    	}
    }
    /////////////////////////////////////////////////////
    void HoanVi(char*a,char*b)
    {
    	char*temp;
    	strcpy(temp,a);
    	strcpy(a,b);
    	strcpy(b,temp);
    }
    	///////////////
    void SapXep(LIST&L)
    {
    	SVNode*p,*q,*min;
    	p=L.pHead;
    	while(p!=L.pTail)
    	{
    		min=p;
    		q=p->pNext;
    	while(q!=NULL)
    	{
    		if(strcmp(q->info.HoTen,p->info.HoTen)<0)
    		min=q;
    		q=q->pNext;
    	}
    	HoanVi(min->info.HoTen,p->info.HoTen);
    	p=p->pNext;
    	}
    }
    /////////////////////////////////////////////////////
    void HieuChinh(LIST&L)
    {
    	SinhVien SV;
    	char*x=new char;
    	cout<<"Nhap vao MSSV ban muon hieu chinh: ";
    	fflush(stdin);
    	gets(x);
    	SVNode*p,*q;
    	p=L.pHead;
    	while((p!=NULL))
    	{
    		if(strcmp(p->info.MSSV,x)==0)
    		{
    			Nhap(SV);
    			q=GetNode(SV);
    			p->info.MSSV=q->info.MSSV;
    			p->info.HoTen=q->info.HoTen;
    			p->info.NamSinh=q->info.NamSinh;
    			p->info.NoiSinh=q->info.NoiSinh;
    			p->info.DTB=q->info.DTB;
    		}
    		p=p->pNext;
    	}
    	cout<<"Danh Sach Sinh Vien sau khi hieu chinh: ";
    	XuatDS(L);
    }
    /////////////////////////////////////////////////////
    void main()
    {
    	//clrscr();
    	SinhVien S;
    	LIST L;
    	int a,b,c;
    	do{
    		cout<<"	***Chon thao tac*** ";
    		cout<<"\n	1. Khoi Tao";
    		cout<<"\n	2. Nhap danh sach sinh vien";
    		cout<<"\n	3. Xuat danh sach sinh vien";
    		cout<<"\n	4. Them 1 sinh vien vao danh sach";
    		cout<<"\n	5. Xoa tat ca cac sinh vien theo thuoc tinh nam sinh";
    		cout<<"\n	6. Tim kiem sinh vien theo noi sinh";
    		cout<<"\n	7. Sap xep nhan vien theo ho ten";
    		cout<<"\n	8. Hieu chinh thong tin cua mot sinh vien";
    		cout<<"\n";
    		cin>>b;
    		switch(b)
    		{
    			case 1: KhoiTao(L);break;
    			case 2: 
    			cout<<"Nhap vao so luong sinh vien: ";
    			cin>>c;
    			for(int i=0;i<c;i++)
    			{
    				Nhap(S);
    				InsertHead(L,S);
    			}
    			break;
    			case 3: XuatDS(L);break;
    			case 4: cout<<"Nhap thong tin sinh vien can them: ";
    				Nhap(S);
    				InsertHead(L,S);
    				cout<<"\nDanh sach sinh vien sau khi them: ";
    				XuatDS(L);
    				break;
    			case 5: Xoa(L);
    			break;
    			case 6: TimKiem(L);break;
    			case 7: SapXep(L);break;
    			case 8: HieuChinh(L);break;
    		}
    		cout<<"\ntieptuc?(An-1)\n";
    		cin>>a;
    	}while(a!=-1);
    	getch();
    }

  2. #2
    Ngày gia nhập
    10 2010
    Bài viết
    7

    Mình thì không rành DSLKD lắm nhưng thấy ở đây bạn sai ở chỗ if(p==Head) XoaDau(L);...sau đó thì p->next;...thì làm sau được khi mà bạn đã delete p thì khi p->next sẽ trỏ ra null và kết thúc vòng lặp while
    C Code:
    1. void Xoa(LIST&L)
    2. {
    3.     int a;
    4.     cout<<"Nhap NamSinh: ";
    5.     cin>>a;
    6.     SVNode*p;
    7.     p=L.pHead;
    8.     while(p!=NULL)
    9.     {
    10.         if(p->info.NamSinh==a)
    11.         {
    12.             if(p==L.pHead)
    13.                 XoaDau(L);
    14.             else
    15.                 XoaPT(L,a);
    16.         }
    17.         p=p->pNext;
    18.     }
    19. }

Các đề tài tương tự

  1. Không xóa sửa trong linq dc, CSDL có 2 khóa chính Combo vs dattimepicker, 1 combo khóa ngoại
    Gửi bởi kenlove798 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 13-07-2014, 08:09 AM
  2. MS SQL với C# xóa dữ liệu khi bị ràng buộc khóa ngoại ?
    Gửi bởi codepro747 trong diễn đàn Thắc mắc Microsoft SQL Server & Microsoft Access
    Trả lời: 0
    Bài viết cuối: 22-09-2013, 01:45 PM
  3. Xử lý nút Xóa trong phần mềm quản lí Xe Khách với dữ liệu có khóa ngoại?
    Gửi bởi thanh_cute trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 9
    Bài viết cuối: 03-09-2011, 09:30 AM
  4. Database xóa khóa chính không cần xác định khóa ngoại!
    Gửi bởi hoanghuynh2409 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 04-03-2011, 08:31 PM
  5. xóa 1 phần tử có khóa k trong danh sách liên kết đơn
    Gửi bởi longhcmus trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 23-04-2010, 09:39 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn