Professional Documents
Culture Documents
/*
Name – KUSHAGRA JOSHI
Roll no. - 40
Section - G
QUESTION-1: Write a C Program to store N elements to an array and then send all positive elements of the
array to the end without altering the original sequence.
*/
SOURCE CODE:
#include <stdio.h>
int negative = 0 , positive = 0 ;
void func(int arr[] , int n){
int left[negative] ;
int right[positive] ;
int j = 0 , k = 0;
for(int i = 0 ; i < n ;i++){
if(arr[i] < 0){
left[j++] = arr[i] ;
}else{
right[k++] = arr[i] ;
}
}
j=0;
int i = 0 ;
while(j < negative){
arr[i++] = left[j++];
}
k=0;
while(k < positive){
arr[i++] = right[k++] ;
}
}
int main(){
int n ;
scanf("%d" , &n) ;
int arr[n] ;
for(int i = 0 ; i < n ;i++)
{ scanf("%d",
&arr[i] ) ; if(arr[i] >=
0){
positive += 1;
}else{
negative += 1 ;
}
}
func(arr , n) ;
for(int i = 0 ; i < n ; i++)
{ printf("%d " ,
arr[i]) ;
}
1
DSA WITH C
return 0;
}
2
DSA WITH C
OUTPUT:
3
DSA WITH C
/*
Name – KUSHAGRA JOSHI
Roll no. - 40
Section - G
QUESTION-2: Write a C program to create two linked lists positive and negative from an Original linked
list, so that positive linked list contains all positive elements and negative linked list contains negative ele-
ments. Positive and negative linked lists should use the node of existing original linked list.
*/
SOURCE CODE:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
int data ;
struct Node *next ;
}Node;
Node *insertatend(Node *head, int val){
Node *node = (Node *)malloc(sizeof(Node)) ;
node -> data = val ;
node -> next = NULL ;
if(head == NULL){
head = node ;
}
else{
Node *current = head ;
while(current -> next != NULL){
current = current -> next ;
}
current -> next = node ;
}
return head;
}
void display(Node *head){
if(head == NULL){
printf("Empty\n");
return ;
}
Node *current = head ;
while(current != NULL){
printf("%d " , current -> data) ;
current = current -> next;
}
printf("\n") ;
return ;
}
void solve(){
Node *head = NULL ;
int t ;
printf("Enter -1 to break :\n") ;
while(scanf("%d" ,&t)){
4
DSA WITH C
if(t == -1){
break ;
}
head = insertatend(head , t) ;
}
printf("The linked list is : ") ;
display(head) ;
Node *negative = malloc(sizeof(Node));
negative -> data = - 1;
Node *neg = negative;
Node *positive = malloc(sizeof(Node));
Node *pos = positive ;
positive -> data = -1 ;
Node *current = head ;
while(current != NULL){
if(current -> data >= 0){
positive -> next = current ;
positive = current ;
}
else{
negative -> next = current ;
negative = current ;
}
current = current -> next ;
}
positive -> next = NULL ;
negative -> next = NULL ;
if(neg -> next != NULL){
neg = neg -> next ;
}
else{
neg = NULL ;
}
if(pos -> next != NULL){
pos = pos -> next ;
}
else{
pos= NULL ;
}
printf("Negative : ") ;
display(neg) ;
printf("Positive : ") ;
display(pos) ;
return ;
}
int main(){
solve() ;
}
5
DSA WITH C
OUTPUT:
Enter -1 to break :
35 -18 95 -97 47 89 -4 98 0 -1
The linked list is : 35 -18 95 -97 47 89 -4 98 0
Negative : -18 -97 -4
Positive : 35 95 47 89 98 0
6
DSA WITH C
/*
Name – KUSHAGRA JOSHI
Roll no. - 40
Section - G
QUESTION-3: Write a C program to create a linked list P, then write a ‘C’ function named split to create
two linked lists Q & R from P So that Q contains all elements in odd positions of P and R contains the
re- maining elements. Finally print both linked lists i.e Q and R.
*/
SOURCE CODE:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
typedef struct Node{
int data ;
struct Node *next ;
}Node;
Node *insertatend(Node *head , int val){
Node *node = (Node *)malloc(sizeof(Node)) ;
node -> data = val ;
node -> next = NULL ;
if(head == NULL){
head = node ;
}
else{
Node *current = head ;
while(current -> next != NULL){
current = current -> next ;
}
current -> next = node ;
}
return head ;
}
void display(Node *head)
{ Node *current = head ;
while(current != NULL){
printf("%d " , current ->data) ;
current = current -> next ;
}
printf("\n") ;
return ;
}
void split(Node *P){
if(P == NULL || P -> next == NULL){
display(P) ;
return ;
}
Node *q =
(Node*)malloc(sizeof(Node)) ; Node *r =
(Node*)malloc(sizeof(Node)) ; Node *Q
7
DSA WITH C
=q;
8
DSA WITH C
Node *R = r ;
Node *current = P
; while(true){
q -> next = current ;
q = q -> next ;
if(current -> next != NULL){
r -> next = current -> next ;
r = r -> next ;
}
else{
break ;
}
if(current -> next -> next == NULL){
break ;
}
else{
current = current -> next -> next ;
}
}
q -> next = NULL ;
r -> next = NULL ;
printf("The elements at odd position are : \n") ;
display(Q -> next) ;
printf("The elements at even position are : \n") ;
display(R -> next) ;
return ;
}
void solve(){
Node *head = NULL ;
int t ;
printf("Enter -1 to break : \n") ;
while(scanf("%d" , &t)){
if(t == -1){
break ;
}
head = insertatend(head , t) ;
}
split(head) ;
}
int main()
{ solve()
;}
9
DSA WITH C
OUTPUT:
Enter -1 to break :
46 98 -23 98 54 36 -23 -1
The elements at odd position are :
46 -23 54 -23
The elements at even position are :
98 98 36
1
DSA WITH C
/*
Name – KUSHAGRA JOSHI
Roll no. - 40
Section - G
QUESTION-4: Write a program to add of two polynomials of degree n, using linked list. For example:
p1=an x n +an-1x n-1 + an-2x n-2 +..........a0 x 0
P2=bn x n +bn-1x n-1 + bn-2x n-2 +..........b0 x 0
p1 = first polynomial p2 = second polynomial. Find out p3= p1+p2
*/
SOURCE CODE:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
int cons ;
int deg ;
struct Node *next ;
}Node ;
Node *insert(Node *head , int x , int y){
Node *node = (Node *)malloc(sizeof(Node)) ;
node -> cons = x ;
node -> deg = y ;
node -> next = NULL ;
if(head == NULL){
head = node ;
}
else{
Node *current = head ;
while(current -> next){
current = current -> next ;
}
current -> next = node ;
}
return head ;
}
void display(Node *head){
if(head == NULL){
return ;
}
Node *current = head ;
while(current -> next){
printf("%dx^%d + " , current -> cons , current -> deg) ;
current = current -> next ;
}
printf("%d \n" , current -> cons) ; return ;
}
Node *add(Node *head1 , Node *head2 , int n , int t){
Node *ptr = head1 ;
Node *current = head2 ;
Node *res = (Node *)malloc(sizeof(Node)) ;
1
DSA WITH C
Node *dn = res;
res -> next = NULL ;
int d = n - t ;
if(t > n){
ptr = head2 ;
current = head1 ;
d=t-n;
}
while(d--){
res -> next = ptr ;
res = res -> next ;
ptr = ptr -> next ;
}
while(current != NULL && ptr != NULL){
current -> cons = (current -> cons + ptr -> cons) ;
res -> next = current ;
res = res -> next ;
current = current -> next ;
ptr = ptr -> next ;
}
res -> next = NULL ;
return dn -> next ;
}
int main(){
Node *head= NULL ;
Node *head2 = NULL ;
printf("Enter the highest degree of first polynomial : ") ;
int n ;
scanf("%d" , &n) ;
printf("Enter the coefficients in decreasing order of power : \n") ;
for(int i = n ; i >= 0 ; i--){
int a ;
scanf("%d" , &a) ;
head = insert(head , a, i) ;
}
printf("Enter the highest degree of second polynomial : ") ;
int t ;
scanf("%d" , &t) ;
printf("Enter the coefficients in decreasing order of power : \n") ;
for(int i = t ; i >= 0 ; i--){
int x ;
scanf("%d" , &x) ;
head2 = insert(head2 , x , i) ;
}
printf("First : ") ;
display(head) ;
printf("Second : ") ;
display(head2) ;
printf("Result : ") ;
Node *res = add(head , head2 , n , t) ;
display(res) ;
}
1
DSA WITH C
OUTPUT:
/*
1
DSA WITH C
Name – KUSHAGRA JOSHI
Roll no. - 40
Section - G
QUESTION-5: Write a C program to implement time sharing environment (using circular linked list) for N
processes, where CPU allocates time slots of 10ns for given N processes, then print which
process will be completed in how much time.
*/
SOURCE CODE:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define cputime 10
typedef struct Node{
int data , idx ;
struct Node *next;
} Node;
int main(){
int n ;
printf("Enter No. of Process: ") ;
scanf("%d", &n);
Node *head = NULL;
for (int i = 1; i <= n; i++){
head = insert(head, i);
}
timetaken(head);
}
1
DSA WITH C
OUTPUT:
1
DSA WITH C
/*
Name – KUSHAGRA JOSHI
Roll no. - 40
Section - G
QUESTION-6: Write a C program to create a double linked list by inserting nodes in such a way that the
resultant linked list remains in ascending order. (do not use any sorting technique).
*/
SOURCE CODE:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
typedef struct Node{
int data ;
struct Node *next ;
struct Node *prev ;
}Node;
Node *head = NULL ;
Node *tail = NULL ;
Node *insert(Node *head , int val){
Node *current = head ;
Node *node = (Node *)malloc(sizeof(Node))
; node -> data = val ;
node -> next = NULL;
node -> prev = NULL;
if(head == NULL){
head = tail = node ;
return head ;
}
if(val <= head -> data){
node -> next = head ;
head -> prev = node ;
head = node ;
return head ;
}
if(val >= tail -> data){
tail -> next = node ;
node -> prev = tail ;
tail = node ;
return head ;
}
else{
while(true){
if(val <= current -> data){
Node *prev_node = current -> prev ;
1
DSA WITH C
prev_node -> next = node ;
node -> next = current ;
node -> prev = prev_node ;
current -> prev = node ;
break ;
}
else{
current = current -> next ;
}
}
}
return head ;
}
void display(Node *head)
{ Node *current = head ;
while(current != NULL){
printf("%d " , current -> data) ;
current = current -> next ;
}
printf("\n") ;
return ;
}
void solve(){
int t ;
printf("Enter -1 to break") ;
while(scanf("%d" , &t)){
if(t == -1){
break ;
}
head = insert(head , t) ;
}
printf("The linked list is : \n") ;
display(head) ;
}
int main(){
solve() ;
}
1
DSA WITH C
OUTPUT:
Enter -1 to break
87 -54 2 98 99 43 -1
The linked list is :
-54 2 43 87 98 99
1
DSA WITH C
/*
Name – KUSHAGRA JOSHI
Roll no. - 40
Section - G
QUESTION-7: Write a C program to create a binary search tree and perform following operations:
1) Search a particular key.
2) Delete a node from the tree.
3) Find total number of leaf nodes
4) Find height of a binary search tree
5) Count total numbers of nodes from right hand side of root node */
SOURCE CODE:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
int data ;
struct Node *left ;
struct Node *right ;
}Node ;
void insert(Node **rootnode , int val){
if(*rootnode == NULL){
Node *node = (Node *)malloc(sizeof(Node)) ;
node -> data = val ;
node -> left = NULL ;
node -> right = NULL ;
*rootnode = node ;
return ;
}
else{
if(((*rootnode)) -> data > val)
{ insert((&(*rootnode) ->
left) ,val) ;
}
else{
insert((&(*rootnode) -> right) , val) ;
}
}
}
void preordertraversal(Node *rootnode){
if(rootnode == NULL){
return ;
}
printf("%d " , rootnode -> data) ;
preordertraversal(rootnode -> left) ;
preordertraversal(rootnode -> right) ; return ;
}
void search(Node *rootnode , int val){
if(rootnode == NULL){
printf("The value is not found") ; return ;
}
if(rootnode -> data == val){
printf("The value is found") ; return ;
}
2
DSA WITH C
if(rootnode -> data > val){
2
DSA WITH C
search(rootnode -> left , val) ;
}
else{
search(rootnode -> right , val) ;
}
}
2
DSA WITH C
int max(int a , int b){
if(a > b){
return a ;
}else{
return b ;
}
}
int height(Node *rootnode){
if(rootnode -> right == NULL && rootnode -> left == NULL){
return 0 ;
}
int a = 0 , b =0 ;
if(rootnode -> right != NULL){
a = height(rootnode -> right) ;
}
if(rootnode -> left != NULL){
b = height(rootnode -> left) ;
}
return max(a , b) + 1;
}
int totalrightnodes(Node *rootnode){
if(rootnode == NULL){
return 0 ;
}
if(rootnode -> right != NULL){
return 1 + totalrightnodes(rootnode -> right) ;
} else{
return 0 ;
}
}
int main(){
Node *rootnode = NULL ;
int t ;
while(scanf("%d" , &t)){
if(t == -1){
break ;
}
insert(&rootnode , t) ;
}
printf("Preordertraversal : ") ;
preordertraversal(rootnode) ;
printf("The total number of leaf nodes are %d: \n" , totalleafnodes(rootnode)) ;
printf("The height of the bst is : %d \n" , height(rootnode));
printf("The total number of nodes to the right of the rootnode are : %d\n" , totalrightnodes(rootnode));
printf("Enter the node to be found : \n") ;
int nodetobefound ;
scanf("%d" ,&nodetobefound) ;
search(rootnode , nodetobefound) ;
printf("\n") ;
printf("Enter the node to be deleted : ") ;
int val ;
scanf("%d" , &val) ;
delete(&rootnode , val) ;
preordertraversal(rootnode) ;
return 0 ;
}
2
DSA WITH C
OUTPUT:
Enter -1 to break
67 54 87 12 98 34 76 89 -1
Preordertraversal : 67 54 12 34 87 76 98 89
The total number of leaf nodes are: 3
The height of the bst is : 3
The total number of nodes to the right of the rootnode are : 2
Enter the node to be found :
98
The value is found
Enter the node to be deleted : 12
67 54 34 87 76 98 89
2
DSA WITH C
/*
Name – KUSHAGRA JOSHI
Roll no. - 40
Section - G
QUESTION-8: Write a C program to sort an unsorted sequence of strings given by user in an array, using
Merge sort technique.
*/
SOURCE CODE:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define mxN 100
void merge(char *arr[] , int l , int mid , int h){
int i = l , j = mid + 1 ;
int k = 0 ;
char **v = malloc(sizeof(char *) * (h - l + 1)) ;
while(i <= mid && j <= h){
if(strcmp(arr[i] , arr[j]) < 0)
{ v[k++] = arr[i++] ;
}
else{
v[k++] = arr[j++] ;
}
}
while(i <= mid){ v[k+
+] = arr[i++] ;
}
while(j <= h){ v[k+
+] = arr[j++] ;
}
k=0;
for(int i = l ; i <= h ; i++){
arr[i] = v[k++] ;
}
return ;
}
void mergesort(char *arr[] , int l , int h){
if(l >= h){
return ;
}
int mid = (l + h) / 2 ;
mergesort(arr , l , mid) ;
mergesort(arr , mid + 1 , h) ;
merge(arr , l , mid , h) ;
2
DSA WITH C
}
int main(){
printf("Enter the number of strings : ") ;
int n ;
scanf("%d " , &n) ;
char** arr = malloc(sizeof(char *)* n);
printf("Enter the strings : \n") ;
for(int i = 0 ; i < n ; i++){
2
DSA WITH C
OUTPUT:
2
DSA WITH C
/*
Name – KUSHAGRA JOSHI
Roll no. - 40
Section - G
QUESTION-9: Write a C program to implement linked representation of a graph in memory using array of
pointers.
*/
SOURCE CODE:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
int visited[1000] = {0} ;
typedef struct Node{
int data ;
struct Node *next ;
}Node ;
typedef struct adjlist{
Node *head ;
}adjlist ;
typedef struct Graph{
int v ;
struct adjlist *arr ;
}Graph ;
Graph *create(int v){
Graph *gr = (Graph *)malloc(sizeof(Graph)) ;
gr -> v = v ;
gr -> arr = (adjlist *)malloc((v + 1) * sizeof(adjlist)) ;
for(int i = 1 ; i <= v ; i++){
gr -> arr[i].head = NULL ;
}
return gr ;
}
Node *newNode(int val){
Node *node = (Node *)malloc(sizeof(Node)) ;
node -> data = val ;
node -> next = NULL ;
return node ;
}
void addedge(Graph *gr , int u , int v){
Node *node = newNode(v) ;
if(gr -> arr[u].head == NULL){
gr -> arr[u].head = node ;
}
else{
node -> next = gr -> arr[u].head ;
gr -> arr[u].head = node ;
}
Node *newnode = newNode(u) ;
if(gr -> arr[v].head == NULL){
2
DSA WITH C
gr -> arr[v].head = newnode ;
}
else{
newnode -> next = gr -> arr[v].head ;
gr -> arr[v].head = newnode ;
}
}
void display(Graph *gr){
for(int i = 1 ; i <= gr -> v ; i++){
printf("%d---->" , i) ;
Node *current = gr -> arr[i].head ;
while(current != NULL){
printf("%d " , current -> data) ;
current = current -> next ;
}
printf("\n") ;
}
return
;
}
void solve(){
int n , m ;
printf("Enter the number of vertices and the number of edges\n") ;
scanf("%d %d" , &n , &m) ;
Graph *gr = create(n) ;
printf("Enter the source and destination of each edge : ") ;
for(int i = 0; i < m ; i++){
int x , y ;
scanf("%d %d", &x , &y) ;
addedge(gr , x , y) ;
}
printf("The linked list representation of graph is : \n") ;
display(gr) ;
return ;
}
int main(){
solve() ;
}
3
DSA WITH C
OUTPUT:
3
DSA WITH C
/*
Name – KUSHAGRA JOSHI
Roll no. - 40
Section - G
SOURCE CODE:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
int visited[1000] = {0} ;
typedef struct Node{
int data ;
struct Node *next ;
}Node ;
typedef struct adjlist{
Node *head ;
}adjlist ;
typedef struct Graph{
int v ;
struct adjlist *arr ;
}Graph ;
Graph *create(int v){
Graph *gr = (Graph *)malloc(sizeof(Graph)) ;
gr -> v = v + 1 ;
gr -> arr = (adjlist *)malloc((v + 1) * sizeof(adjlist)) ;
for(int i = 1 ; i <= v ; i++){
gr -> arr[i].head = NULL ;
}
return gr ;
}
Node *newNode(int val){
Node *node = (Node *)malloc(sizeof(Node)) ;
node -> data = val ;
node -> next = NULL ;
return node ;
}
void addedge(Graph *gr , int u , int v){
Node *node = newNode(v) ;
if(gr -> arr[u].head == NULL){
gr -> arr[u].head = node ;
}
else{
node -> next = gr -> arr[u].head ;
gr -> arr[u].head = node ;
}
Node *newnode = newNode(u) ;
if(gr -> arr[v].head == NULL){
gr -> arr[v].head = newnode ;
3
DSA WITH C
}
else{
newnode -> next = gr -> arr[v].head ;
gr -> arr[v].head = newnode ;
}
}
3
DSA WITH C
OUTPUT:
Enter the number of vertices and the number of edges
44
Enter the source and destination of each edge :
13
12
23
24
DFS Traversal : 1 2 4 3
3
DSA WITH C
/*
Name – KUSHAGRA JOSHI
Roll no. - 40
Section - G
SOURCE CODE:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct Edge{
int w , x , y ;
} Edge ;
typedef struct Graph{
int V , E ;
Edge *edgelist ;
}Graph ;
Graph *create(int n , int m){
Graph *gr = (Graph *)malloc(sizeof(Graph)) ;
gr -> V = n ;
gr -> E = m ;
gr -> edgelist = (Edge *)malloc(sizeof(Edge) * (m + 1)) ;
return gr ;
}
int *parent ;
int *rank ;
void init(int n){
parent = (int *)malloc(sizeof(int) * (n + 1)) ;
rank = (int *)malloc(sizeof(int) * (n + 1)) ;
for(int i = 1 ; i <= n ; i++){
parent[i] = -1 ;
rank[i] = 1 ;
}
return ;
}
int findset(int x){
if(parent[x] == -1){
return x ;
}
return parent[x] = findset(parent[x]) ;
}
void unite(int x , int y){
int s1 = findset(x) ;
int s2 = findset(y) ;
if(s1 != s2){
if(rank[s1] < rank[s2])
{ parent[s1] = s2 ;
rank[s2] += rank[s1] ;
3
DSA WITH C
}
else{
parent[s2] = s1 ;
rank[s1] += rank[s2] ;
}
}
return ;
}
int comp(const void *a , const void *b){
Edge *x = (Edge *)a ;
Edge *y = (Edge *)b ;
return x -> w > y -> w ;
}
int kruskal(Graph *gr){
int answer = 0 ;
for(int i = 0 ; i < gr -> E ; i++){
int s1 = findset(gr -> edgelist[i].x) ;
int s2 = findset(gr -> edgelist[i].y) ;
if(s1 != s2){
unite(s1 , s2) ;
answer += gr -> edgelist[i].w ;
}
}
return answer ;
}
void solve(){
int n , m ;
printf("Enter the number of vertices and edges\n") ;
scanf("%d %d" , &n , &m) ;
Graph *gr = create(n , m) ;
init(n) ;
printf("Enter the source , destination and the weight of the edge \n") ;
for(int i = 0 ; i < m ; i++){
int x , y , w ;
scanf("%d %d %d" , &x , &y , &w) ;
gr -> edgelist[i].x = x ;
gr -> edgelist[i].y = y ;
gr -> edgelist[i].w = w ;
}
qsort(gr -> edgelist , gr -> E , sizeof(gr -> edgelist[0]) , comp) ;
printf("The cost of minimum spanning tree is : %d \n" , kruskal(gr)) ;
}
int main(){
solve() ;
}
3
DSA WITH
OUTPUT: