首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

写了一个很简单的链表,给大家批批,点评一下.该怎么处理

2012-03-20 
写了一个很简单的链表,给大家批批,点评一下..//线性链表2007-4-19#includeiostream.hstructnode//链表的

写了一个很简单的链表,给大家批批,点评一下..
//线性链表     2007-4-19
#include   <iostream.h>
struct   node   //链表的存储结构
{
int   data;
node   *next;
};
int   length=0;     //链表的长度
node   *p=new   node;   //第一个头指针

//p-> next=NULL;     为什么这儿会出错??


//返回第i个节点
node   *   get_linklist(int   i)
{
if(i> length)
{
return   NULL;
}
else
{
node   *f=new   node;
f=p;
i=length-i;   //因为新插入的元素在最前面,故要length-i
while(i--)
{
f=f-> next;
}
return   f;
delete   f;
}
}

//插入元素
void   insertLinklist(int   ele)
{

node   *n=new   node;
n-> data=ele;
n-> next=p;
p=n;
length++;

}


//返回ele元素的前驱
node*   prior(int   ele)
{
node   *f=new   node;
f=p;
int   j=0;
while(++j   &&   j <=length)
{
if(f-> data==ele)
{
return   get_linklist(length-j);
}
else
{
f=f-> next;
}
}
return   NULL;
}

//返回ele元素的后继
node*   nextn(int   ele)
{
node   *f=new   node;
f=p;
int   j=0;
while(++j   &&   j <=length)
{
if(f-> data==ele)
{
return   get_linklist(length-j+2);
}
else
{
f=f-> next;
}
}
return   NULL;
}

//搜索该元素是束在链表中
int   search(int   ele)
{
node   *f=new   node;
f=p;
int   i=0;
while(f)
{
i++;
if(f-> data==ele)
{
return   length-i+1;
}
else
{
f=f-> next;
}
}
return   0;   //如果未找到返回0
}

//遍历链表中的所有数据
void   seelink()
{
node   *f=new   node;
for(int   i=1;i <=length;i++)
{
f=get_linklist(i);
cout < <f-> data < < "     ";
}
}

void   main()
{


//简单的使用实例
cout < < "在链表中插入5个元素\n\n ";
int   value;
for(int   m=1;m <=5;m++)
{
cin> > value;
insertLinklist(value);   //执行链表的插入元素操作
}

cout < < "\n遍历链表中的所有元素     ";
seelink();
cout < < "元素总数: " < <length;

node   *test=new   node;       //创建一个节点,用于接收函数的返回值
test=get_linklist(4);     //返回第4个节点的信息
cout < < "\n\n第4个节点的数据是: " < <test-> data;
cout < <endl < <endl;


}

[解决办法]
//返回第i个节点
node * get_linklist(int i)
{
if(i> length)
{
return NULL;
}
else
{
node *f=new node;
f=p;
i=length-i; //因为新插入的元素在最前面,故要length-i
while(i--)
{
f=f-> next;
}
return f;///////////////////////// 1
delete f;////////////////////// 2
}
}

1,2 交换

[解决办法]
p-> next=NULL; 为什么这儿会出错??

放在main中第一个语句,
不要放在全局位置,
否则无法执行 ~


[解决办法]
发个我超的链表

template <class T> //单链表类的结点定义
class LinList;
template <class T>
class ListNode
{friend class LinList <T> ;
private:
ListNode <T> *next;
T data;
public:
ListNode(ListNode <T> *ptrnext=NULL)
{ next=ptrnext;}
ListNode(const T& item,ListNode <T> *ptrnext=NULL)
{data=item;next=ptrnext;}
~ListNode(void){}
};

template <class T> //单链表类的定义
class LinList
{private:
ListNode <T> *head;
int size;


public:

ListNode <T> *Index(int i);

LinList(void);
~LinList(void);
int Size(void) const;
void Insert(const T& item,int i);
T Delete(int i);
T GetData(int i);
};

template <class T> //单链表类的实现
LinList <T> ::LinList()
{ head=new ListNode <T> ();
size=0;
}

template <class T>
LinList <T> ::~LinList(void)
{ ListNode <T> *p, *q;
p=head;
while(p!=NULL)
{ q=p;
p=p-> next;
delete q;
}
size=0;
head=NULL;
}

template <class T>
ListNode <T> *LinList <T> ::Index(int i)
{ if(i <-1|| i> size-1)
{
cout < < "参数 i 越界出错! " < <endl;
exit(0);
}
if(i==-1) return head;
ListNode <T> *p=head-> next;
int j=0;
while(p!=NULL && j <i)
{ p=p-> next;
j++;
}
return p;
}

template <class T>
int LinList <T> ::Size(void) const
{ return size;
}

template <class T>
void LinList <T> ::Insert(const T& item,int i)
{
if(i <0||i> size)
{ cout < < "参数 i 越界出错! " < <endl;
exit(0);
}
ListNode <T> *p=Index(i-1);
ListNode <T> *q=new ListNode <T> (item,p-> next);
p-> next=q;
size++;
}

template <class T>
T LinList <T> ::Delete(int i)
{ if(size==0)
{
cout < < "链表已空! " < <endl;
exit(0);
}
if(i <0||i> size-1)
{ cout < < "参数 i 越界出错! " < <endl;
exit(0);
}
ListNode <T> *s,*p=Index(i-1);
s=p-> next;
p-> next=p-> next-> next;
T x=s-> data;
delete s;
size--;
return x;
}

template <class T>
T LinList <T> ::GetData(int i)
{ if(i <0||i> size-1)
{ cout < < "参数 i 越界出错! " < <endl;
exit(0);
}
ListNode <T> *p=Index(i);
return p-> data;
}

[解决办法]
我想了一下get_linklist(int i)应该这样改
node * get_linklist(int i)
{
if(i> length)
{
return NULL;
}
else
{
node *f;//这里不要用new,就不会在堆上创建了
f=p;
i=length-i; //因为新插入的元素在最前面,故要length-i
while(i--)
{
f=f-> next;
}
return f;
//因为f是临时的,不需要delete 了
}
}

请其他高手指点

热点排行