程序代码:
#ifndef _LIST_H
#define _LIST_H
#include <windows.h>
//////////////////////////////////////////////////////////////////////////
//节点的结构
struct node
{
void *data;
node *last;
node *next;
};
//////////////////////////////////////////////////////////////////////////
//链表类
class CList
{
public:
//////////////////////////////////////////////////////////////////////////
//初始化链表
CList()
{
m_curNode = NULL; //为NULL则说明没有节点
m_curPos = -1; //为-1也说明没有节点
}
//////////////////////////////////////////////////////////////////////////
//在当前节点的左边插入一个新节点
void *insertLeft(void *dat)
{
node *newNode = new node;
newNode->data = dat;
newNode->last = NULL;
newNode->next = NULL;
if(!m_curNode)
{
m_curNode = newNode;
m_curPos = 0;
}
else
{
node *oldNode = m_curNode->last;
if(oldNode) oldNode->next = newNode;
newNode->last = oldNode;
newNode->next = m_curNode;
m_curNode->last = newNode;
m_curNode = newNode;
}
return m_curNode->data;
}
//////////////////////////////////////////////////////////////////////////
//在当前节点的右边插入一个新节点
void *insertRight(void *dat)
{
node *newNode = new node;
newNode->data = dat;
newNode->last = NULL;
newNode->next = NULL;
if(!m_curNode)
{
m_curNode = newNode;
m_curPos = 0;
}
else
{
node *nextNode = m_curNode->next;
if(nextNode) nextNode->last = newNode;
newNode->last = m_curNode;
newNode->next = nextNode;
m_curNode->next = newNode;
m_curNode = newNode;
m_curPos ++;
}
return m_curNode->data;
}
//////////////////////////////////////////////////////////////////////////
//删除当前节点
short deleteNode()
{
if(!m_curNode)return 0;
else
{
node *last = m_curNode->last;
node *next = m_curNode->next;
if(last) last->next = next;
if(next) next->last = last;
delete m_curNode;
m_curNode = NULL;
if(last)
{
m_curNode = last;
m_curPos --;
return 1;
}
else if(next)
{
m_curNode = next;
return 2;
}
else
{
m_curNode = NULL;
m_curPos = -1;
return 0;
}
}
}
//////////////////////////////////////////////////////////////////////////
//删除所有节点
int delAllEx()
{
int cnt = 0;
moveFirst();
node *tmp = m_curNode;
do
{
deleteNode();
cnt++;
} while (tmp = moveRight());
deleteNode();
m_curPos = -1;
cnt++;
return cnt;
}
//////////////////////////////////////////////////////////////////////////
//删除所有节点(最快)
int delAll()
{
int cnt = 0;
do cnt ++;
while (deleteNode());
return cnt;
}
//////////////////////////////////////////////////////////////////////////
//当前节点往左移动
node *moveLeft()
{
if(!m_curNode)
{
m_curPos = -1;
return NULL;
}
else
{
node *tmp = m_curNode->last;
if(tmp)
{
m_curNode = tmp;
m_curPos --;
return m_curNode;
}
else return NULL;
}
}
//////////////////////////////////////////////////////////////////////////
//当前节点往右移动
node *moveRight()
{
if(!m_curNode)
{
m_curPos = -1;
return NULL;
}
else
{
node *tmp = m_curNode->next;
if(tmp)
{
m_curNode = tmp;
m_curPos ++;
return m_curNode;
}
else return NULL;
}
}
//////////////////////////////////////////////////////////////////////////
//当前节点移动到最前
node *moveFirst()
{
while(moveLeft())
{}
return m_curNode;
}
//////////////////////////////////////////////////////////////////////////
//当前节点移动到最后
node *moveEnd()
{
while(moveRight())
{}
return m_curNode;
}
//////////////////////////////////////////////////////////////////////////
//循环移动当前节点,v为正则往右,负则往左,0则不移动
void loopMove(int v)
{
int idx = 0;
if(v < 0)
{
idx = abs(v);
for(int i = 0; i < idx; i++)
moveLeft();
}
else if(v > 0)
{
idx = abs(v);
for(int i = 0; i < idx; i++)
moveRight();
}
}
//////////////////////////////////////////////////////////////////////////
//当前节点移动到idx位置
void moveTo(int idx)
{
int a = idx - m_curPos;
loopMove(a);
}
//////////////////////////////////////////////////////////////////////////
//获得当前节点
node *getCurNode()
{
return m_curNode;
}
//////////////////////////////////////////////////////////////////////////
//获得当前节点的位置
int getCurPos()
{
return m_curPos;
}
//////////////////////////////////////////////////////////////////////////
//获得当前节点的data指针
void *getCurData()
{
if(!m_curNode) return NULL;
else return m_curNode->data;
}
//////////////////////////////////////////////////////////////////////////
//重载等于运算符,把另一个链表复制到此链表
void operator = (CList lst)
{
lst.moveFirst();
do insertRight(lst.getCurData());
while (lst.moveRight());
moveFirst(); //置于最前
}
//////////////////////////////////////////////////////////////////////////
//获得链表中总共有多少个节点
//这个会把curPos改变,但是速度更快
int getNumEx()
{
moveEnd();
return m_curPos + 1;
}
//////////////////////////////////////////////////////////////////////////
//这个能保持curPos,但是速度较慢
int getNum()
{
int oldCur = m_curPos;
moveEnd();
int ret = m_curPos + 1;
moveTo(oldCur);
return ret;
}
private:
node *m_curNode; //当前节点
int m_curPos; //当前节点的位置
};
#endif
----------------解决方案--------------------------------------------------------
燕子,昨天我这里停电了。
所以后来就没看到你的回帖了。这么久才回应你的回帖,很是不好意思啊。
修改得那么详细,先谢谢你哈。
可以帮我再解释下你那些改动的地方么。看了好久,就是不知道为什么这么改啊。
(1)creat函数。为什么要定义两个变量:n,s输入呢,我原来的scanf("%ld %ld",&p1->num,&p1->score);为什么行不通啊?
为什么把输入语句至于while()中――“ while(scanf("%ld %ld",&n,&s)!=EOF && n!=0)”?
(2)print() 和main() 中的while()都改成了for(),这又是为什么啊?
最后我原代码不能实现题目要求的主要原因是什么啊?
----------------解决方案--------------------------------------------------------
LS的LS, 这里是C你怎么发C++呢///
----------------解决方案--------------------------------------------------------
大哥我还么学过C++ 呢,HOHO
不过感觉应该是好东西,先收藏了哈,呵呵。
以后学了,再拿出来看看。
----------------解决方案--------------------------------------------------------
谁知道我12# 的问题啊,
懂的帮我看看,解释下哦。
----------------解决方案--------------------------------------------------------
[bo]以下是引用 [un]zyhfbim1a9[/un] 在 2008-4-20 10:25 的发言:[/bo]
(1)creat函数。为什么要定义两个变量:n,s输入呢,我原来的scanf("%ld %ld",&p1->num,&p1->score);为什么行不通啊?
为什么把输入语句至于while()中――“ while(scanf("%ld %ld",&n,&s)!=EOF && n!=0)”?
(2)print() 和main() 中的while()都改成了for(),这又是为什么啊?
最后我原代码不能实现题目要求的主要原因是什么啊?
(1)creat函数。为什么要定义两个变量:n,s输入呢,我原来的scanf("%ld %ld",&p1->num,&p1->score);为什么行不通啊?
为什么把输入语句至于while()中――“ while(scanf("%ld %ld",&n,&s)!=EOF && n!=0)”?
(2)print() 和main() 中的while()都改成了for(),这又是为什么啊?
最后我原代码不能实现题目要求的主要原因是什么啊?
1. 不这样的话,像你那样,出现内存泄露(多余分配且没有加入链表内)
输入写在while里,少重复写一次输入并且方便控制
2. while改for只为了简短些,并且让结构关系显现
3. 你的代码的数据结构不存在一个独立的头指针,所以插入操作不能插入在最开头
所以几乎要重写,加上你原来的代码逻辑混乱
其它:最好你自己加上链表释放的代码。。。
----------------解决方案--------------------------------------------------------
[bo]以下是引用 [un]雨中秣燕[/un] 在 2008-4-20 11:30 的发言:[/bo]
1. 不这样的话,像你那样,出现内存泄露(多余分配且没有加入链表内)
输入写在while里,少重复写一次输入并且方便控制
2. while改for只为了简短些,并且让结构关系显现
3. 你的代码的数据结构不存在一个独立的头指针,所以 ...
1. 不这样的话,像你那样,出现内存泄露(多余分配且没有加入链表内)
输入写在while里,少重复写一次输入并且方便控制
2. while改for只为了简短些,并且让结构关系显现
3. 你的代码的数据结构不存在一个独立的头指针,所以 ...
怎么加入一个独立的头指针啊。
----------------解决方案--------------------------------------------------------
带头指针:
head->数据->数据->数据-NULL
不带头
数据(head)->数据->数据-NULL
你重新看看链表部分
----------------解决方案--------------------------------------------------------