加粗样式code#include<iostream> #include<stdio.h> #include<string.h> using namespace std; struct chainnode{ int element; char name[15]; struct chainnode *nextnode;}; class singlelist{ public: singlelist(int initiationsize=5); ~singlelist(); void insertnode(int index,int element,char* name); void printlist(); void erasenode(int index); struct chainnode get(int index); int size(); void printnode(); private: chainnode* firstnode; int listsize; }; singlelist::singlelist(int initiationsize) { firstnode=NULL; listsize=0; } singlelist::~singlelist() { while(firstnode!=NULL) { struct chainnode* tempnode=firstnode->nextnode; delete firstnode; firstnode=tempnode; }} void singlelist::insertnode(int index,int theelement,char* name) { if(index==0) { struct chainnode* tempnode=new chainnode; tempnode->element=theelement; tempnode->nextnode=firstnode; strcpy(tempnode->name,name); firstnode=tempnode; } else { struct chainnode* tempnode=firstnode; for(int i=0;i<index-1;i++) tempnode=tempnode->nextnode; struct chainnode* datanode=new chainnode; datanode->element=theelement; strcpy(datanode->name,name); datanode->nextnode=tempnode->nextnode; tempnode->nextnode=datanode; } listsize++;} void singlelist::erasenode(int index) { int i=0; chainnode *tempnode=firstnode; if(index==0) firstnode=firstnode->nextnode; else { while((i++<(index-1))&&(tempnode->nextnode!=NULL)) tempnode=tempnode->nextnode; tempnode->nextnode=tempnode->nextnode->nextnode; } listsize--;} void singlelist::printlist(){ struct chainnode *tempnode=firstnode; while(tempnode!=NULL) { cout<<tempnode->element<<" "<<tempnode->name<<endl; tempnode=tempnode->nextnode; } cout<<endl;} struct chainnode singlelist::get(int index){ chainnode datanode; int i=0; chainnode *tempnode=firstnode; if(index==0) { datanode=*tempnode; return datanode; } else { while((i++<(index-1))&&(tempnode->nextnode!=NULL)) tempnode=tempnode->nextnode; datanode=*(tempnode->nextnode); return datanode; } } int singlelist::size(){ int size=listsize; return size;} singlelist binsort(singlelist chain,int range){ singlelist *box; box=new singlelist[range+1]; int size=chain.size(); for(int i=0;i<size;i++) { chainnode tempnode=chain.get(0); chain.erasenode(0); box[tempnode.element].insertnode(0,tempnode.element,tempnode.name); } for(int i=0;i<=range;i++) { while(box[i].size()!=0) { chainnode tempnode=box[i].get(0); box[i].erasenode(0); chain.insertnode(chain.size(),tempnode.element,tempnode.name); } } delete box; return chain;}int main(void){ int n,element,range; char *name=new char[10]; singlelist one; cin>>n; cin>>range; for(int i=0;i<n;i++) { cin>>element; cin>>name; one.insertnode(i,element,name); } cout<<"after binsort:"<<endl<<endl; one= binsort(one,range); one.printlist(); return 0;}
测试数据:
十个数据 最大范围为15
每个数据第一个element为分数,后为名字
/*
10 15
14 qwe
12 rty
10 agd
10 mnb
10 poi
8 fgh
6 jkl
4 iop
2 xcv
0 vbn
*/
发现的问题:
1.结构之前用的指针地址,动态申请内存,使得结构赋值时传递的相同地址,内存错误.
2.delete应该使用在动态内存分配变量,而不是指针.
相关文章: