📄 link.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 + -