今天晚上作老师布置的作业,一道是单链表的倒置,可把我搞惨了..,这里也把我可悲的经历与大家说一下,提个醒免得以后犯和我一样的很傻的错误:
老师在PPT写好了函数接口,于是我就直接把它拷贝到vs 2005 express 中编写,写好了,ctrl + 7 进行编译,
“error C4335: 检测到 Mac 文件格式: 请将源文件转换为 DOS 格式或 UNIX 格式”
“ warning C4067: 预处理器指令后有意外标记 - 应输入换行符”
“晕”,我百思不得其解,这到底是怎么回事? 于是我把代码拷到记事本里发现有好多莫名的黑色的小方块,哎,可能就是它惹的事吧,我重新把代码在记事本中排好,再放回编译器中,OK,顺利链接,哈哈,
代码如下:
#include <iostream>
using namespace std;
enum Error { underflow, overflow, success };
template <class Node_entry >
struct Node {
Node_entry entry;
Node<Node_entry> * next;
Node();
Node ( Node_entry item, Node<Node_entry> * add_on=0 );
};
template< class Node_entry>
Node< Node_entry >::Node() {
next = NULL;
}
template< class Node_entry>
Node<Node_entry>::Node(Node_entry item, Node<Node_entry> *add_on) {
entry = item;
next = add_on;
}
// 以上是建立了一个模板的节点类型
template<class Node_entry>
Node<Node_entry> * Inverse (Node<Node_entry> * &first ) { // first 是传入链表的头指针
Node<Node_entry> * p = first , * q;
if( first == NULL ) return first;
else { p = p->next; first->next = NULL; // 把原来的头结点的next赋值为NULL }
while( p ) { // 通过循环向头指针后插入结点 。
q = p->next;
p->next = first;
first = p;
p = q; }
return first;}
void main() {
Node<int> * head = new Node<int> (1, NULL);
Node<int> * p1 = new Node<int> (2, head);
Node<int> * p2 = new Node<int> (3, p1);
Node<int> * p3 = new Node<int> (4, p2);
cout<<p3->entry<<endl; // 结果为 4, 这里 p3 为头指针
Node<int> * temp = Inverse( p3 );
cout<<p3->entry<<endl; // p3 现在也是头指针,不过由于已经倒置,所以 输出为 1
}
最后和大家分享一下我的小经验,
p->next 在左值位置 := 把一个节点链接到另一个节点尾;
p->next 在右值 := 把p下一个节点的指针赋值给另一个指针