您的位置:首页 > 其它

p45-001

2013-11-11 00:56 337 查看
数据结构与算法 p45-001

试设计一个非递归算法在O(n)时间内将一个含有n个元素的单链表逆置,要求其辅助空间为常量。

#include<iostream.h>
typedef  int T;

template<class T>
struct Node
{
T data;
Node *next;
};

template <class T>
class LinkList
{
private:
Node<T> *Head;
public:
LinkList() ;
~LinkList();
void CreateList(int n);
T GetElem(int i);
int Length();
void Modify(int i,int value);
void ListDisplay();
};

template<class T>
LinkList<T>::LinkList()
{
Head=new Node<T>;
Head->next=NULL;
}

template<class T>
LinkList<T>::~LinkList()
{
Node<T> *p;
while(Head)
{
p=Head;
Head=Head->next;
delete p;
}
Head=NULL;
}

template<class T>
void LinkList<T>::CreateList(int n)
{
Node<T> *p,*s;
p=Head;
cout<<"请依次输入元素:"<<endl;
for(int i=1;i<=n;i++)
{
s=new Node<T>;
cin>>s->data;
s->next=p->next;
p->next=s;
p=s;
}
}

template<class T>
void LinkList<T>::Modify(int i,int value)
{
Node<T> *p;
p=Head->next;
int j=1;
while(p&& j<i)
{
p=p->next;
j++;
}
p->data=value;
}

template<class T>
T LinkList<T>::GetElem(int i)
{
Node<T> *p;
p=Head->next;
int j=1;
while(p&&j<i)
{
p=p->next;j++;
}
return p->data;
}

template <class T>
int LinkList<T>::Length()
{
int len=0;
Node<T> *p;
p=Head;
while(p->next)
{
len++;p=p->next;
}
return len;
}

template <class T>
void LinkList<T>::ListDisplay()
{
Node<T> *p;
p=Head->next;
int i=1;
while(p)
{
cout<<p->data<<"  ";
p=p->next;
i++;
}
cout<<endl;
}

int main()
{
int i,j,la_len;
T a,b;
LinkList<int> La;
cout<<"请输入要创建A集合中元素个数:";
cin>>la_len;
La.CreateList(la_len);
cout<<endl<<"La:"<<"\t";
La.ListDisplay();
int a_length=La.Length();
for(i=a_length,j=1;i>j;i--,j++)
{
b=La.GetElem(j);
a=La.GetElem(i);
La.Modify(i,b);
La.Modify(j,a);
}

cout<<endl<<"单链表逆置后,A集合的元素如下:";
cout<<endl<<"La:"<<"\t";
La.ListDisplay();
cout<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: