| 
        
            下面的一个同学程序,编译和链接均没问题,只是运行出面错误。现将程序示众,大家细看我改过的地方面,用红色标记。 还是一个粗心,请细分每个功能函块,要画图来推推。要说明的是,我没有从功能上完善同学的程序。程序有好多改进的地方。 同学程序链接是:http://blog.csdn.net/u014577636/article/details/40653223 #include<iostream> ? using namespace std; ???
 const int Max=70; ?
 template<class TT> ?
 struct Node ?
 { ?? TT score; ?
 ? ? Node<TT> *next; ?
 };?
 ?
 template<class TT> ?
 class Score ?
 {? ? Node<TT> *first; ?
 ? public: ?
 ? ? ? Score(); ? ? ? ? ? ? ? ? ? //建立一个空的单链表 ?
 ? ? ? Score(TT a[],int n); ? ? ?//建立一个有N个元素的单链表(析构函数省略) ?
 ? ? ? ? //~Score(); ?
 ? ? ? void insert(int i,TT x); ? //插入函数 ?
 ? ? ? int locate( TT x); ? ? ? ? //按分数查找 ?
 ? ? ? TT get(int i); ? ? ? ? ? ? //按学号查找 ?
 ? ? ? TT Delete(int i); ? ? ? ? ?//删除函数 ?
 }; ?
 ??
 template<class TT> ?
 Score<TT>::Score() ?
 { ?? ?first=new Node<TT>; ?
 ? ? first->next= NULL; ?
 } ?
 ??
 template<class TT> ?
 Score<TT>::Score(TT a[],int n) ?
 { ?? int i; ?
 ? ? Node<TT> *s; ?
 ? ? first=new Node<TT>; ?
 ? ? first->next=NULL; ?
 ? ? for(i=0;i<n;i++){ ?
 ? ? ? ? s=new Node<TT>; ?
 ? ? ? ? s->score=a[i]; ?
 ? ? ? ? s->next=first->next; ?
 ? ? ? ? first->next=s; ?
 ? ? } ?
 } ?
 ??
 /*?
 template<class TT>?
 Score<TT>::Score(TT a[],int n) ? ? ? ? ? ? ? ? ?//这个是尾插法?
 {?? ?Node<TT> *s,*r;?
 ? ? first=new Node;?
 ? ? r=first;?
 ? ? for(i=0;i<n;i++)?
 ? ? {?? ?s=new Node; ?
 ? ? ? ? s->score=a[i];?
 ? ? ? ? r->next=s;?
 ? ? ? ? r=s;?
 ? ? }?
 ? ? r-next=NULL;?
 }?
 */ ?
 
 
 template<class TT> ?
 void Score<TT>::insert(int i,TT x) ?
 { ??Node<TT> *p,*s=NULL; ? ? ? ? ?
 ? ? p=first; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//从头结点开始 ? ? ? ??
 ? ? int count=0; ?
 ? ? for (count=0;p!=NULL && count<i-1;count++) ? ? ?//查找第i-1个节点 ?
 ? ? ? ? p=p->next; ?
 ? ? if(p==NULL)throw "位置"; ? ? ? ? ? ? ? ? ? ? ?//没找到 ?
 ? ? else{ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //找到了,插入新节点 ?
 ? ? ? ? s=new Node<TT>; ?
 ? ? ? ? s->score=x; ?
 ? ? ? ? s->next=p->next; ?
 ? ? ? ? p->next=s; ?
 ? ? } ?
 } ?
 ??
 template<class TT> ?
 int Score<TT>::locate(TT x) ?
 { ?
 ? ? Node<TT> *p; ?
 ? ? p=first->next; ?
 ? ? int count; ?
 ? ? for(count=1;p!=NULL;count++) ?
 { ? ? ? ? ? ? ? ? ? ? ? ? //加一个括号
 if(p->score==x)
 ? ? ? ? ? ?
 return count; //返回第i+1位同学 ?
 p=p->next; ? ? ? //加了这个语句
 } ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //加一个括号
 ? ? return 0;//找不到,退出循环 ?
 } ?
 ??
 template<class TT> ? ? ? ? //i的用处是什么,函数中没作到。
 TT Score<TT>::get(int i) ?
 { ?
 ? ? Node<TT> *p; ?
 ? ? p=first->next; ?
 ? ? int count; ?
 ? ? for(count=1;p!=NULL;count++) ?
 { ? ? ? ? ? ? ? ? ? //加一个括号
 p=p->next; ?
 ? ? ? ? if(p==NULL)throw "位置"; ?
 ? ? ? ? else return p->score; ? ? ? ? //找到了,返回这位同学 ?
 } ? ? ? ? ? ? ?//加一个括号
 ? ? }?
 ??
 template<class TT> ?
 TT Score<TT>::Delete(int i) ?
 { ??Node<TT> *p,*q; ?
 ? ? TT x; ?
 ? ? p=first; ?
 ? ? int count=0; ?
 ? ? for(count=0;p!=NULL && count<i-1;count++) ?
 ? ? ? ? p=p->next; ?
 ? ? if(p==NULL||p->next==NULL) //节点p不存在,或者p的后继节点不存在 ?
 ? ? ? ? throw "位置"; ?
 ? ? else{ ?
 ? ? ? ? q=p->next;x=q->score; ?
 ? ? ? ? p->next=q->next; ?
 ? ? ? ? delete q; ?
 ? ? ? ? return x; ?
 } ?
 } ?
 ??
 int main() ? ? ? ? ? ? ?//主程序设计不是佷好,一定在不同处理后要输出来看看。
 { ???int a[Max]={0,2}; ?
 ? ? Score<int> s(a,4); ?
 ? ? ?s.insert(1,98); ?
 ? ? ?cout<<s.get(1); ?
 ? ? ?s.locate(98); ?
 ? ? ?s.Delete(1); ?
 ? ? ? ? return 0; ?
 } ?
 
 ? ? ?祝大家下次调试成功! (编辑:宣城站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |