C losing pointer - c++

when I insert a new struct A with the '1' command (so I already have one or more struct A linked to one or more struct S), i lose the link of the previous struct A to their struct S.
For exaple:
command 1 and then command 3 : 2014 and command 4
Output:
year:2014
matricola:1
now command 1 and then command 3 : 2015 and command 4
Output:
year:2015
matricola:2
year:2014
no S struct
I hope that the example will be helpful
Here is the code:
#include <stdio.h>
#include <stdlib.h>
struct S
{
int matr;
struct S* next;
};
struct A
{
int year;
struct A *nextA;
struct S *nextS;
};
int years = 2013;
int matricola=0;
void insA(struct A**T);
void printA(struct A*T);
void insS(struct A **T);
void printS(struct A *T);
int main()
{
struct A *T=NULL;
int cmd,sc=0;
while(1)
{
printf("\n command:");
sc=scanf("%d",&cmd);
while(sc==0)
{
printf("\nerror:");
fflush(stdin);
sc=scanf("%d",&cmd);
}
if(cmd==1)
{
insA(&T);
}
if(cmd==2)
{
printA(T);
}
if(cmd==3)
{
insS(&T);
}
if(cmd==4)
{
printS(T);
}
}
return 0;
}
void insA(struct A**T)
{
struct A *new_p=(struct A*)malloc(sizeof(struct A));
if(new_p==NULL)
{
printf("Errore");
exit(0);
}
years++;
new_p->nextA=NULL;
new_p->nextS=NULL;
if((*T)==NULL)
{
(*T)=new_p;
}
else
{
new_p->nextA=(*T);
(*T)=new_p;
}
new_p->year=years;
}
void printA(struct A *T)
{
struct A *tmp=T;
while(tmp!=NULL)
{
printf("\n%d",tmp->year);
tmp=tmp->nextA;
}
return;
}
void insS(struct A **T)
{
int search,sc=0;
struct S* new_p=(struct S*)malloc(sizeof(struct S));
if(new_p==NULL)
{
printf("error");
exit(0);
}
new_p->next=NULL;
printf("\nyear in which to insert:");
sc=scanf("%4d",&search);
while(sc==0 || search > years || search <= 2013)
{
printf("\nerror:");
fflush(stdin);
sc=scanf("%4d",&search);
}
struct A*tmp=*T;
while(tmp!=NULL)
{
if(tmp->year==search)
{
matricola++;
if(tmp->nextS==NULL)
{
tmp->nextS=new_p;
}
else
{
new_p->next=tmp->nextS;
tmp->nextS=new_p;
}
}
tmp=tmp->nextA;
}
new_p->matr=matricola;
return;
}
void printS(struct A *T)
{
struct A *tmp=T;
struct S *s=tmp->nextS;
while(tmp!=NULL)
{
printf("\nyear:%d",tmp->year);
if(s==NULL)
{
printf("\nno S struct");
return;
}
else
{
while(s!=NULL)
{
printf("\nmatricola:%d",s->matr);
s=s->next;
}
}
tmp=tmp->nextA;
}
}
And this is my first post so I apologize for any errors .

After struggling to understand what you want to do I figured out your problem, you have to change your printS function.
void printS(struct A *T) {
struct A *tmp=T;
truct S *s = tmp->nextS;
while(tmp != NULL) {
printf("\nyear:%d", tmp->year);
if(s == NULL) {
printf("\nno S struct");
return ;
} else {
while(s != NULL) {
printf("\nmatricola:%d",s->matr);
s = s->next;
}
}
tmp = tmp->nextA;
}
}
Like this.
void printS(struct A *T) {
struct A *tmp=T;
while(tmp != NULL) {
struct S *s = tmp->nextS;
printf("\nyear:%d", tmp->year);
if(s == NULL) {
printf("\nno S struct");
return ;
} else {
while(s != NULL) {
printf("\nmatricola:%d",s->matr);
s = s->next;
}
}
tmp = tmp->nextA;
}
}
Because the struct S *s = tmp->nextS; have to be updated to the actual struct A in which you are, so it have to be inside the while loop, if you leave struct S *s = tmp->nextS; outside the while loop you will try to print the list of structs S that starts from your first struct A, and not the entire list of structs S starts from each struct A.
Note: As I said, try to avoid fflush(stdin); because if the argument don't point to an output stream the behavior is undefined.

Related

Stack Data Structure Parenthesis Matching

I was trying this parenthesis matching stack code and every time I run this it only gives me that parenthesis are not matching I don't know what is going wrong. Can you guys please help me out in this and tell me how can I improve this further and is this the right way to use stack in c++ because I was studying from a source that is using c language.
#include<iostream>
using namespace std;
struct stack
{
int size;
int top;
char *arr;
};
int isEmpty(struct stack *ptr)
{
if(ptr->top==-1)
{
return 1;
}
return 0;
}
int isFull(struct stack *ptr)
{
if (ptr->top == ptr->size-1)
{
return 1;
}
return 0;
}
void push(struct stack *ptr,char val)
{
if(isFull(ptr))
{
cout<<"stack overflow"<<endl;
}
else
{
ptr->top++;
ptr->arr[ptr->top] = val;
}
}
char pop(struct stack *ptr)
{
if (isEmpty(ptr))
{
cout<<"stack underflow"<<endl;
return -1;
}
else
{
char val = ptr->arr[ptr->top];
ptr->top-1;
return val;
}
}
int parenthesisMatch (char * exp)
{
struct stack * sp = new struct stack;
sp->size = 80;
sp->top = -1;
sp->arr = new char(sp->size);
for(int i=0; exp[i]!='\0'; i++)
{
if (exp[i] == '(')
{
push(sp,'(');
}
else if(exp[i] == ')')
{
if (isEmpty(sp))
{
return 0;
}
pop(sp);
}
}
if (isEmpty(sp))
{
return 1;
}
return 0;
}
int main()
{
char *exp = "((8)(*--$$9))";
if(parenthesisMatch(exp))
{
cout<<"The parenthesis is matching\n";
}
else
{
cout<<"The parenthesis is not matching\n";
}
return 0;
}
Just tried to debug the code and found 2 potential errors:
As correctly pointed out by #Welbog in the comments, to create an array, use sp->arr = new char[sp->size; in the function parenthesisMatch().
In the function pop(), the value of the top is not decremented correctly.
Have a look at the working code:
#include<iostream>
struct stack
{
int size;
int top;
char *arr;
};
int isEmpty(struct stack *ptr)
{
if(ptr->top==-1)
{
return 1;
}
return 0;
}
int isFull(struct stack *ptr)
{
if (ptr->top == ptr->size-1)
{
return 1;
}
return 0;
}
void push(struct stack *ptr,char val)
{
if(isFull(ptr))
{
std::cout<<"stack overflow"<<std::endl;
}
else
{
ptr->top++;
ptr->arr[ptr->top] = val;
}
}
char pop(struct stack *ptr)
{
if (isEmpty(ptr))
{
std::cout<<"stack underflow"<<std::endl;
return -1;
}
else
{
char val = ptr->arr[ptr->top];
ptr->top-=1;
return val;
}
}
int parenthesisMatch (char * exp)
{
struct stack * sp = new struct stack;
sp->size = 80;
sp->top = -1;
sp->arr = new char[sp->size];
for(int i=0; exp[i]!='\0'; i++)
{
if (exp[i] == '(')
{
push(sp,'(');
}
else if(exp[i] == ')')
{
if (isEmpty(sp))
{
return 0;
}
pop(sp);
}
}
if (isEmpty(sp))
{
return 1;
}
return 0;
}
int main()
{
char *exp = "((8)(*--$$9))";
if(parenthesisMatch(exp))
{
std::cout<<"The parenthesis is matching\n";
}
else
{
std::cout<<"The parenthesis is not matching\n";
}
return 0;
}

Maximum Sort of a Simple One-way List

I'm trying to do the Maximum Sort of a Simple One-way List. However my program has some bugs in it, which I can't figure out what it is.
It behaves strange because sometimes it works well to a point where it just stop working but i see return 0 (for example: I give the list of 1234 and I get back 3412), sometimes it working to a point, then goes to an infinte loop. (for example: case of 12345 it put 5, 4 and 3 the the 1st place and then infinite loop).
The problem is probably in the list::remMax() or in the maxRend().
My code:
struct chain
{
char key;
chain *next;
};
/////////////////////////////////////////////
class list
{
private:
chain *L, **act;
public:
list() {
L=NULL;
act=&L;
}
~list() {
chain *p;
while(L) {
p=L;
L=L->next;
delete []p;
}
}
enum ERROR {endErr, memErr};
void first() {act=&L;};
void next() {
if(*act!=NULL) {
act=&(*act)->next;
} else throw endErr;
}
bool end() {return *act==NULL;}
bool oneEIn() {return L->next==NULL;} //list contains only 1 element
bool twoEIn() {return L->next->next==NULL;} //list contains 2 elements
void addE(char x) {
chain *p=new(nothrow) chain;
if(p == NULL) throw memErr;
p->key=x;
p->next=*act;
*act=p;
}
chain* remMax(chain *H) {
if(!oneEIn()) {
chain *qe, *q, *Mpe, *Mp;
if(twoEIn()) {
Mp = H;
q = Mp->next;
if(q->key > Mp->key) {
Mp->next=q->next;
return q;
} else {
H=q;
Mp->next=NULL;
return Mp;
}
} else {
Mp=H;
q=Mp->next;
Mpe = H;
qe = Mp;
while(q != NULL) {
if(Mpe->key > Mp->key) Mp = Mpe;
if(q->key > Mp->key) {
Mp=q;
Mpe=qe;
}
qe=q;
q=q->next;
}
if(Mpe == Mp) H=Mp->next;
else {
Mpe->next = Mp->next;
}
Mp->next=NULL;
return Mp;
}
} else {
chain *Mp;
Mp = H;
H = NULL;
return Mp;
}
}
void inE(chain *Mp) {
first();
Mp->next = *act;
addE(Mp->key);
}
chain* getFirst() {return L;}
void printList() {
chain *p=L;
while(p != NULL) {
putchar(p->key);
p=p->next;
}
}
};
///////////////////////////////////
void makeList(list& L) {
char c;
while((c=getchar())!='\n') {
L.addE(c);
L.next();
}
}
void maxRend(list& L) {
if(!L.oneEIn()) {
chain *H, *Mp;
H=L.getFirst();
while(H != NULL) {
cout<<"1.while\n";
Mp = L.remMax(H);
L.inE(Mp);
cout<<"putIn: "<<Mp->key<<endl;
H=H->next;
L.printList();
cout<<endl;
}
cout<<"\nSorted list: ";
L.printList();
} else L.printList();
}
//////////////////////////////////////////////
int main()
{
list L;
makeList(L);
maxRend(L);
return 0;
}

'.' cannot appear in a constant-expression

template <class T>
struct stkNode
{
BinTreeNode<T> *ptr;
enum tag {R,L}tag;
stkNode(BinTreeNode<T> *N = NULL) : ptr(N),tag(L){}
};
template<class T>
void BinaryTree<T>::PostOrder(void(*visit)(BinTreeNode<T> *p))
{
SeqStack<stkNode<T> > S;
stkNode<T> w;
BinTreeNode<T> *p = root;
do
{
while (p != NULL)
{
w.ptr = p;
w.tag = w.L;
S.Push(w);
p = p->leftChild;
}
bool continuel = true;
while (!S.IsEmpty() && continuel)
{
S.Pop(w);
p = w.ptr;
switch (w.tag)
{
case w.L: //---------------this line--------------------------
w.tag = w.R;
S.Push(w);
continuel = false;
p = p->rightChild;
break;
case w.R: // -----------and this line-------------
visit(p);
break;
}
}
} while (!S.IsEmpty());
}
When i compile it on Devc++, it will be an error looks like:
[Error] '.' cannot appear in a constant-expression.
But when i compile it on Visual Studio 2015,the error will not happen.
Why??????
-----------update my problem--------------------
such as
#include <iostream>
using namespace std;
struct exp
{
char ch;
enum dir{
L,R
}direction;
exp(char name,dir d){
ch = name;
direction = d;
}
};
int main()
{
exp t('a',exp.L); //this line
return 0;
}
it was the same
The problem is that i access method of enum wrongly....
The right Code is:
template<class T>
void BinaryTree<T>::PostOrder(void(*visit)(BinTreeNode<T> *p))
{
SeqStack<stkNode<T> > S;
stkNode<T> w;
BinTreeNode<T> *p = root;
do
{
while (p != NULL)
{
w.ptr = p;
w.tag = w.L;
S.Push(w);
p = p->leftChild;
}
bool continuel = true;
while (!S.IsEmpty() && continuel)
{
S.Pop(w);
p = w.ptr;
switch (w.Tag)
{
case stkNode<T>::L:
w.tag = w.R;
S.Push(w);
continuel = false;
p = p->rightChild;
break;
case stkNode<T>::R:
visit(p);
break;
}
}
} while (!S.IsEmpty());
}

`iqueue->front` is displaying proper value and is not null.But tempiq is showing NULL and gives segmentation fault.Why?

The while loop in the code gives segmentation fault(because tempiq is NULL).I can't figure out why tempiq is NULL when iqueue->front is displaying proper values and is not null(for sure).
//......previous code
tempiq=iqueue->front;
cout<<"\n"<<iqueue->front->link<<""<<iqueue->front;
if(tempiq)// && iqueue->front)
cout<<"\n aaaaaaaaaaaaaaaaaaaa\t";
while(tempiq)
{
//....rest of code
The full code for reference is given below:(the above code segment is in the main function at the last)
#include <vector>
#include <iostream>
#include <string.h>
#include <fstream>
#include <stdio.h>
#include <termios.h>
#include <sstream>
#include <unistd.h>
#include <cstdlib>
#include <ctype.h>
using namespace std;
#define NO_OF_CHARS 256
/* This function builds the TF table which represents Finite Automata for a
given pattern */
void computeTransFun(char *pat, int M, int TF[][NO_OF_CHARS])
{
int i, lps = 0, x;
// Fill entries in first row
for (x =0; x < NO_OF_CHARS; x++)
TF[0][x] = 0;
TF[0][pat[0]] = 1;
// Fill entries in other rows
for (i = 1; i<= M; i++)
{
// Copy values from row at index lps
for (x = 0; x < NO_OF_CHARS; x++)
TF[i][x] = TF[lps][x];
// Update the entry corresponding to this character
TF[i][pat[i]] = i + 1;
// Update lps for next row to be filled
if (i < M)
lps = TF[lps][pat[i]];
}
}
/* Prints all occurrences of pat in txt */
int searchauto(char *pat, char *txt)
{
int M = strlen(pat);
int N = strlen(txt);
int TF[M+1][NO_OF_CHARS];
computeTransFun(pat, M, TF);
int flag=0;
// process text over FA.
int i, j=0;
for (i = 0; i < N; i++)
{
j = TF[j][txt[i]];
if (j == M)
{
return flag;
//printf ("\n pattern found at index %d", i-M+1);
}
}
return flag;
}
class Node
{
char content;
bool marker;
vector <Node*>children;
public:
Node(){ content='\0'; marker=false; }
~Node(){}
void setContent(char c){content=c; }
void setMarker(){this->marker=true; }
char getContent(){return content; }
bool getMarker(){return marker; }
Node *findChild(char c);
void appendChild(Node *child)
{ children.push_back(child); }
vector<Node *> getChildren()
{ return children; }
};
class Trie
{
public:
Node *root;
int abc;
void addWord(string s);
void deleteWord(string s);
bool searchWord(string s);
Trie(){ root=new Node(); }
~Trie(){}
};
Node *Node::findChild(char c)
{
for(int i=0; i< children.size(); i++)
{
Node *temp=children.at(i);
if(temp->content==c)
return temp;
}
return NULL;
}
void Trie:: addWord(string s)
{
//cout<<"\naddword called for "<<s<<"::::::::::::::::::::::::\n";
Node *current=root;
if(s.length()==0)
{ cout<<"\txxxx\t"; current->setMarker(); return ; }
for(int i=0;i<s.length();i++)
{
Node *child=current->findChild(s[i]);
if(child!=NULL)
current=child;
else
{
Node *tmp=new Node();
tmp->setContent(s[i]);
current->appendChild(tmp);
current=tmp;
}
if(i==s.length()-1)
current->setMarker();
cout<<"\ttrying\t";
}
cout<<"\n word added\t";
}
bool Trie::searchWord(string s)
{
cout<<"\nsearchWord called for "<<s<<endl;
Node *current=root;
cout<<"\n search started\t";
cout<<endl;
while(current !=NULL)
{
cout<<"\t00\t";
for(int i=0;i<s.length();i++)
{
cout<<s[i]<<" ";
Node *temp=current->findChild(s[i]);
if(temp==NULL)
return false;
current=temp;
}
cout<<endl;
int a;
// cin>>a;
if(current->getMarker())
{
cout<<"String found......................................................................................................\n";
return true;
}
else
{
cout<<"Sorry string not found in trie....................................................................................\n";
return false;
}
}
}
struct node
{
struct node *next;
int rank;
int nopage;
Trie *trie;
string value;
};
struct indexqueue
{
struct indexnode *front;
struct indexnode *rear;
};
struct indexqueue *createindexqueue()
{
struct indexqueue *temp=new indexqueue;
temp->front=NULL;
temp->rear=NULL;
//temp->count=0;
return temp;
}
struct indexnode
{
int id;
int rank;
int *point2[];
string link;
Trie *down;
struct indexnode *next;
};
struct indexnode *createindexnode(string val)
{
struct indexnode *temp=new indexnode;
temp->next=NULL;
//temp->value=val;
//cout<<"Node created with val: "<<val<<endl;
return temp;
}
struct indexqueue *iqueue;
struct queue
{
struct node *front;
struct node *rear;
int count;
};
struct node *createnode(string val)
{
struct node *temp=new node;
temp->next=NULL;
temp->value=val;
//cout<<"Node created with val: "<<val<<endl;
return temp;
}
struct queue *createqueue()
{
struct queue *temp=new queue;
temp->front=NULL;
temp->rear=NULL;
temp->count=0;
return temp;
}
struct queue *pop(struct queue *queue1)
{
struct node *temp=new node;
if(queue1->front==NULL)
return NULL;
else if(queue1->front==queue1->rear)
{
queue1->front=NULL;
queue1->rear=NULL;
}
else
{
queue1->front=queue1->front->next;
}
return queue1;
}
struct queue *push(string val, struct queue *queue1)
{
struct node *new1=createnode(val);
if(queue1->front==NULL && queue1->rear==NULL)
{
queue1->front=queue1->rear=new node;
queue1->rear=new1;
queue1->front=new1;
//cout<<"1\n";
}
else
{
queue1->rear->next=new node;
queue1->rear->next=new1;
queue1->rear=queue1->rear->next;
//cout<<"2\n";
}
queue1->count++;
return queue1;
}
void inserttrie(struct queue *queue1,string value,string collection[],int n)
{
struct node *temp=queue1->front;
while(temp!=NULL)
{
if(temp->value.compare(value)==0)
{
temp->nopage=n;
for(int i=0;i<n;i++)
temp->trie->addWord(collection[i]);
}
}
}
void display(struct queue *queue1)
{
if(!queue1->front)
{
cout<<"Queue empty\n";
return;
}
struct node *temp=queue1->front;
while(temp)
{
cout<<temp->value<<"\n";
temp=temp->next;
}
}
void pushindex(struct indexnode *temp)
{
if(iqueue->front==NULL && iqueue->rear==NULL)
{
iqueue->front=temp;
iqueue->rear=temp;
}
else
{
iqueue->rear->next=temp;
iqueue->rear=temp;
}
}
int search(struct queue* queue1,string val) //returns 1 if val found in queue1 else 0
{
if(queue1->front==NULL)
return 0;
struct node *temp=new node;
temp=queue1->front;
while(temp)
{
if(val.compare(temp->value)==0)
return 1;
temp=temp->next;
}
return 0;
}
int globalcounter=23456;
struct queue *bot(struct queue *crawl,ifstream& infile,string text)
{
struct indexnode *newnode=new indexnode;
//cout<<"\n"<<text<<"\toooooooooooo\n";
newnode->link=text;
newnode->down=new Trie;
newnode->down->abc=globalcounter++;
//cout<<"\n"<<newnode->link<<"\toooooooooooo\n";
newnode->next=NULL;
//indexnode->nop=0;
//Trie *word=new Trie;
if(infile==NULL)
return NULL;
cout<<"BOT_START\n";
string line;
string tri[10000];
//char *v;
string v;
string mxy;
int n=0;
while(getline(infile,line))
{
string link="";
cout<<"\n "<<line<<"\t\n";
int i=0,flag=0,flag1=0,x=0,m=0;
tri[x]="";
for(i=0;i<line.length()-1;i++)
{
if(line[i]==' '||line[i]=='*' && line[i+1]=='*'||line[i]=='*'||line[i]==';'||line[i]=='.'||line[i]=='/')
{
x++;
//tri[x-1][m]='\0';
//v+='\0';
//cout<<"\n***********************************************************"<<v<<endl;
cout<<"\n";
tri[x-1]=v;
newnode->down->addWord(v);
if(newnode->down->searchWord(v))
{
int a;
cout<<"HHHHHHHHHHHHHUUUUUUUUUUUUUUUUUUUUUURRRRRRRRRRRRRRRRRRRRRAAAAAAAAAAAAAYYYYYYYYYYYYYY\n";
cout<<newnode->down->abc<<endl;
//cin>>a;
}
mxy=v;
v="";
m=0;
//tri[x]="";
}
else
{
v+=line[i];
//tri[x][m]=line[i];
cout<<" "<<tri[x][m++]<<" "<<line[i]<<" "<<v;
}
//cout<<"\t.....miiii...miiii....."<<tri[x]<<" ";
if(line[i]=='*' && line[i+1]=='*' && flag==0)
{
flag=1;
i+=2;
}
if(line[i]=='*' && line[i+1]=='*' && flag==1)
{
flag=0;
flag1=1;
i+=2;
}
if(flag==1 && flag1==0)
{
link+=line[i];
}
if(flag1==1)
{
link+='\0';
n++;
cout<<"\nLink:"<<link<<endl;
if(search(crawl,link)==0)
{
cout<<"Link not found in queue\n";
crawl=push(link,crawl);
}
else
cout<<"Link found in queue\n";
link="";
flag1=0;
}
//
//
//
//
}
}
int xt;
//newnode->down=word;
if(!newnode->down)
{
int a;
cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n";
//cin>>a;
}
//cout<<"````````````````````````` "<<newnode->down->abc;
//int a;
//cout<<newnode->down;
//cin>>a;
/*if(newnode->down->searchWord(" ")||newnode->down->searchWord("This")||newnode->down->searchWord(mxy))
{
int a;
cout<<"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD\n";
cin>>a;
cin>>a;
}*/
//cout<<newnode->down->root->getMarker();
//cin>>a;
//cin>>xt;
//displayIndexQueue();
pushindex(newnode);
infile.close();
cout<<"BOT_END\n";
return crawl;
}
struct queue *merge(struct queue *queue1,struct queue *queue2)
{
if(queue1->front==NULL)
return queue2;
else if(queue2->front==NULL)
return queue1;
else
{
struct node *temp=queue2->front;
while(temp)
{
if(search(queue1,temp->value)==0)
queue1=push(temp->value,queue1);
temp=temp->next;
}
/*queue1->rear->next=queue2->front;
queue1->rear=queue1->rear->next;*/
return queue1;
}
}
/*struct queue *checkduplicate(struct queue *queue1,struct queue *queue2)
{
if(queue1->front==NULL || queue2->front==NULL)
return NULL;
struct queue *tempqueue=createqueue();
struct node *temp=queue1->front;
while(temp)
{
if(search(queue2,temp->value)==0)
{
tempqueue=push(temp->value,tempqueue);
}
temp=temp->next;
}
return tempqueue;
}*/
struct queue *spider(struct queue *crawl,ifstream& infile,string text)
{
struct queue *queue1=createqueue();
if(infile==NULL)
return NULL;
queue1=bot(queue1,infile,text);
if(queue1->front==NULL) //check whether there are no links in the queue1
return crawl;
cout<<"SPIDER:Linked list returned by bot:\n";
display(queue1);
cout<<"\n";
cout<<"SPIDER:Displaying crawl before merge:\n\n";
display(crawl);
crawl=merge(crawl,queue1);
//queue1=checkduplicate(queue1,crawl);
cout<<"SPIDER:Displaying crawl after merge:\n\n";
display(crawl);
cout<<"\n";
struct node *temp=queue1->front;
while(temp)
{
ifstream infile1;
char *link=new char[((temp->value).length())+1];
strcpy(link,(temp->value).c_str());
infile1.open(link);
cout<<"Spider is inside : "<<link<<endl;
crawl=spider(crawl,infile1,string(link));
temp=temp->next;
}
return crawl;
}
void displayIndexQueue()
{
if(iqueue->front==NULL)
{
cout<<"iqueue is empty----------------------------------------------\n";
return;
}
struct indexnode *temp=iqueue->front;
while(temp)
{
cout<<temp->link<<endl;
//cout<<"6666666666666666666666666666666666666666666666666666666666666666666666\n";
//if(temp->link=="/home/abhishek/Desktop/eco/testproject2_1_1.txt")
//{
if(temp->down->searchWord("this"))
{
cout<<"this FOUND\n000000000000000000000000000=====================================================================000000000";
}
if(temp->down->searchWord("This"))
{
cout<<"This FOUND\n000000000000000000000000000=====================================================================000000000";
}
if(temp->down->searchWord("movie"))
{
cout<<"MOVIE FOUND\n000000000000000000000000000=====================================================================000000000";
}
cout<<"INSIDE IF OF displayIndexQueue\n";
//cout<<endl<<temp->link<<" &&&&&&&&&&& ";
temp=temp->next;
}
}
struct user
{
string first_name;
string last_name;
int age;
string email;
string password;
};
struct user users[100];
int globalcount;
int validatename(string name)
{
int len=name.length(),flag=0,i=0;
while(flag==0 && i<len)
{
if(!((name[i]>='a' && name[i]<='z') || (name[i]>='A' && name[i]<='Z')))
{
flag=1;
break;
}
i++;
}
if(flag==0)
{
return 1;
}
else
{
return 0;
}
}
int validateemail(string email)
{
if(!((email[0]>='a' && email[0]<='z') || (email[0]>='A' && email[0]<='Z')))
return 0;
int len=email.length();
int a=0,b=0,c=0;
for(int i=0;i<len;i++)
{
if(email[i]=='#')
a=i;
else if(email[i]=='.')
b=i;
}
if(b<a+2)
return 0;
if(b==len-1 ||b==len-2)
return 0;
return 1;
}
int getch() {
struct termios oldt, newt;
int ch;
tcgetattr(STDIN_FILENO, &oldt);
newt = oldt;
newt.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
ch = getchar();
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
fflush(stdin);
return ch;
}
string inputpassword()
{
char password[100];
for(int i=0;i<100;i++)
{
char ch;
ch=getch();
if(ch=='\n')
break;
password[i]=ch;
cout<<"*";
}
return (string)password;
}
int validatepassword(string password)
{
int a=0,b=0,c=0,d=0;
int len=password.length();
if(len<6)
return 0;
for(int i=0;i<len;i++)
{
if(password[i]>='A' && password[i]<='Z')
a++;
else if(password[i]>='a' && password[i]<='z')
b++;
else if(password[i]>='0' && password[i]<='9')
c++;
else
d++;
}
if(a==0 || b==0 || c==0 || d==0)
return 0;
return 1;
}
string encrypt(string input)
{
int len=input.length();
for(int i=0;i<len;i++)
{
if(i%2==0)
input[i]=input[i]+5;
else
input[i]=input[i]-5;
}
return input;
}
string decrypt(string line)
{
int templ=line.length();
int count_spaces=0,odd=0;
for(int i=0;i<templ;i++)
{
if(line[i]==' ')
{
odd=-1;
count_spaces++;
}
if(count_spaces==2)
{
if(line[i]!=' ')
{
line[i]=line[i];
}
}
else
{
if(line[i]!=' ')
{
if(odd%2==0)
line[i]=line[i]-5;
else
line[i]=line[i]+5;
}
}
odd++;
}
return line;
}
int checkexisting(string email)
{
cout<<"checkexisting called\n";
for(int i=0;i<=globalcount;i++)
{
if(users[i].email.compare(email)==0)
{
cout<<"checkexisting returning 1\n";
return 1;
}
}
cout<<"checkexisting returning 0\n";
return 0;
}
struct user *sign_up()
{
string first_name1,last_name1,email1,password1,password2;
int age1;
char test;
cout<<"\nHere are a few syntax rules for signing up on Black Box:\n";
cout<<"1.Age must not be less than 12 years.\n";
cout<<"2.First name and Last name fields will accept only alphabets.\n";
cout<<"3.email address must be of the form 'user#example.com'.\n";
cout<<"4.Password must be at least 6 characters in length and must include at least one upper case";
cout<<" alphabet,one lower case alphabet,one numeral and one special character.\n\n\n";
cout<<"First Name: ";
getline(cin,first_name1);
while(validatename(first_name1)==0)
{
cout<<"Invalid first name entered.\n";
cout<<"\nFirst name can have only alphabets(no spaces,no special characters and no numerals.\n";
cout<<"Enter your first name again: ";
getline(cin,first_name1);
}
cout<<"\nLast Name: ";
getline(cin,last_name1);
while(validatename(last_name1)==0)
{
cout<<"Invalid last name entered.\n";
cout<<"\nLast name can have only alphabets(no spaces,no special characters and no numerals.\n";
cout<<"Enter your last name again: ";
getline(cin,last_name1);
}
cout<<"\nAge: ";
cin>>age1;
if(age1<12)
{
cout<<"Sorry, but according to our TERMS OF USE, no user of age less than 12 can be allowed ";
cout<<"to create an account on Black Box.\n";
return NULL;
}
fflush(stdin);
cin.ignore();
cout<<"\nEmail address : ";
getline(cin,email1);
while(validateemail(email1)==0 || checkexisting(email1)==1)
{
if(validateemail(email1)==0)
{
cout<<"\nInvalid email entered.\n";
cout<<"Email address can only be of the form abc#xyz.pqr.\n";
cout<<"Enter the email address again: ";
}
if(checkexisting(email1)==1)
{
cout<<"\nEmail id already registered.\nChoose a new one.\n";
}
cout<<"\nEnter Email address again: ";
getline(cin,email1);
}
cout<<"\nChoose a password: ";
password1=inputpassword();
cout<<"\nRetype Password: ";
password2=inputpassword();
while(validatepassword(password1)==0 || password1.compare(password2)!=0)
{
if(validatepassword(password1)==0)
{
cout<<"Invalid password enterd.\n";
cout<<"Password must be at least 6 characters in length and must include at least";
cout<<" one upper case alphabet,one lower case alphabet,one numeral and one special character.\n";
}
if(password1.compare(password2)!=0)
{
cout<<"\nPasswords do not match.\n";
}
cout<<"Enter the password again: ";
password1=inputpassword();
cout<<"\nRetype Password: ";
password2=inputpassword();
}
struct user *newuser=new user;
newuser->first_name=first_name1;
newuser->last_name=last_name1;
newuser->age=age1;
newuser->email=email1;
newuser->password=password1;
ofstream outfile("userfile.txt",ios::app);
if(outfile)
{
outfile<<encrypt(newuser->first_name)<<" "<<encrypt(newuser->last_name)<<" "<<newuser->age<<" "<<encrypt(newuser->email)<<" "<<encrypt(newuser->password)<<endl;
}
outfile.close();
return newuser;
}
struct user extract(string line)
{
int len=line.length();
int spaces=0;
string first="",last="",age="",email="",password="";
for(int i=0;i<len;i++)
{
if(line[i]==' ')
spaces++;
else
{
if(spaces==0)
first+=line[i];
else if(spaces==1)
last+=line[i];
else if(spaces==2)
age+=line[i];
else if(spaces==3)
email+=line[i];
else
password+=line[i];
}
}
struct user newuser;
newuser.first_name=first;
newuser.last_name=last;
stringstream convert(age);
newuser.age=0;
convert>>newuser.age;
newuser.email=email;
newuser.password=password;
return newuser;
}
int loadusers()
{
string line;
ifstream infile;
infile.open("userfile.txt");
if(!infile)
return 0;
while(getline(infile,line))
{
globalcount++;
line=decrypt(line);
users[globalcount]=extract(line);
}
}
int login()
{
string email,password;
char choice='y';
while(choice=='y'||choice=='Y')
{
cout<<"\nEnter email address: ";
cin>>email;
cout<<"\nEnter password: ";
cin>>password;
int flag1=0,cur=-1;
for(int i=0;i<=globalcount;i++)
{
if(email.compare(users[i].email)==0 && password.compare(users[i].password)==0)
{
cur=i;
flag1=1;
break;
}
}
if(flag1==1)
{
cout<<"Welcome "<<users[cur].first_name<<endl;
break;
}
else
{
cout<<"Wanna try again?(y/n): ";
cin>>choice;
}
}
if(choice=='y'|| choice=='Y')
return 1;
else
return 0;
}
int account_info()
{
int choice=0,m=1;
cout<<"1.Sign up\n2.Log in\n3.Continue without an account\n4.Exit from Black Box.\nEnter your choice: ";
cin>>choice;
fflush(stdin);
cin.ignore();
struct user *new_user=NULL;
switch(choice)
{
case 1:
new_user=new user;
new_user=sign_up();
if(new_user==NULL)
{
cout<<"Sign up failed.";
choice=3;
}
else
{
cout<<"Successful Sign up.\n";
ofstream outfile;
string newusernamefile="/home/aakash/project/users/"+encrypt(new_user->email)+".txt";
//char *newusernamefile1=newusernamefile.c_str();
outfile.open(newusernamefile.c_str());
outfile<<new_user->first_name;
outfile.close();
break;
}
case 2:
if(login()==1)
{
cout<<"Successful login.\n";
break;
}
else
{
cout<<"Login failed.\n";
choice=3;
}
case 3:
cout<<"Welcome to Black Box3.\n";
break;
case 4:
exit(0);
break;
default:
cout<<"Wrong choice.\n";
};
if(new_user)
{
cout<<"\nThe details entered are:\n";
cout<<new_user->first_name<<endl;
cout<<new_user->last_name<<endl;
cout<<new_user->age<<endl;
cout<<new_user->email<<endl;
cout<<new_user->password;
}
cout<<endl<<endl;
return 1;
}
void displayusers()
{
for(int i=0;i<=globalcount;i++)
{
cout<<"\n"<<users[i].first_name<<" "<<users[i].last_name<<" "<<users[i].age<<" "<<users[i].email<<" "<<users[i].password;
}
cout<<endl;
}
int main()
{
globalcount=-1;
int temp1=loadusers();
if(globalcount!=-1)
displayusers();
int temp=account_info();
int a;
//cin>>a;
struct queue *crawl=createqueue();
iqueue=new indexqueue;
iqueue->front=NULL;
iqueue->rear=NULL;
string text;
text="inputproject.txt";
ifstream infile;
infile.open("inputproject.txt");
if(!infile)
{
cout<<"inputproject.txt not open\n";
return 0;
}
else
cout<<"inputproject.txt successfully opened\n";
crawl=spider(crawl,infile,text);
cout<<"Hey\n";
if(crawl->front==NULL)
return 1;
cout<<"main:Displaying crawl\n";
Trie *dummy=new Trie;
dummy->addWord("movie");
dummy->addWord("harry potter");
dummy->addWord("rajnikanth");
if(dummy->searchWord("movie"))
{
cout<<"MOVIE FOUND IN DUMMY^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n\n";
}
if(dummy->searchWord("harry potter"))
{
cout<<"harry potter FOUND IN DUMMY^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n\n";
}
if(dummy->searchWord("rajnikanth"))
{
cout<<"rajnikanth FOUND IN DUMMY^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n\n";
}
cout<<iqueue->front->down;
display(crawl);
displayIndexQueue();
string searchstring;
cout<<"\n Enter the string you want to enter\t";
getline(cin,searchstring);
string arraystring[20];int m=0,n=0;
for(int i=0;i<20;i++)
arraystring[i]="";
for(int i=0;i<searchstring.length();i++)
{
cout<<"\n segregating string\t";
if(searchstring[i]==' ')
{
m=m+1;
arraystring[m]="";
cout<<"AAAAAAAAAAA\n";
}
else
{
arraystring[m]+=searchstring[i];
cout<<"BBBBBBBBBBBB\n";
}
/*if((searchstring[i]>='a'&&searchstring[i]<='z')||(searchstring[i]>='A'&&searchstring[i]<='Z')||searchstring[i]=='/'||searchstring[i]=='_')
{
arraystring[m]+=searchstring[i] ;
cout<<"\n adding to array\t";
}
else
{
m++;
//n=0;
cout<<"\n incrementing 1\t";
}*/
}
//Searching for individual string to be as a part of links we crawled "State Automata Search"
cout<<"\n"<<iqueue->front->link<<"\n-------------------\t";
indexqueue iqu[m];
struct indexnode *tempiq;
for(int x=0;x<m;x++)
{
cout<<"\n 11111111111111\t";
//iqu[x]=new createindexqueue();
//=createindexnode(" ");
tempiq=iqueue->front; //above mentioned code segment
cout<<"\n"<<iqueue->front->link<<""<<iqueue->front<<"\t________________________";
if(tempiq)// && iqueue->front)
cout<<"\n aaaaaaaaaaaaaaaaaaaa\t";
while(tempiq)
{
cout<<"\n entered the tempiq inorder to search\t";
indexnode *temp;
temp=(iqu[x].front);
char *c,*c2;
strcpy(c,(tempiq->link).c_str());
strcpy(c2,arraystring[x].c_str());
if(searchauto(c2,c))
{
cout<<"\n checking for automata\t";
while(temp)
{
cout<<"\n entered while\t";
if(temp->next!=NULL)
temp=temp->next;
else
{
cout<<"\n creaing indexes\t";
indexnode *am=createindexnode(tempiq->link);
temp->next=am;
}
}
}
tempiq=tempiq->next;
}
}
for(int i=0;i<m;i++)
{
indexqueue q=iqu[i];
indexnode *qt=q.front;
while(qt)
{
cout<<"---"<<qt->link<<"---";
qt=qt->next;
cout<<"\n";
}
cout<<"\n\n\n";
}
//cout<<endl<<iqueue->front->down->abc<<endl;
//cout<<iqueue->rear->down->abc;
cout<<endl;
return 1;
}
I'm not sure that it's the problem that cause your segmentation fault but... it's a problem.
With the following instructions
char *c,*c2;
strcpy(c,(tempiq->link).c_str());
strcpy(c2,arraystring[x].c_str());
if(searchauto(c2,c))
you write, with strcpy(), in a couple undefined (c and c2 are uninitialized) and unallocated memory areas.
Are you sure that you need to copy this couple of std::string in char * pointed area?
In this case, you should allocate the needed memory; something like this
char *c,*c2;
c = new char[(tempiq->link).size()+1U];
c2 = new char[arraystring[x].size()+1U];
strcpy(c,(tempiq->link).c_str());
strcpy(c2,arraystring[x].c_str());
if(searchauto(c2,c))
But remember to delete [] c and c2.
This if you really need a couple of allocated char *.
But I suppose you can simply pass the c_str() value of this couple of std::string to searchauto()
if(searchauto((tempiq->link).c_str(), arraystring[x].c_str()))
if you define const the parameters of searchauto()
int searchauto(const char *pat, const char *txt)
and the first one of computeTransFun()
void computeTransFun(const char *pat, int M, int TF[][NO_OF_CHARS])
p.s.: sorry for my bad English.

Endless loop recording string

The code should create a doubly linked list. THen a list of IP adresses should be added to this list with the number of times the unique IP is met. Then the list should be sorted. TO my sorry, the code is cycled somewhere when it's recorded. Highlighted the place in bold (tried to do that:)).
P.S. I would be pleased if you'll help me with sort method selection. I've already made one, but what would be better to use quicksort or something else?
#include <stdlib.h>
#include <iostream>
#include <stdio.h>
using namespace std;
struct IP
{
char b[20];
int count;
};
struct Node
{
IP a;
Node *Next,*Prev;
};
struct List
{
Node *Head,*Tail;
int length;
List():Head(NULL),Tail(NULL){};
};
List* list_new()
{
return (List *)calloc(1, sizeof(List));
}
void list_delete(List* l)
{
while (l->Head)
{
l->Tail=l->Head->Next;
free (l->Head);
l->Head=l->Tail;
}
l->length=0;
}
bool push(List* l, IP a)
{
Node *temp=(Node* ) calloc (1, sizeof(Node));
temp->Next=NULL;
temp->a=a;
if (l->Head!=NULL)
{
temp->Prev=l->Tail;
l->Tail->Next=temp;
l->Tail=temp;
}
else
{
temp->Prev=NULL;
l->Head=l->Tail=temp;
}
return 1;
}
bool pop(List*l, IP* x)
{
(*x)=l->Tail->a;
l->Tail->Prev->Next=NULL;
l->Tail=l->Tail->Prev;
l->length++;
return 1;
}
bool unshift(List*l, IP a)
{
Node *temp=(Node* ) calloc (1, sizeof(Node));
temp->Next=NULL;
temp->a=a;
if (l->Head!=NULL)
{
temp->Next=l->Head;
l->Head->Prev=temp;
l->Head=temp;
}
else
{
temp->Prev=NULL;
l->Head=l->Tail=temp;
}
return 1;
}
bool shift(List* l, IP* x)
{
(*x)=l->Head->a;
l->Head->Next->Prev=NULL;
l->Head=l->Head->Next;
return 1;
}
bool reverse (List* l)
{
Node* temp=l->Head;
Node* swaps=NULL;
l->Tail=l->Head;
while (temp!=NULL)
{
swaps=temp->Prev;
temp->Prev=temp->Next;
temp->Next=swaps;
temp=temp->Prev;
}
if (swaps != NULL) l->Head = swaps->Prev;
return 1;
}
void sort (List* l)
{
int i;
for (i=0; i<l->length; ++i) {
Node* compared = l->Head;
while (compared->Next != NULL) {
if (compared->Next->a.count > compared->a.count) {
IP t = compared->Next->a;
compared->Next->a = compared->a;
compared->a = t;
}
compared = compared->Next;
}
}
}
void Show(List* l)
{
int i;
Node* temp=l->Head;
while (temp!=NULL)
{
cout<<temp->a.b<<" "<<temp->a.count<<"\n";
temp=temp->Next;
}
cout<<"\n";
}
int main ()
{
int i;
char strbuf[1000],chTemp;
IP ipTemp;
bool met;
system("CLS");
List* l = list_new();
FILE* foo;
errno_t err;
err=fopen_s(&foo,"input.txt","r");
if( err == 0 )
{
printf( "The file 'input.txt' was opened\n" );
}
else
{
printf( "The file 'input.txt' was not opened\n" );
}
while (!feof(foo))
{
fgets(strbuf,1000,foo);
fclose(foo);
for (i=0;i++;i<20)
if (strbuf[i]==' ') {strncpy_s( ipTemp.b,strbuf, i);break;}
Node* cur = l->Head;
met=0;
while (cur!=NULL)
{
if (cur->a.b == ipTemp.b)
{
met=1;
cur->a.count++;
break;
}
cur=cur->Next;
}
if (met==0)
{
push(l,ipTemp);
l->Tail->a.count++;
}
}
sort(l);
Show(l);
system("PAUSE");
}
If the code had a cleaner indentation, you would maybe realize that the logic is wrong:
while (!feof(foo))
{
fgets(strbuf,1000,foo); // <-- what if fgets hits EOF or error occurs?
fclose(foo); // <-- why?
for (i = 0; i++; i < 20) // <-- i++ is always true ~> infinite loop
....
...
}
should be (assuming you want to write code in C):
while (fgets(strbuf, 1000, foo))
{
for (i = 0; i < 20; i++)
....
...
}
for (i=0;i++;i<20) should be for (i=0;i<20;i++)