⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 link.cpp

📁 学生管理信息系统[VC]实现源代码。MIS
💻 CPP
字号:
/*#ifndef LINKEDLIST_CLASS
#define LINKEDLIST_CLASS


#endif*/
#include "stdafx.h"
#include "Link.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#ifndef NULL
const int NULL=0;
#endif

IMPLEMENT_SERIAL(Node, CObject, 1)

//节点类的实现部分
//初始化数据和指针成员
Node::Node()
{
}
Node::Node(struct1* item,Node * ptrnext=NULL) : next(ptrnext)
{ 
	data=*item;
}

//串行化操作重载函数
void Node::Serialize(CArchive& ar)
{
	//CObject::Serialize(ar);
	if(ar.IsStoring())
	{
        ar<<data.name<<data.num<<data.score[0]
			<<data.score[1]<<data.score[2]<<data.sex;
	}
    else
	{
		//struct1 st;

        //ar>>st.name>>st.num>>st.score[0]
		//	>>st.score[1]>>st.score[2]>>st.sex;
		ar>>data.name>>data.num>>data.score[0]
			>>data.score[1]>>data.score[2]>>data.sex;
	}

}
//获取后继节点的地址
Node *Node::NextNode(void) const
{
	return next;
}
//在当前节点之后插入一个节点
void Node::InsertAfter(Node * p)
{
	p->next = next;
	next = p ;
}
//删除当前节点的后继节点,并返回其首地址
Node *Node::DeleteAfter(void)
{
	Node*tempPtr = next;
	if (next==NULL)
		return NULL;
	next=tempPtr->next;
	return tempPtr;
}
//求总成绩
int Node::Sum(Node *p)
{ int sum;
	sum=p->data.score[0]+p->data.score[1]+p->data.score[2];
	return sum;
}
//链表类的实现部分
//生成新结点
Node* LinkedList::GetNode(struct1* item,Node *ptrNext=NULL)
{
	Node *newNode;
	//为新结点分配内存空间,然后将item和IextPtr传递给构造函数

	newNode=::new Node(item,ptrNext);
    if(newNode==NULL) //如果分配内存失败,程序中止
	{
		AfxMessageBox("该节点内存分配失败!");
		exit(1);
    }
	return newNode;
}
//构造函数
LinkedList::LinkedList(void)
{
	//front=new Node;///////////////////////////////////////////////////////////
	front=NULL;
	rear=NULL;

 
}
LinkedList::~LinkedList(void)
{
}
//统计学生信息个数
int LinkedList::ListSize(void)
{
	int s=0;
	Node *ptr;
	ptr=front;
	while(ptr !=NULL)
	{
		s++;
	    ptr=ptr->next;
	}
	return s;

}

//得到头节点
Node * LinkedList::GetFront()
{
	return front;
}

//判断链表是否为空
int LinkedList::ListEmpty(void)
{
	if (ListSize()==0)
		return TRUE;
	else
		return FALSE;
}

//在表尾添加一个数据域为item的结点
void LinkedList::InsertRear(struct1* item)
{
	Node *newNode;
	currPtr = front;
	if (currPtr ==NULL)
	{  
		newNode=GetNode(item);
		front=newNode;//
		//front->next =NULL;
	    //currPtr->InsertAfter(newNode);
	}
	else
	{
		while(currPtr->NextNode()!=NULL)
			currPtr=currPtr->NextNode();
		newNode=GetNode(item);
		currPtr->InsertAfter(newNode);
	}
}
//删除指定学生的学籍信息
void LinkedList::Delete(CString NAME)
{
	currPtr=front;
	prevPtr=NULL;
	if (currPtr==NULL)
		return;
	while(currPtr!=NULL && currPtr->data.name!=NAME)
	{
		prevPtr = currPtr;
		currPtr = currPtr->NextNode();
	}
	if(currPtr!=NULL)
	{
		if(prevPtr==NULL)
			front =front->NextNode();
		else
			prevPtr->DeleteAfter();
		::delete currPtr;    
	}

}
//按学好和姓名对学生信息进行检索
Node* LinkedList::SearchByNo(CString NUM)
{
	currPtr=front;
	while(currPtr!=NULL)
	{
		if(currPtr->data.num==NUM)
			return currPtr;
		currPtr=currPtr->NextNode();

	}
	return currPtr;
	
}
Node* LinkedList::SearchByName(CString NAME)
{
	currPtr=front;
	while(currPtr!=NULL)
	{
		if(currPtr->data.name==NAME)
			obArray.Add((CObject*)currPtr);
			
		currPtr=currPtr->NextNode();

	}
	if(obArray.GetSize())
		return (Node*)obArray.GetAt(0);
	else
		return currPtr;
	
}
//排名
int LinkedList::Paiming(Node* &currPtr)
{
	int mingci=1;

	Node *ptr;
	ptr=front;
	if(ptr==NULL)
	{
		return 0;
	}
	while(ptr!=NULL)
	{
		if(ptr->Sum(ptr) > ptr->Sum(currPtr))
			mingci++;
		ptr=ptr->NextNode();
			
	}
	return mingci;
}
//统计各科成绩的平均分
float LinkedList::Average(int i)
{
	currPtr=front;
	size=0; 
	int sumscore=0;
	float average[3];
	average[0]=0;
	average[1]=0;
	average[2]=0;
	while (currPtr!=NULL)
	{
		sumscore=sumscore+currPtr->data.score[i];
		size++;
		currPtr=currPtr->next;		
	}
	if(size!=0)
		average[i]=(float)sumscore/(float)size;
	return average[i];

}
//统计及格率
float LinkedList::Passrate(int i)
{
	currPtr=front;
	float passrate=0;
	int size=0;
	int num=0;
	while (currPtr!=NULL)
	{
		if (currPtr->data.score[i]>=60)
			num++;
		size++;
		currPtr=currPtr->next;
	}
	if(size!=0)
		passrate=(float)num/(float)size;
	return passrate;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -