/ Published in: C++
                    
                                        
Limited by memory.
                
                            
                                Expand |
                                Embed | Plain Text
                            
                        
                        Copy this code and paste it in your HTML
//
//
// Nnn.cpp : Defines the entry point for the console application.
// author : Hai Yi
// review : V. Cortes / Feb,23,2012
// date : Sept,11,2000
//
//
#include <iostream>
#include <stdlib.h>
using namespace std;
//here is a dual link list
class Node{
private:
int data;
Node *next;
Node *prev;
Node *head;
Node *rear;
public:
Node(const int& item)
:data(item),prev(NULL),next(NULL),head(NULL),rear(NULL){}
//get next node
Node* GetNextNode(){return next;}
Node* GetPrevNode(){return prev;}
//insert after
void InsertAfterMe(Node* p);
//Delete the appointed
void DeleteMe();
int GetData(){return data;}
void SetData(int item){data = item;}
//reset
Node* GoBacktoHead();
//go to the rear
Node* GoForwardtoRear();
//clear the whole
void ClearAll();
//get the counts of the link
int GetElementNum();
};
int Node::GetElementNum()
{
int count = 0;
Node* p =GoBacktoHead();
while(p->GetNextNode()!=NULL){
count++;
p = p->GetNextNode();
}
count++;
return count;
}
void Node::InsertAfterMe(Node* p)
{
// Node* p;
if(prev == NULL) { head = this;}
p->next = next;
p->prev = this;
next = p;
if(p->next == NULL) rear = p;
else p->next->prev = p;
}
void Node::DeleteMe()
{
if(prev == NULL) { // if this node is the first one
next->prev = NULL;
head = next; // then the next one becomes the first one
delete this; //delete this node
return;
}
if(next == NULL){ //if this node is the last one
prev->next = NULL;
rear = prev; // then the previous one becomes the last one
delete this;
return;
}
prev->next = next;
next->prev = prev;
delete this;
}
Node* Node::GoBacktoHead()
{
if(head == this){ //this is the first node
return this;
}
Node *p = this;
while(p->prev != NULL){
p = p->prev;
}
return p;
}
Node* Node::GoForwardtoRear()
{
if(rear == this){
return this;
}
Node *p = this;
while(p->next != NULL){
p = p->next;
}
return p;
}
void Node::ClearAll()
{
Node* p = GoBacktoHead();
Node* p2;
while(p->GetNextNode() != NULL){
p2 = p;
p = p->GetNextNode();
delete p2;
}
delete p;
}
int main(int argc, char* argv[])
{
int remain;
int carry;
int result;
int N;
Node* p = new Node(1);
std::cout<<"Input the number: ";
std::cin>>N;
for(int n=1;n<=N;n++)
{
remain = carry = 0;
p = p->GoBacktoHead();
//while not the end of the list,process the element one by one
while(p->GetNextNode() != NULL){
result = p->GetData()*n+carry;
if(result>=10){
remain = result%10;
carry = result/10;
p->SetData(remain);
}
else{
p->SetData(result);
carry = result/10;
}
p = p->GetNextNode();
}
result = p->GetData()*n+carry;
//if carry occurs,process the carry and
//**store into the newly allocated space.**
while(result >= 10){
p->SetData(result%10);//remainder
Node * newNode = new Node(0); //create new node with data 0
result = result/10; //cut last digit
p->InsertAfterMe(newNode); //put new node in the rear
p = p->GetNextNode(); //advance to this new node
}
p->SetData(result); //when result < 10, put result in this new node
}//end of for
p = p->GoForwardtoRear();
while(p->GetPrevNode()!=NULL){
std::cout<<p->GetData();
p=p->GetPrevNode();
}
std::cout<<p->GetData()<<std::endl;
int num = p->GetElementNum();
if(num >=5){
p = p->GoForwardtoRear();
std::cout<<std::endl<<"Or"<<std::endl<<std::endl;
std::cout<<p->GetData()<<".";
p = p->GetPrevNode();
for(int i=1;i<10;i++){
std::cout<<p->GetData();
p = p->GetPrevNode();
}
std::cout<<"e"<<num-1<<std::endl;
}
//clear the memory
p->ClearAll();
return 0;
}
Comments
 Subscribe to comments
                    Subscribe to comments
                
                