diff --git a/_readme.swp b/_readme.swp new file mode 100644 index 0000000..56350be Binary files /dev/null and b/_readme.swp differ diff --git a/library.cpp b/library.cpp new file mode 100644 index 0000000..7ebba19 --- /dev/null +++ b/library.cpp @@ -0,0 +1,228 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +//Name: +//Modified: 2017 +//Author: Nilesh Payghan +//Input: +//output: +//Description: +//////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include +#include + +#include"sharedheader.h" + + +SinglyLinkedList::SinglyLinkedList() +{ + head=NULL; +} + +///////////////////////////////////////////////////////////////////////////////////////////// +void SinglyLinkedList::InsertFirst(int data) +{ + + PNODE newn=NULL; + newn=(PNODE)malloc(sizeof(NODE)); + + //copy data to node + newn->data=data; + //copy the address of head node of linked list into newn->next + newn->next=head; + //copy the address of newn element into *head + head=newn; +} +////////////////////////////////////////////////////////////////////////////////////////////// + +void SinglyLinkedList::InsertLast(int data) +{ + + PNODE newn=NULL; + PNODE temp=head; + newn=(PNODE)malloc(sizeof(NODE)); + if(newn==NULL) + { + return; + } + newn->data=data; + newn->next=NULL; + //if linked is empty + if(head==NULL) + { + head=newn; + } + //if linked list contains at least single element + else + { + //go till end of linked list + while(temp->next!=NULL) + { + temp=temp->next; + } + //copy address of newn into end of the linked list + temp->next=newn; + } +} +///////////////////////////////////////////////////////////////////////////////////////////// +void SinglyLinkedList::Display() +{ + PNODE first=head; + //traversing the whole linked list elements + while(first!=NULL) + { + cout<<(first->data)<next; + } +} +//////////////////////////////////////////////////////////////////////////////////////////// +int SinglyLinkedList::llCount() +{ +if(head==NULL) + return 0; +int cnt=0; +PNODE temp=head; + //traversing the whole linked list elements + while(temp!=NULL) + { + temp=temp->next; + cnt++; + } +return cnt; +} +/////////////////////////////////////////////////////////////////////////////////////////// +void SinglyLinkedList::InsertAtPosition(int data,int pos) +{ +if(pos<=0 || pos>(llCount()+1)) + return; +if(head==NULL && pos>1) + return; + + int i=1; + PNODE newn=NULL; + PNODE temp=head; + newn=(PNODE)malloc(sizeof(NODE)); + if(newn==NULL) + { + return; + } + + newn->data=data; + newn->next=NULL; + if(temp==NULL && pos==1) + { + temp=newn; + newn->next=NULL; + } + else + { + while(inext!=NULL) + { + temp=temp->next; + i++; + } + newn->next=temp->next; + temp->next=newn; + } +} +//////////////////////////////////////////////////////////////////////////////////// + +void SinglyLinkedList::DisplayN(int no) +{ +if(head==NULL || no<=0) + return; +PNODE first=head; + //traversing the whole linked list elements + while(first!=NULL && no>0) + { + cout<<(first->data)<next; + no--; + } +} +/*//////////////////////////////////////////////////////////////////////////////// +void SinglyLinkedList::DisplayReverse() +{ + PNODE first=head; +if(first==NULL) + return; + // recursive call to the function + first=first->next; + DisplayReverse(); + cout<<(first->data)<next; + temp->next=NULL; + delete(temp); +} +////////////////////////////////////////////////////////////////////////// +void SinglyLinkedList::DeleteLast() +{ + PNODE temp=head; + PNODE temp2=NULL; + if(temp==NULL) + return; + if(temp->next==NULL) + { + delete(temp); + head=NULL; + } + else + { + while(temp->next->next!=NULL) + { + temp=temp->next; + } + temp2=temp->next; + temp->next=NULL; + delete(temp2); + } +} +/////////////////////////////////////////////////////////////////////////////// +void SinglyLinkedList::DeleteAll() +{ + if(head==NULL) + return; + PNODE temp=head; + delete(temp); + head=NULL; +} +/////////////////////////////////////////////////////////////////////////////// +void SinglyLinkedList::DeleteNode(int data) +{ + PNODE temp=head; + PNODE temp2=head; + if(head==NULL) + return; + while(temp->next!=NULL) + { + if(temp->data==data) + break; + temp2=temp; + temp=temp->next; + } + if(temp->data==data) + { + temp2=temp->next; + temp->next=NULL; + delete(temp); + } +} +extern "C" +{ + SinglyLinkedList* create() + { + return new SinglyLinkedList; + } + void destroy(SinglyLinkedList* p) + { + delete p; + } +} + + diff --git a/library.so b/library.so new file mode 100644 index 0000000..ca8e5b0 Binary files /dev/null and b/library.so differ diff --git a/readme b/readme new file mode 100644 index 0000000..85dd34d --- /dev/null +++ b/readme @@ -0,0 +1,8 @@ +command too create .so file: + g++ -fPIC -shared library.cpp -o library.so + +command t create executable for client program + g++ user.cpp -ldl -o user + +after executing this command use executable : ./user + \ No newline at end of file diff --git a/sharedheader.h b/sharedheader.h new file mode 100644 index 0000000..852122c --- /dev/null +++ b/sharedheader.h @@ -0,0 +1,31 @@ +#include +#include +using namespace std; +typedef struct node +{ +int data; +struct node* next; +}NODE,*PNODE,**PPNODE; + + +class SinglyLinkedList +{ +private: + PNODE head; +public: + SinglyLinkedList(); + void InsertFirst(int); + void InsertLast(int); + void InsertAtPosition(int,int); + void Display(); + void DisplayN(int); + //void DisplayReverse(); + //void DisplayForward();//recursively + int llCount(); + + void DeleteFirst(); + void DeleteAtPosition(int); + void DeleteLast(); + void DeleteAll(); + void DeleteNode(int); +}; \ No newline at end of file diff --git a/user b/user new file mode 100644 index 0000000..1939fda Binary files /dev/null and b/user differ diff --git a/user.cpp b/user.cpp new file mode 100644 index 0000000..fb53f97 --- /dev/null +++ b/user.cpp @@ -0,0 +1,43 @@ +#include +#include + +#include"sharedheader.h" +#include +int main() +{ + + //SinglyLinkedList sll; + void* p=NULL; + SinglyLinkedList* ptr=NULL; + SinglyLinkedList*(*fp1)()=NULL; + void (*fp2)(SinglyLinkedList*)=NULL; + p=dlopen("library.so",RTLD_LAZY); + if(!p) + { + cout<<"unable to load library"; + return -1; + } + fp1=(SinglyLinkedList*(*)())dlsym(p,"create"); + fp2=(void(*)(SinglyLinkedList*))dlsym(p,"destroy"); + ptr=fp1(); + cout<InsertFirst(10); + ptr->InsertLast(20); + ptr->InsertLast(20); + ptr->InsertLast(20); + ptr->InsertAtPosition(30,2); + ptr->DeleteFirst(); + ptr->Display(); + //ptr->DeleteLast(); + //ptr->DisplayN(2); + ptr->DeleteNode(20); + //ptr->DeleteAll(); + ptr->Display(); + fp2(ptr); + dlclose(p); + +cout<<"main"; + +return 0; +}