#include "stdafx.h"#include<iostream>
using namespace std;
template<class T>class Link;//链表类
template<class T>class LinkNode
{
friend Link<T>;
private:
T data;
LinkNode<T>*link;};
template<class T>class Link
{public:
Link()
{
first = 0;
};
~Link();
bool IsEmpty()const
{
return first = 0;
}
int Length()const;
bool Find(int k, T&x);
Link<T>&Insert(int k, const T&x);
Link<T>&Change(int k, T x);
Link<T>&Delete(int k, T &x);
Link<T>&Search(const T&x)const;
int OutPut();private:
LinkNode<T>*first;};//析构函数(删除链表的所有节点)
template<class T>Link<T>::~Link()
{
LinkNode<T>*next;
while (first)
{
next = first->link;
delete first;
first = next;
}}//确定链表的长度
template<class T>int Link<T>::Length()const
{
LinkNode<T>*current = first;
int len = 0;
while (current)
{
len++;
current = current->link;
}
return len;}//在链表中查找第K个元素
template<class T>bool Link<T>::Find(int k, T &x)
{
LinkNode<T>*current = first;
int index = 0;
while (index < k&¤t)
{
current = current->link;
index++;
}
if (current)
{
int x = current->data; return true;
}
return false;}//向链表中插入元素
template<class T>Link<T>&Link<T>::Insert(int k, const T&x)
{
LinkNode<T>*p = first;
for (int index = 1; index < k&&p; index++)
p = p->link;
LinkNode<T>*y = new LinkNode<T>;
y->data = x;
if (k)
{
y->link = p->link;
p->link = y; }
else
{
y->link = first;
first = y; }
return *this;} //改变链表第k个元素的值
template<class T>
Link<T>&Link<T>::Change(int k, T x)
{
LinkNode<T>*p = first;
for (int index = 0; p&&index < k; index++)
{
p = p->link;
}
if (p)
p->data = x;
return *this; }
//删除链表第k个元素
template<class T>
Link<T>&Link<T>::Delete(int k, T&x)
{
if (k = 0)
{
first = first->link;
}
else
LinkNode<T>*p= first;
LinkNode<T>*q = first;
for (int index = 1; index < k - 1 && q; index++)
{
q = q->link;
p = q->link;
q->link = p->link;
x = p->data;
delete p;
return *this;
} }
//搜索第k个元素
template<class T>
Link<T>&Link<T>::Search(const T&x)const
{
LinkNode<T>*current = first;
int index = 1;
while (current&¤t->data != x)
{
current = current->link;
index++; }
if (current)
return index;
return 0; }
//倒序输出链表
template<class T>
int Link<T>::OutPut()
{
LinkNode<T>*current = first;
int index = 0;
int len = 0;
while (current)
{
len++;
current = current->link;
}
int *arry = new int[len];
current = first;
while (current)
{
arry[index] = current->data;
current = current->link;
index++;}
index = index - 1;
cout << arry[index];
index = index - 1;
for (index; index >= 0; index--)
{
cout.fill('0');
cout.width(3);
cout << arry[index]; }
cout << endl; return 0;}
int main(){
Link<int>A;
int n, i, j, k; int l = 0;
A.Insert(0, 1);
cout << "输入n=:" << endl;
cin >> n;
for (i = 1; i <= n; i++)
{
int m = A.Length();
for (j = 0; j <m;j++)
{
A.Find(j, k);
k = i * k;
A.Change(j, k);
}
for (j = 0; j < m; j++)
{
A.Find(j, k);
if (k >= 1000)
{
if (j < m - 1)
A.Find(j + 1, l);
else
{
A.Insert(j + 1, 0);
l = 0;
}
l += k / 1000;
A.Change(j + 1, l);
k = k % 1000;
A.Change(j, k);
}
}
}
cout << "Length=" << A.Length() << endl;
cout << "阶乘为:";
A.OutPut();
return 0;}
2 回答
- 2 回答
- 1 关注
- 1077 浏览
添加回答
举报
0/150
提交
取消