写了一个很简单的链表,给大家批批,点评一下..
//线性链表 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 了
}
}
请其他高手指点