编了几年vc.又编了几年c#一直很好奇.这两个性能如何.
还是写个程序进行测试一下
vc6结构体
struct DataNode1{
int number; //学号
char name[10]; //姓名
char sex [4]; //性别
double maths; //高数
double Clan; //C语言
double english; //英语
};
如果给结构体数组赋值 .添加1000000个 显示到列表之中 。经过测试 。vc6显示用时 [329]秒如果采用结构体链表用时[333]秒
同样的结构体 c# 添加 添加1000000个 。 显示到列表之中 。经过测试 。 366.4559601秒
显然 vc6比较快
这是测试的c语言 的头文件
#define LEN sizeof(struct student_stu)
struct DataNode{
int number; //学号
char name[10]; //姓名
char sex [4]; //性别
double maths; //高数
double Clan; //C语言
double english; //英语
DataNode *Next;
};
struct DataNode1{
int number; //学号
char name[10]; //姓名
char sex [4]; //性别
double maths; //高数
double Clan; //C语言
double english; //英语
};
class CStudent{
public:
CStudent();
virtual ~CStudent();
void Add( DataNode & mNode); //添加
void Insert(const int index, DataNode& mNode);
void Clear();
void del(int number );
int Del_Node(DataNode* pHead,int back);
void showLinkToList(CListBox &mlist); //删除
void save(); //保存
void showLinkToList(CListCtrl &mlist);
void AddToTail ( DataNode * mNode) ;
int Length();
void visit_list();
void readFileToLink(char *strFileFullName);
//排序
void InsertSort();//插入排序
void BubbleSort();//冒泡排序
void sort(); //默认排序
//private:
DataNode* First;
DataNode* Last;
int Count;
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Student.cpp: implementation of the CStudent class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "data.h"
#include "Student.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CStudent::CStudent()
{
First = Last = NULL;
Count = 0;
}
CStudent::~CStudent()
{
Clear();
Count = 0;
}
void CStudent::Add( DataNode & mNode)
{
//申请新节点
/* DataNode * newNode=new DataNode();
newNode->data=str;
newNode->Next=NULL;
if(First == NULL)
{
First = newNode;
Last = First;
Count =1;
return;
}else
{
//找最后一个节点
DataNode * q = Last;
//插入到链表最后
q->Next=newNode;
Count ++;
}*/
if(Count == 0)
{
First = new DataNode;//新建立结点&mNode;
//开始赋值
First-> number =mNode.number; //学号
strcpy( First-> name,mNode.name); //姓名
strcpy(First-> sex,mNode.sex); //性别
First-> maths=mNode.maths; //高数
First-> Clan=mNode.Clan; //C语言
First-> english=mNode.english; //英语
First->Next = NULL;
Last = First;
}
else
{
if(Last != NULL)
{
while(Last->Next!=NULL)
{
Last =Last->Next;
}
}
Last->Next = NULL;
Last->Next =new DataNode;// &mNode;
Last = Last->Next;
Last-> number =mNode.number; //学号
strcpy( Last -> name,mNode.name); //姓名
strcpy( Last -> sex,mNode.sex); //性别
Last-> maths=mNode.maths; //高数
Last-> Clan=mNode.Clan; //C语言
Last-> english=mNode.english; //英语
Last->Next = NULL;
}
++Count;
}
void CStudent::AddToTail ( DataNode * mNode)
{
DataNode * p = mNode;
int itemno =0;
while(p!=NULL)
{
Add( mNode[itemno]);
p=p-> Next;
itemno++;
}
//没有判断当链表为空的时候!!
}
int CStudent::Length()
{
return Count;
}
//保存。你自己完成
void CStudent::save()
{
}
//清空
void CStudent::Clear()
{
DataNode* p = NULL;
while(First!=NULL)
{
p = First;
First=First->Next;
p->Next=NULL;
delete(p);
p = NULL;
}
Last = NULL;
First= NULL;
Count = 0;
}
//插入
void CStudent::Insert(const int index, DataNode& mNode)
{
if(index<Count-1)
{
DataNode* node = First;
for(int i=0;i<index;i++)
{
node = node->Next;
}
DataNode* tmp = new DataNode;
tmp->Next = node->Next;
node->Next = tmp;
tmp-> number =mNode.number; //学号
strcpy( tmp-> name,mNode.name); //姓名
strcpy(tmp-> sex,mNode.sex); //性别
tmp-> maths=mNode.maths; //高数
tmp-> Clan=mNode.Clan; //C语言
tmp-> english=mNode.english; //英语
}
else if(index == Count-1)
{
this->Add(mNode);
}
++Count;
}
void CStudent::del( int number)
{
if (First==NULL)return;//如果链表没有结点,就直接输出提示
DataNode *p=First; //初始化pGuard指针
DataNode *pGuard=First;
if (First->number==number)//如果头结点数据符合关键字
{
p=First;//头结点是待删除结点
First=First->Next;//先连
delete p;//后断
Last = NULL;
Count=0;
return;//结束函数运行
}
else//否则
{
while(p){
if(p->number == number){
pGuard->Next = p->Next;
free(p);
return ;
}else{
pGuard = p;
}
p = p->Next;
}
}
//若head单链表中有数据为t的结点,删除之
/* if(First== NULL)return;
DataNode *p =First ;
bool bFound =false;
DataNode *node1=First;
DataNode *node2=NULL;
if (node1->number==number)
{
First=First->Next;
delete node1 ;
Count--;
if(First== NULL)
{
// delete Last;
Last = NULL;
Count=0;
}
}
else
{
node1=node1->Next;
while (node1!=NULL)
{
node2=node1;
node2=node2->Next;
if (node2->number==number)
{
node1->Next=node2->Next;
delete node2 ;
Count--;
break;
}
node1=node1->Next;
}
}
//若head链表中没有数据域的值为number的结点,则输出删除失败的信息
if(!bFound)
{
printf("\ndelete failure!");
}*/
}
// 删除链表节点函数
int CStudent::Del_Node(DataNode* pHead,int back)
{
int i = 0;
int data;
DataNode *_node = pHead;
DataNode* pSwap;
if ((back < 1) && (NULL == _node->Next))
{
printf("删除失败!\n");
return 0;
}
while(i < back-1)
{
_node = _node->Next;
++i;
}
pSwap = _node->Next;
data = pSwap->number;
_node->Next = _node-> Next->Next;
free(pSwap);
return data;
}
//显示学号到listbox
void CStudent::showLinkToList(CListBox &mlist)
{
//输出head单链表
mlist.ResetContent();
CString str= "";
DataNode*p=Last;
while(p)
{
str = p->number ;
mlist.AddString(str ); //输出结点的数据——字符串
p=p->Next;
}
}
void CStudent::showLinkToList(CListCtrl &mlist)
{
//输出head单链表
mlist.DeleteAllItems();
CString str= "";
int item =0;
DataNode*p=First;
while(p)
{
str.Format("%d", p->number) ;
mlist.InsertItem(item,str ); //输出结点的数据——字符串
mlist.SetItemText(item,1,p->name );
mlist.SetItemText(item,2,p->sex );
str.Format ("%.1f",p->maths );//输出节点数据高数
mlist.SetItemText (item,3,str );
str.Format ("%.1f",p->Clan );//输出节点数据C语言
mlist.SetItemText (item,4,str);
str.Format ("%.1f",p->english );//输出节点数据英语
mlist.SetItemText (item,5,str );
item++;
p=p->Next;
}
}
/************************************************************************/
/* 遍历链表 */
/************************************************************************/
void CStudent::visit_list()
{
DataNode* p = First ;
while(p)
{
printf("current_addr=[%p] son_addr=[%p] son_son_addr=[%p] \n",p,p->Next,p->Next);
p=p->Next;
}
}
//把文件的内容读入到链表里面
void CStudent::readFileToLink(char *strFileFullName)
{
Clear();//清空
if(!FileExist(strFileFullName))
{
return ;
}
char strbuf[1024];
FILE *fp;
if((fp=fopen(strFileFullName,"r"))==NULL)
{
printf("File Name Error.\n");
return ;
}
int i=0;
while(!feof(fp))
{
if(fgets(strbuf,1024,fp))
{
i++;
//写个函数。把字符串转换成一个数据节点;然后把数据节点add
//Add(strbuf);
}else
{
break;
}
}
fclose(fp);
return ;
}
/*
==========================
功能:直接插入排序(由小到大)
返回:指向链表表头的指针
==========================
*/
void CStudent::InsertSort()
{
struct DataNode *first; /*为原链表剩下用于直接插入排序的节点头指针*/
struct DataNode *t; /*临时指针变量:插入节点*/
struct DataNode *p; /*临时指针变量*/
struct DataNode *q; /*临时指针变量*/
first = First->Next; /*原链表剩下用于直接插入排序的节点链表:可根据图12来理解。*/
First->Next = NULL; /*只含有一个节点的链表的有序链表:可根据图11来理解。*/
while (first != NULL) /*遍历剩下无序的链表*/
{
/*注意:这里for语句就是体现直接插入排序思想的地方*/
for (t=first, q=First; ((q!=NULL) && (q->number < t->number)); p=q, q=q->Next); /*无序节点在有序链表中找插入的位置*/
/*退出for循环,就是找到了插入的位置*/
/*注意:按道理来说,这句话可以放到下面注释了的那个位置也应该对的,但是就是不能。原因:你若理解了上面的第3条,就知道了。*/
first = first->Next; /*无序链表中的节点离开,以便它插入到有序链表中。*/
if (q == First) /*插在第一个节点之前*/
{
First = t;
}
else /*p是q的前驱*/
{
p->Next = t;
}
t->Next = q; /*完成插入动作*/
/*first = first->Next;*/
}
return;
}
void CStudent::BubbleSort()
{
AfxMessageBox("不会写");
}
//默认的排序
void CStudent:: sort()
{
DataNode*p3=First;
DataNode*p2,*p1,*p4,*p5;
while(p3->Next->Next!=NULL)//注意链表向前推进的方式
{
p2=p3->Next;
p5=p2;
p1=p2;
bool flag=false;
while(p1->Next!=NULL)//内存循环终止的条件
{
if(p5->number >p1->Next->number)//找出原链表中剩余节点中值最小的那个节点
{
p5=p1->Next;
p4=p1;
flag=true;
}
p1=p1->Next;
}
if(flag)//交换两个节点的顺序,值小的节点往前调
{
if(p2==p4)//此种情况为要交换顺序的两个节点相邻
{
p2->Next=p5->Next;
p5->Next=p2;
p3->Next=p5;
}
else//这种情况为要交换的两个节点不相邻
{
DataNode*temp=p5->Next;
p5->Next=p2->Next;
p3->Next=p5;
p4->Next=p2;
p2->Next=temp;
}
}
p3=p3->Next;
}
}