标题:上次链表类没解决的问题
只看楼主
想你的天空
Rank: 2
等 级:新手上路
威 望:5
帖 子:610
专家分:0
注 册:2004-12-30
 问题点数:0 回复次数:3 
上次链表类没解决的问题

#include<iostream> #include<assert.h> using namespace std; template<class T> class Chain; template<class T> class ChainNode{ friend class Chain<T>; public: ChainNode(){} //ChainNode(const T& data_): data(data_){} private: T data; ChainNode<T> *next; }; template<class T> ostream& operator<<(ostream& out,const Chain<T>&x); template<class T> class Chain{ public: Chain(){} ~Chain();//链表析构函数,用于上述链表种所有节点 Chain<T>* CreateList(int len); bool IsEmpty(); int Length() const; //返回链表中元素的总数 bool Find(int k,T& x) const;//寻找链表中的第k个元素,并将其传送到x。如果不存在第k个元素,则返回false,否则返回true int Search(const T&x) const;//寻找x,如果发现x,则返回x的地址下标,如果x不在链表中,则返回0 Chain<T>& Insert(int k,const T& x);//在第k个元素之后插入x Chain<T>& Delete(int k);//把第k个元素取至x,然后从链表中删除第k个元素 void Output(ostream& outs) const; friend ostream& operator<< <>(ostream& out,const Chain<T>&x);//重载<<*/ private: ChainNode<T> *first,*last; }; //创建链表 template<class T> Chain<T>* Chain<T>::CreateList(int len) { ChainNode<T> *link,*s; first = new ChainNode<T>; link = first; cout<<"输入"<<len<<"个元素:"<<endl; while(len-->0) { s = new ChainNode<T>; cout<<"input the numbers:"; cin>>s->data; //创建的数据

link->next = s; link = s; } link->next = NULL; return this; } //析构函数 template<class T> Chain<T>::~Chain() {//链表析构函数,用于删除上述链表种所有节点 ChainNode<T>* link; while(first) { link = first->next; delete first; first = link; } } template<class T> bool Chain<T>::IsEmpty() { if(first == NULL) return true; else return false; } template<class T> int Chain<T>::Length() const {//返回链表中元素的总数 ChainNode<T> *current = first; int len = 0; while(current!=NULL) { len++; current = current->next; } return len-1; }

template<class T> bool Chain<T>::Find(int k,T& x)const {//寻找链表中的第k个元素,并将其传送到x。如果不存在第k个元素,则返回false,否则返回true if(k<1) { cout<<"i值非法"<<endl; return false; } ChainNode<T> *current = first->next; int index = 1; while(index<k && current) { current = current->next; index++; } if(current) { x = current->data; return true; } return false; //不存在第k个元素 } //查找 template<class T> int Chain<T>::Search(const T&x) const {//寻找x,如果发现x,则返回x的地址下标 //如果x不在链表中,则返回0 ChainNode<T> *current = first->next; int index = 1; while(current && current->data!=x) { current = current->next; index++; } if(current) return index; return 0; } //删除 template<class T> Chain<T>& Chain<T>::Delete(int k) {//把第k个元素取至x,然后从链表中删除第k个元素 ChainNode<T> *p = first; //p指向当前节点的前驱 int j = 0; ChainNode<T> *q = p->next; while( p && j< k - 1) { p = p->next ; j++; } if(!(p->next)|| j> k - 1) cout<<"删除位置不合理!"<<endl; q = p->next ; p->next = q->next; delete q; //释放删除了的节点 return *this; } //插入 template<class T> Chain<T>& Chain<T>::Insert(int k,const T& x) { if(k<0) cout<<"插入位置非法"<<endl;//throw OutOfBounds(); ChainNode<T> *p = first; for(int index = 1; index<k && p;index++) p = p->next;

ChainNode<T> *y = new ChainNode<T>; y->data = x; if(p) { y->next = p->next; p->next = y; } else { y->next = first; first = y; return *this; } } //输出 template<class T> void Chain<T>::Output(ostream& outs) const { ChainNode<T> *current; for(current = first->next;current ;current = current->next) outs<< current->data <<" "; } //重载<< template<class T> ostream& operator<<(ostream& outs,const Chain<T>& x) { x.Output(outs); return outs; } int main() { Chain<int> L1,L2; int wantFind; L1.CreateList(4);

if(L1.IsEmpty()) cout<<"链表是空的!"<<endl;

else cout<<"链表非空!"<<endl; cout<<"链表长度是:"<<L1.Length()<<endl; cout<<"原始链表是:"<<L1<<endl; cout<<"查找第2个元素。。。"<<endl; if(L1.Find(2,wantFind)) cout<<"找到了第2个元素! 第2个元素是:" <<wantFind<<endl;

cout<<"查找元素5:"<<endl; cout<<"元素5是第"<<L1.Search(5)<<"个"<<endl;

cout<<"删除元素2..."<<endl; cout<<"查找元素2:"<<endl; cout<<"元素2是第"<<L1.Search(2)<<"个"<<endl; L1.Delete(L1.Search(2));//把第k个元素取至x,然后从链表中删除第k个元素

cout<<"删除2后的链表是"<<L1<<endl;

cout<<"在第3个元素之后插入9..."<<endl; L1.Insert(3,9);

cout<<"插入9后的链表是"<<L1<<endl; system("pause"); return 0; } // 特别声明, 偶改动了好几次, 虽然kai上次调的能运行,但是太偶然了,存在错误 //例如我吧 creatlist里的 cin>>link->data; //创建的数据 改为 cin>>s->data; //创建的数据 //删除和输出都改动了点, first是头节点,不存放元素的指针 //这个链表类能执行删除,插入,输出, 可是程序结束时候出现异常,说内存非法访问 // 在.NET里弄的

搜索更多相关主题的帖子: 链表 Chain class data template 
2005-09-14 21:33
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
得分:0 
我真的要叫你老师傅了.

什么叫太偶然? 如果说你在测试程序时, 发现程序不能100% 运行成功,那么你可以说, 那个程序的运行成功具有偶然性. 但是你改动了程序, 然后再来说, 程序的出错是因为原程序的什么偶然性. 这句话怎么说的上呢?

我看你老是在指针里面出错, 自己又不会改错, 问题就出在你不会单步调试. 程序员不会单步调试, 那是活不下去的, 你这么个小程序就改不过来, 以后怎么写大程序呢?

我发现, 你写程序的思路基本是对的, 但是在局部处理很有问题!
我给你一个建议, 这个建议你别看它很一般, 其实这是每个程序员的法宝.
我来告诉你, 写程序千万不能等全部写完了, 再来调试, 如果你没有悟出这个道理, 那你的天分是不够的.
一般写程序时, 写完一个独立的函数, 就要调试, 调试这个独立函数对整个程序的影响, 如果没有问题, 继续写下一个独立函数, 反复这个过程, 直到程序完全完成. 我今天告诉你这一点, 比我送你个程序还要有价值.

程序你自己调试吧, 如果你不懂单步调试, 咱们再来讨论单步调试的问题.

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2005-09-14 23:56
想你的天空
Rank: 2
等 级:新手上路
威 望:5
帖 子:610
专家分:0
注 册:2004-12-30
得分:0 
谢谢kai斑竹, 调试我知道用 ,  也监视了变量的变化, 可就是看不出上面那个代码出的问题在哪里。
  调试方法有什么技巧吗?

2005-09-15 13:05
玩偶
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2005-3-9
得分:0 
楼主想你的天空,麻烦大侠有空帮我看看二叉树的旋转,小妹在此谢谢了

程序认识我,我不认识程序!
2005-09-15 13:47



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-27652-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.262969 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved