formatting source-code for b388e4a309

This commit is contained in:
github-actions 2020-05-29 20:23:24 +00:00
parent b388e4a309
commit 0779a2b70d
260 changed files with 7566 additions and 6554 deletions

View File

@ -1,25 +1,27 @@
// Client side implementation of UDP client-server model // Client side implementation of UDP client-server model
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#define PORT 8080 #define PORT 8080
#define MAXLINE 1024 #define MAXLINE 1024
// Driver code // Driver code
int main() { int main()
{
int sockfd; int sockfd;
char buffer[MAXLINE]; char buffer[MAXLINE];
char *hello = "Hello from client"; char *hello = "Hello from client";
struct sockaddr_in servaddr; struct sockaddr_in servaddr;
// Creating socket file descriptor // Creating socket file descriptor
if ( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) { if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
perror("socket creation failed"); perror("socket creation failed");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@ -33,14 +35,12 @@ int main() {
int n, len; int n, len;
sendto(sockfd, (const char *)hello, strlen(hello), sendto(sockfd, (const char *)hello, strlen(hello), MSG_CONFIRM,
MSG_CONFIRM, (const struct sockaddr *) &servaddr, (const struct sockaddr *)&servaddr, sizeof(servaddr));
sizeof(servaddr));
printf("Hello message sent.\n"); printf("Hello message sent.\n");
n = recvfrom(sockfd, (char *)buffer, MAXLINE, n = recvfrom(sockfd, (char *)buffer, MAXLINE, MSG_WAITALL,
MSG_WAITALL, (struct sockaddr *) &servaddr, (struct sockaddr *)&servaddr, &len);
&len);
buffer[n] = '\0'; buffer[n] = '\0';
printf("Server : %s\n", buffer); printf("Server : %s\n", buffer);

View File

@ -1,25 +1,27 @@
// Server side implementation of UDP client-server model // Server side implementation of UDP client-server model
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#define PORT 8080 #define PORT 8080
#define MAXLINE 1024 #define MAXLINE 1024
// Driver code // Driver code
int main() { int main()
{
int sockfd; int sockfd;
char buffer[MAXLINE]; char buffer[MAXLINE];
char *hello = "Hello from server"; char *hello = "Hello from server";
struct sockaddr_in servaddr, cliaddr; struct sockaddr_in servaddr, cliaddr;
// Creating socket file descriptor // Creating socket file descriptor
if ( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) { if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
perror("socket creation failed"); perror("socket creation failed");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@ -33,22 +35,19 @@ int main() {
servaddr.sin_port = htons(PORT); servaddr.sin_port = htons(PORT);
// Bind the socket with the server address // Bind the socket with the server address
if ( bind(sockfd, (const struct sockaddr *)&servaddr, if (bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
sizeof(servaddr)) < 0 )
{ {
perror("bind failed"); perror("bind failed");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
int len, n; int len, n;
n = recvfrom(sockfd, (char *)buffer, MAXLINE, n = recvfrom(sockfd, (char *)buffer, MAXLINE, MSG_WAITALL,
MSG_WAITALL, ( struct sockaddr *) &cliaddr, (struct sockaddr *)&cliaddr, &len);
&len);
buffer[n] = '\0'; buffer[n] = '\0';
printf("Client : %s\n", buffer); printf("Client : %s\n", buffer);
sendto(sockfd, (const char *)hello, strlen(hello), sendto(sockfd, (const char *)hello, strlen(hello), MSG_CONFIRM,
MSG_CONFIRM, (const struct sockaddr *) &cliaddr, (const struct sockaddr *)&cliaddr, len);
len);
printf("Hello message sent.\n"); printf("Hello message sent.\n");
return 0; return 0;

View File

@ -1,11 +1,11 @@
// Write CPP code here // Write CPP code here
#include <arpa/inet.h>
#include <netdb.h> #include <netdb.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h>
#include <string.h> #include <string.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <arpa/inet.h> #include <unistd.h>
#define MAX 80 #define MAX 80
#define PORT 8080 #define PORT 8080
#define SA struct sockaddr #define SA struct sockaddr

View File

@ -1,11 +1,11 @@
#include <netdb.h> #include <netdb.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/types.h> #include <sys/types.h>
#include <unistd.h>
#define MAX 80 #define MAX 80
#define PORT 8080 #define PORT 8080
#define SA struct sockaddr #define SA struct sockaddr
@ -16,7 +16,8 @@ void func(int sockfd)
char buff[MAX]; char buff[MAX];
int n; int n;
// infinite loop for chat // infinite loop for chat
for (;;) { for (;;)
{
bzero(buff, MAX); bzero(buff, MAX);
// read the message from client and copy it in buffer // read the message from client and copy it in buffer
@ -33,7 +34,8 @@ void func(int sockfd)
write(sockfd, buff, sizeof(buff)); write(sockfd, buff, sizeof(buff));
// if msg contains "Exit" then server exit and chat ended. // if msg contains "Exit" then server exit and chat ended.
if (strncmp("exit", buff, 4) == 0) { if (strncmp("exit", buff, 4) == 0)
{
printf("Server Exit...\n"); printf("Server Exit...\n");
break; break;
} }
@ -48,7 +50,8 @@ int main()
// socket create and verification // socket create and verification
sockfd = socket(AF_INET, SOCK_STREAM, 0); sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) { if (sockfd == -1)
{
printf("socket creation failed...\n"); printf("socket creation failed...\n");
exit(0); exit(0);
} }
@ -62,7 +65,8 @@ int main()
servaddr.sin_port = htons(PORT); servaddr.sin_port = htons(PORT);
// Binding newly created socket to given IP and verification // Binding newly created socket to given IP and verification
if ((bind(sockfd, (SA*)&servaddr, sizeof(servaddr))) != 0) { if ((bind(sockfd, (SA *)&servaddr, sizeof(servaddr))) != 0)
{
printf("socket bind failed...\n"); printf("socket bind failed...\n");
exit(0); exit(0);
} }
@ -70,7 +74,8 @@ int main()
printf("Socket successfully binded..\n"); printf("Socket successfully binded..\n");
// Now server is ready to listen and verification // Now server is ready to listen and verification
if ((listen(sockfd, 5)) != 0) { if ((listen(sockfd, 5)) != 0)
{
printf("Listen failed...\n"); printf("Listen failed...\n");
exit(0); exit(0);
} }
@ -80,7 +85,8 @@ int main()
// Accept the data packet from client and verification // Accept the data packet from client and verification
connfd = accept(sockfd, (SA *)&cli, &len); connfd = accept(sockfd, (SA *)&cli, &len);
if (connfd < 0) { if (connfd < 0)
{
printf("server acccept failed...\n"); printf("server acccept failed...\n");
exit(0); exit(0);
} }

View File

@ -5,20 +5,21 @@
#include <stdio.h> #include <stdio.h>
int main() { int main()
{
int remainder, number = 0, decimal_number = 0, temp = 1; int remainder, number = 0, decimal_number = 0, temp = 1;
printf("/n Enter any binary number= "); printf("/n Enter any binary number= ");
scanf("%d", &number); scanf("%d", &number);
// Iterate over the number until the end. // Iterate over the number until the end.
while(number > 0) { while (number > 0)
{
remainder = number % 10; remainder = number % 10;
number = number / 10; number = number / 10;
decimal_number += remainder * temp; decimal_number += remainder * temp;
temp = temp * 2; // used as power of 2 temp = temp * 2; // used as power of 2
} }
printf("%d\n", decimal_number); printf("%d\n", decimal_number);

View File

@ -25,10 +25,12 @@ int main(void)
while (binary_num > 0) while (binary_num > 0)
{ {
if(binary_num > 111) //Checking if binary number is greater than three digits if (binary_num >
111) // Checking if binary number is greater than three digits
td = three_digits(binary_num); td = three_digits(binary_num);
else td = binary_num; else
td = binary_num;
binary_num /= 1000; binary_num /= 1000;

View File

@ -44,7 +44,6 @@ int main()
bits[i] = re; bits[i] = re;
i++; i++;
} }
printf("\n the number in binary is: "); printf("\n the number in binary is: ");
@ -63,4 +62,3 @@ int main()
return 0; return 0;
} }

View File

@ -2,8 +2,8 @@
#include <stdio.h> #include <stdio.h>
void decimal2Hexadecimal(long num); void decimal2Hexadecimal(long num);
int main()
int main(){ {
long decimalnum; long decimalnum;
@ -15,8 +15,10 @@ int main(){
return 0; return 0;
} }
/********function for convert decimal number to hexadecimal number****************/ /********function for convert decimal number to hexadecimal
void decimal2Hexadecimal(long num){ * number****************/
void decimal2Hexadecimal(long num)
{
long decimalnum = num; long decimalnum = num;
long quotient, remainder; long quotient, remainder;
@ -25,7 +27,8 @@ char hexadecimalnum[100];
quotient = decimalnum; quotient = decimalnum;
while (quotient != 0){ while (quotient != 0)
{
remainder = quotient % 16; remainder = quotient % 16;
if (remainder < 10) if (remainder < 10)
@ -34,13 +37,15 @@ char hexadecimalnum[100];
else else
hexadecimalnum[j++] = 55 + remainder; hexadecimalnum[j++] = 55 + remainder;
quotient = quotient / 16;} quotient = quotient / 16;
}
// print the hexadecimal number // print the hexadecimal number
for (i = j; i >= 0; i--){ for (i = j; i >= 0; i--)
printf("%c", hexadecimalnum[i]);} {
printf("%c", hexadecimalnum[i]);
}
printf("\n"); printf("\n");
} }

View File

@ -2,7 +2,8 @@
#include <stdio.h> #include <stdio.h>
void decimal2Octal(long decimalnum); void decimal2Octal(long decimalnum);
int main(){ int main()
{
long decimalnum; long decimalnum;
@ -15,13 +16,15 @@ return 0;
} }
/********function for convert decimal numbers to octal numbers************/ /********function for convert decimal numbers to octal numbers************/
void decimal2Octal(long decimalnum){ void decimal2Octal(long decimalnum)
{
long remainder, quotient; long remainder, quotient;
int octalNumber[100], i = 1, j; int octalNumber[100], i = 1, j;
quotient = decimalnum; quotient = decimalnum;
while (quotient != 0){ while (quotient != 0)
{
octalNumber[i++] = quotient % 8; octalNumber[i++] = quotient % 8;
quotient = quotient / 8; quotient = quotient / 8;

View File

@ -2,15 +2,15 @@
#include <stdio.h> #include <stdio.h>
// Converts octal number to decimal // Converts octal number to decimal
int convertValue(int num, int i) { int convertValue(int num, int i) { return num * pow(8, i); }
return num * pow(8, i);
}
long long toDecimal(int octal_value) { long long toDecimal(int octal_value)
{
int decimal_value = 0, i = 0; int decimal_value = 0, i = 0;
while (octal_value) { while (octal_value)
{
// Extracts right-most digit and then multiplies by 8^i // Extracts right-most digit and then multiplies by 8^i
decimal_value += convertValue(octal_value % 10, i++); decimal_value += convertValue(octal_value % 10, i++);
@ -22,7 +22,8 @@ long long toDecimal(int octal_value) {
return decimal_value; return decimal_value;
} }
int main() { int main()
{
printf("Enter octal value: "); printf("Enter octal value: ");

View File

@ -2,10 +2,11 @@
* convert from any base to decimal * convert from any base to decimal
*/ */
#include <stdio.h>
#include <ctype.h> #include <ctype.h>
#include <stdio.h>
int main(void) { int main(void)
{
int base, i, j; int base, i, j;
char number[100]; char number[100];
unsigned long decimal = 0; unsigned long decimal = 0;
@ -15,7 +16,8 @@ int main(void) {
printf("Enter the number: "); printf("Enter the number: ");
scanf("%s", &number[0]); scanf("%s", &number[0]);
for (i = 0; number[i] != '\0'; i++) { for (i = 0; number[i] != '\0'; i++)
{
if (isdigit(number[i])) if (isdigit(number[i]))
number[i] -= '0'; number[i] -= '0';
else if (isupper(number[i])) else if (isupper(number[i]))
@ -25,13 +27,15 @@ int main(void) {
else else
number[i] = base + 1; number[i] = base + 1;
if (number[i] >= base){ if (number[i] >= base)
{
printf("invalid number\n"); printf("invalid number\n");
return 0; return 0;
} }
} }
for (j = 0; j < i; j++) { for (j = 0; j < i; j++)
{
decimal *= base; decimal *= base;
decimal += number[j]; decimal += number[j];
} }

View File

@ -26,10 +26,10 @@
*/ */
#include "CArray.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <time.h> #include <time.h>
#include "CArray.h"
void swap(CArray *array, int position1, int position2); void swap(CArray *array, int position1, int position2);
@ -39,7 +39,8 @@ CArray * getCArray(int size)
array->array = (int *)malloc(sizeof(int) * size); array->array = (int *)malloc(sizeof(int) * size);
array->size = size; array->size = size;
int i; int i;
for (i = 0; i < size; i++) { for (i = 0; i < size; i++)
{
array->array[i] = 0; array->array[i] = 0;
} }
return array; return array;
@ -47,23 +48,29 @@ CArray * getCArray(int size)
int insertValueCArray(CArray *array, int position, int value) int insertValueCArray(CArray *array, int position, int value)
{ {
if (position >= 0 && position < array->size) { if (position >= 0 && position < array->size)
if (array->array[position] == 0) { {
if (array->array[position] == 0)
{
array->array[position] = value; array->array[position] = value;
return SUCCESS; return SUCCESS;
} }
else return POSITION_INIT; else
return POSITION_INIT;
} }
return INVALID_POSITION; return INVALID_POSITION;
} }
int removeValueCArray(CArray *array, int position) int removeValueCArray(CArray *array, int position)
{ {
if (position >= 0 && position < array->size) { if (position >= 0 && position < array->size)
if (array->array[position] != 0) { {
if (array->array[position] != 0)
{
array->array[position] = 0; array->array[position] = 0;
} }
else return POSITION_EMPTY; else
return POSITION_EMPTY;
} }
return INVALID_POSITION; return INVALID_POSITION;
} }
@ -72,25 +79,31 @@ int pushValueCArray(CArray *array, int value)
{ {
int i; int i;
int ok = 0; int ok = 0;
for (i = 0; i < array->size; i++) { for (i = 0; i < array->size; i++)
if (array->array[i] == 0) { {
if (array->array[i] == 0)
{
array->array[i] = value; array->array[i] = value;
ok = 1; ok = 1;
break; break;
} }
} }
if (ok == 1) return SUCCESS; if (ok == 1)
else return ARRAY_FULL; return SUCCESS;
else
return ARRAY_FULL;
} }
int updateValueCArray(CArray *array, int position, int value) int updateValueCArray(CArray *array, int position, int value)
{ {
if (position >= 0 && position < array->size) { if (position >= 0 && position < array->size)
if (array->array[position] != 0) { {
if (array->array[position] != 0)
{
} }
else return POSITION_NOT_INIT; else
return POSITION_NOT_INIT;
} }
return INVALID_POSITION; return INVALID_POSITION;
} }
@ -98,7 +111,8 @@ int updateValueCArray(CArray *array, int position, int value)
int eraseCArray(CArray *array) int eraseCArray(CArray *array)
{ {
int i; int i;
for (i = 0; i < array->size; i++) { for (i = 0; i < array->size; i++)
{
array->array[i] = 0; array->array[i] = 0;
} }
return 0; return 0;
@ -106,8 +120,9 @@ int eraseCArray(CArray *array)
int switchValuesCArray(CArray *array, int position1, int position2) int switchValuesCArray(CArray *array, int position1, int position2)
{ {
if (position1 >= 0 && position1 < array->size if (position1 >= 0 && position1 < array->size && position2 >= 0 &&
&& position2 >= 0 && position2 < array->size) { position2 < array->size)
{
int temp = array->array[position1]; int temp = array->array[position1];
array->array[position1] = array->array[position2]; array->array[position1] = array->array[position2];
array->array[position2] = temp; array->array[position2] = temp;
@ -118,7 +133,8 @@ int switchValuesCArray(CArray *array, int position1, int position2)
int reverseCArray(CArray *array) int reverseCArray(CArray *array)
{ {
int i; int i;
for (i = 0; i < array->size / 2; i++) { for (i = 0; i < array->size / 2; i++)
{
swap(array, i, array->size - i - 1); swap(array, i, array->size - i - 1);
} }
return SUCCESS; return SUCCESS;
@ -128,7 +144,8 @@ int displayCArray(CArray *array)
{ {
int i; int i;
printf("\nC ARRAY\n"); printf("\nC ARRAY\n");
for (i = 0; i < array->size; i++) { for (i = 0; i < array->size; i++)
{
printf("%d ", array->array[i]); printf("%d ", array->array[i]);
} }
printf("\n"); printf("\n");
@ -140,7 +157,8 @@ int blenderCArray(CArray *array)
srand(time(NULL) * array->size); srand(time(NULL) * array->size);
int i; int i;
int total = array->size * 100; int total = array->size * 100;
for (i = 0; i < total; i++) { for (i = 0; i < total; i++)
{
swap(array, rand() % array->size, rand() % array->size); swap(array, rand() % array->size, rand() % array->size);
} }
return 0; return 0;
@ -152,7 +170,8 @@ CArray * getCopyCArray(CArray *arr)
array->array = (int *)malloc(sizeof(int) * arr->size); array->array = (int *)malloc(sizeof(int) * arr->size);
array->size = arr->size; array->size = arr->size;
int i; int i;
for (i = 0; i < arr->size; i++) { for (i = 0; i < arr->size; i++)
{
array->array[i] = arr->array[i]; array->array[i] = arr->array[i];
} }
return array; return array;
@ -168,9 +187,12 @@ void swap(CArray *array, int position1, int position2)
int bubbleSortCArray(CArray *array) int bubbleSortCArray(CArray *array)
{ {
int i, j; int i, j;
for (i = 0; i < array->size - 1; i++) { for (i = 0; i < array->size - 1; i++)
for (j = 0; j < array->size - i - 1; j++) { {
if (array->array[j] > array->array[j + 1]) { for (j = 0; j < array->size - i - 1; j++)
{
if (array->array[j] > array->array[j + 1])
{
swap(array, j, j + 1); swap(array, j, j + 1);
} }
} }
@ -181,10 +203,12 @@ int bubbleSortCArray(CArray *array)
int selectionSortCArray(CArray *array) int selectionSortCArray(CArray *array)
{ {
int i, j, min; int i, j, min;
for (i = 0; i < array->size - 1; i++) { for (i = 0; i < array->size - 1; i++)
{
min = i; min = i;
for (j = i + 1; j < array->size; j++) for (j = i + 1; j < array->size; j++)
if (array->array[j] < array->array[min]) min = j; if (array->array[j] < array->array[min])
min = j;
swap(array, min, i); swap(array, min, i);
} }
return 0; return 0;
@ -193,7 +217,8 @@ int selectionSortCArray(CArray *array)
int insertionSortCArray(CArray *array) int insertionSortCArray(CArray *array)
{ {
int i, j, num; int i, j, num;
for (i = 1; i < array->size; i++) { for (i = 1; i < array->size; i++)
{
num = array->array[i]; num = array->array[i];
j = i - 1; j = i - 1;
while (j >= 0 && array->array[j] > num) while (j >= 0 && array->array[j] > num)
@ -209,8 +234,10 @@ int insertionSortCArray(CArray *array)
int valueOcurranceCArray(CArray *array, int value) int valueOcurranceCArray(CArray *array, int value)
{ {
int i, total = 0; int i, total = 0;
for (i = 0; i < array->size; i++) { for (i = 0; i < array->size; i++)
if (array->array[i] == value) total++; {
if (array->array[i] == value)
total++;
} }
return total; return total;
} }
@ -220,8 +247,10 @@ CArray * valuePositionsCArray(CArray *array, int value)
int i, j = 0; int i, j = 0;
int total = valueOcurranceCArray(array, value); int total = valueOcurranceCArray(array, value);
CArray *resultArray = getCArray(total); CArray *resultArray = getCArray(total);
for (i = 0; i < array->size; i++) { for (i = 0; i < array->size; i++)
if (array->array[i] == value) { {
if (array->array[i] == value)
{
// Hopefully this won't overflow // Hopefully this won't overflow
resultArray->array[j] = i; resultArray->array[j] = i;
j++; j++;
@ -234,8 +263,10 @@ int findMinCArray(CArray *array)
{ {
int i; int i;
int min = array->array[0]; int min = array->array[0];
for (i = 1; i < array->size; i++) { for (i = 1; i < array->size; i++)
if (array->array[i] < min) { {
if (array->array[i] < min)
{
min = array->array[i]; min = array->array[i];
} }
} }
@ -246,8 +277,10 @@ int findMaxCArray(CArray *array)
{ {
int i; int i;
int max = array->array[0]; int max = array->array[0];
for (i = 1; i < array->size; i++) { for (i = 1; i < array->size; i++)
if (array->array[i] > max) { {
if (array->array[i] > max)
{
max = array->array[i]; max = array->array[i];
} }
} }

View File

@ -16,7 +16,8 @@
#pragma once #pragma once
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C"
{
#endif #endif
#define ARRAY_ERASED -1 #define ARRAY_ERASED -1
@ -27,7 +28,8 @@ extern "C" {
#define POSITION_EMPTY 4 #define POSITION_EMPTY 4
#define ARRAY_FULL 5 #define ARRAY_FULL 5
typedef struct CArray { typedef struct CArray
{
int *array; int *array;
int size; int size;
} CArray; } CArray;
@ -78,7 +80,6 @@ extern "C" {
// +-------------------------------------+ // +-------------------------------------+
int displayCArray(CArray *array); int displayCArray(CArray *array);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -13,10 +13,10 @@
* *
*/ */
#include "CArray.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <time.h> #include <time.h>
#include "CArray.h"
int CArrayTests() int CArrayTests()
{ {
@ -31,14 +31,16 @@ int CArrayTests()
CArray *array = getCArray(10); CArray *array = getCArray(10);
int i; int i;
for (i = 0; i < array->size; i++) { for (i = 0; i < array->size; i++)
{
insertValueCArray(array, i, i + 1); insertValueCArray(array, i, i + 1);
} }
printf("Entered array is:\n"); printf("Entered array is:\n");
displayCArray(array); displayCArray(array);
printf("\nCode: %d\n", pushValueCArray(array, 11)); // 5 printf("\nCode: %d\n", pushValueCArray(array, 11)); // 5
for (i = 0; i < array->size; i++) { for (i = 0; i < array->size; i++)
{
removeValueCArray(array, i); removeValueCArray(array, i);
} }
@ -48,7 +50,8 @@ int CArrayTests()
printf("\nCode: %d\n", insertValueCArray(array, -1, 1)); // 1 printf("\nCode: %d\n", insertValueCArray(array, -1, 1)); // 1
// Erase // Erase
for (i = 0; i < array->size; i++) { for (i = 0; i < array->size; i++)
{
insertValueCArray(array, i, i + 1); insertValueCArray(array, i, i + 1);
} }
eraseCArray(array); eraseCArray(array);
@ -56,11 +59,13 @@ int CArrayTests()
// Switching // Switching
CArray *arr = getCArray(13); CArray *arr = getCArray(13);
for (i = 0; i < arr->size; i++) { for (i = 0; i < arr->size; i++)
{
insertValueCArray(arr, i, i + 1); insertValueCArray(arr, i, i + 1);
} }
displayCArray(arr); displayCArray(arr);
for (i = 0; i < arr->size / 2; i++) { for (i = 0; i < arr->size / 2; i++)
{
switchValuesCArray(arr, i, arr->size - i - 1); switchValuesCArray(arr, i, arr->size - i - 1);
} }
@ -74,7 +79,8 @@ int CArrayTests()
// Sorting // Sorting
srand(time(NULL)); srand(time(NULL));
CArray *barray = getCArray(20); CArray *barray = getCArray(20);
for (i = 0; i < barray->size; i++) { for (i = 0; i < barray->size; i++)
{
insertValueCArray(barray, i, rand()); insertValueCArray(barray, i, rand());
} }
CArray *carray = getCopyCArray(barray); CArray *carray = getCopyCArray(barray);
@ -120,7 +126,8 @@ int CArrayTests()
// Searching // Searching
CArray *aarray = getCArray(1000); CArray *aarray = getCArray(1000);
for (i = 0; i < aarray->size; i++) { for (i = 0; i < aarray->size; i++)
{
insertValueCArray(aarray, i, rand() % 100); insertValueCArray(aarray, i, rand() % 100);
} }
@ -132,9 +139,10 @@ int CArrayTests()
displayCArray(positions); displayCArray(positions);
// This should all give value of j // This should all give value of j
printf("\nAll %d s", j); printf("\nAll %d s", j);
for (i = 0; i < positions->size; i++) { for (i = 0; i < positions->size; i++)
printf("\nPosition %d has a value of %d", {
positions->array[i], aarray->array[positions->array[i]]); printf("\nPosition %d has a value of %d", positions->array[i],
aarray->array[positions->array[i]]);
} }
printf("\nThe list has a minimum value of %d and a maximum value of %d", printf("\nThe list has a minimum value of %d and a maximum value of %d",
findMinCArray(aarray), findMaxCArray(aarray)); findMinCArray(aarray), findMaxCArray(aarray));

View File

@ -10,10 +10,7 @@ struct AVLnode
}; };
typedef struct AVLnode avlNode; typedef struct AVLnode avlNode;
int max(int a, int b) int max(int a, int b) { return (a > b) ? a : b; }
{
return (a > b)? a : b;
}
avlNode *newNode(int key) avlNode *newNode(int key)
{ {
@ -127,14 +124,15 @@ avlNode *insert(avlNode *node, int key)
/*Binary Search Tree insertion*/ /*Binary Search Tree insertion*/
if (key < node->key) if (key < node->key)
node->left = insert(node->left, key); /*Recursive insertion in L subtree*/ node->left =
insert(node->left, key); /*Recursive insertion in L subtree*/
else if (key > node->key) else if (key > node->key)
node->right = insert(node->right, key); /*Recursive insertion in R subtree*/ node->right =
insert(node->right, key); /*Recursive insertion in R subtree*/
/* Node Height as per the AVL formula*/ /* Node Height as per the AVL formula*/
node->height = (max(nodeHeight(node->left), nodeHeight(node->right)) + 1); node->height = (max(nodeHeight(node->left), nodeHeight(node->right)) + 1);
/*Checking for the balance condition*/ /*Checking for the balance condition*/
int balance = heightDiff(node); int balance = heightDiff(node);
@ -159,7 +157,6 @@ avlNode *insert(avlNode *node, int key)
} }
return node; return node;
} }
avlNode *delete (avlNode *node, int queryNum) avlNode *delete (avlNode *node, int queryNum)
@ -168,17 +165,17 @@ avlNode *delete(avlNode *node, int queryNum)
return node; return node;
if (queryNum < node->key) if (queryNum < node->key)
node->left = delete(node->left, queryNum); /*Recursive deletion in L subtree*/ node->left =
delete (node->left, queryNum); /*Recursive deletion in L subtree*/
else if (queryNum > node->key) else if (queryNum > node->key)
node->right = delete(node->right, queryNum); /*Recursive deletion in R subtree*/ node->right =
delete (node->right, queryNum); /*Recursive deletion in R subtree*/
else else
{ {
/*Single or No Child*/ /*Single or No Child*/
if ((node->left == NULL) || (node->right == NULL)) if ((node->left == NULL) || (node->right == NULL))
{ {
avlNode *temp = node->left ? avlNode *temp = node->left ? node->left : node->right;
node->left :
node->right;
/* No Child*/ /* No Child*/
if (temp == NULL) if (temp == NULL)
@ -198,7 +195,9 @@ avlNode *delete(avlNode *node, int queryNum)
/*Get the smallest key in the R subtree*/ /*Get the smallest key in the R subtree*/
avlNode *temp = minNode(node->right); avlNode *temp = minNode(node->right);
node->key = temp->key; /*Copy that to the root*/ node->key = temp->key; /*Copy that to the root*/
node->right = delete(node->right, temp->key); /*Delete the smallest in the R subtree.*/ node->right =
delete (node->right,
temp->key); /*Delete the smallest in the R subtree.*/
} }
} }
@ -206,7 +205,6 @@ avlNode *delete(avlNode *node, int queryNum)
if (node == NULL) if (node == NULL)
return node; return node;
/*Update height*/ /*Update height*/
node->height = (max(nodeHeight(node->left), nodeHeight(node->right)) + 1); node->height = (max(nodeHeight(node->left), nodeHeight(node->right)) + 1);
@ -233,7 +231,6 @@ avlNode *delete(avlNode *node, int queryNum)
} }
return node; return node;
} }
avlNode *findNode(avlNode *node, int queryNum) avlNode *findNode(avlNode *node, int queryNum)
@ -367,12 +364,12 @@ int main()
tempNode = findNode(root, queryNum); tempNode = findNode(root, queryNum);
if (tempNode == NULL) if (tempNode == NULL)
printf("\n\t %d : Not Found\n", queryNum); printf("\n\t %d : Not Found\n", queryNum);
else else
{ {
printf("\n\t %d : Found at height %d \n", queryNum, tempNode->height); printf("\n\t %d : Found at height %d \n", queryNum,
tempNode->height);
printf("\n\tPrinting AVL Tree\n"); printf("\n\tPrinting AVL Tree\n");
printAVL(root, 1); printAVL(root, 1);
@ -420,12 +417,8 @@ int main()
printf("\n\t\tExiting, Thank You !!\n"); printf("\n\t\tExiting, Thank You !!\n");
break; break;
} }
} }
} }
return 0; return 0;
} }

View File

@ -1,7 +1,8 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
/* A basic unbalanced binary search tree implementation in C, with the following functionalities implemented: /* A basic unbalanced binary search tree implementation in C, with the following
functionalities implemented:
- Insertion - Insertion
- Deletion - Deletion
- Search by key value - Search by key value
@ -9,7 +10,8 @@
*/ */
// Node, the basic data structure in the tree // Node, the basic data structure in the tree
typedef struct node{ typedef struct node
{
// left child // left child
struct node *left; struct node *left;
@ -21,8 +23,10 @@ typedef struct node{
int data; int data;
} node; } node;
// The node constructor, which receives the key value input and returns a node pointer // The node constructor, which receives the key value input and returns a node
node* newNode(int data){ // pointer
node *newNode(int data)
{
// creates a slug // creates a slug
node *tmp = (node *)malloc(sizeof(node)); node *tmp = (node *)malloc(sizeof(node));
@ -36,14 +40,17 @@ node* newNode(int data){
} }
// Insertion procedure, which inserts the input key in a new node in the tree // Insertion procedure, which inserts the input key in a new node in the tree
node* insert(node* root, int data){ node *insert(node *root, int data)
{
// If the root of the subtree is null, insert key here // If the root of the subtree is null, insert key here
if (root == NULL) if (root == NULL)
root = newNode(data); root = newNode(data);
// If it isn't null and the input key is greater than the root key, insert in the right leaf // If it isn't null and the input key is greater than the root key, insert
// in the right leaf
else if (data > root->data) else if (data > root->data)
root->right = insert(root->right, data); root->right = insert(root->right, data);
// If it isn't null and the input key is lower than the root key, insert in the left leaf // If it isn't null and the input key is lower than the root key, insert in
// the left leaf
else if (data < root->data) else if (data < root->data)
root->left = insert(root->left, data); root->left = insert(root->left, data);
// Returns the modified tree // Returns the modified tree
@ -51,7 +58,8 @@ node* insert(node* root, int data){
} }
// Utilitary procedure to find the greatest key in the left subtree // Utilitary procedure to find the greatest key in the left subtree
node* getMax(node* root){ node *getMax(node *root)
{
// If there's no leaf to the right, then this is the maximum key value // If there's no leaf to the right, then this is the maximum key value
if (root->right == NULL) if (root->right == NULL)
return root; return root;
@ -59,8 +67,10 @@ node* getMax(node* root){
root->right = getMax(root->right); root->right = getMax(root->right);
} }
// Deletion procedure, which searches for the input key in the tree and removes it if present // Deletion procedure, which searches for the input key in the tree and removes
node* delete(node* root, int data){ // it if present
node *delete (node *root, int data)
{
// If the root is null, nothing to be done // If the root is null, nothing to be done
if (root == NULL) if (root == NULL)
return root; return root;
@ -72,32 +82,40 @@ node* delete(node* root, int data){
root->left = delete (root->left, data); root->left = delete (root->left, data);
// If the input key matches the root's, check the following cases // If the input key matches the root's, check the following cases
// termination condition // termination condition
else if (data == root->data){ else if (data == root->data)
{
// Case 1: the root has no leaves, remove the node // Case 1: the root has no leaves, remove the node
if ((root->left == NULL) && (root->right == NULL)){ if ((root->left == NULL) && (root->right == NULL))
{
free(root); free(root);
return NULL; return NULL;
} }
// Case 2: the root has one leaf, make the leaf the new root and remove the old root // Case 2: the root has one leaf, make the leaf the new root and remove
else if (root->left == NULL){ // the old root
else if (root->left == NULL)
{
node *tmp = root; node *tmp = root;
root = root->right; root = root->right;
free(tmp); free(tmp);
return root; return root;
} }
else if (root->right == NULL){ else if (root->right == NULL)
{
node *tmp = root; node *tmp = root;
root = root->left; root = root->left;
free(tmp); free(tmp);
return root; return root;
} }
// Case 3: the root has 2 leaves, find the greatest key in the left subtree and switch with the root's // Case 3: the root has 2 leaves, find the greatest key in the left
else { // subtree and switch with the root's
else
{
// finds the biggest node in the left branch. // finds the biggest node in the left branch.
node *tmp = getMax(root->left); node *tmp = getMax(root->left);
// sets the data of this node equal to the data of the biggest node (lefts) // sets the data of this node equal to the data of the biggest node
// (lefts)
root->data = tmp->data; root->data = tmp->data;
root->left = delete (root->left, tmp->data); root->left = delete (root->left, tmp->data);
} }
@ -105,8 +123,10 @@ node* delete(node* root, int data){
return root; return root;
} }
// Search procedure, which looks for the input key in the tree and returns 1 if it's present or 0 if it's not in the tree // Search procedure, which looks for the input key in the tree and returns 1 if
int find(node* root, int data){ // it's present or 0 if it's not in the tree
int find(node *root, int data)
{
// If the root is null, the key's not present // If the root is null, the key's not present
if (root == NULL) if (root == NULL)
return 0; return 0;
@ -122,16 +142,20 @@ int find(node* root, int data){
} }
// Utilitary procedure to measure the height of the binary tree // Utilitary procedure to measure the height of the binary tree
int height(node* root){ int height(node *root)
{
// If the root is null, this is the bottom of the tree (height 0) // If the root is null, this is the bottom of the tree (height 0)
if (root == NULL) if (root == NULL)
return 0; return 0;
else{ else
// Get the height from both left and right subtrees to check which is the greatest {
// Get the height from both left and right subtrees to check which is
// the greatest
int right_h = height(root->right); int right_h = height(root->right);
int left_h = height(root->left); int left_h = height(root->left);
// The final height is the height of the greatest subtree(left or right) plus 1(which is the root's level) // The final height is the height of the greatest subtree(left or right)
// plus 1(which is the root's level)
if (right_h > left_h) if (right_h > left_h)
return (right_h + 1); return (right_h + 1);
else else
@ -140,8 +164,10 @@ int height(node* root){
} }
// Utilitary procedure to free all nodes in a tree // Utilitary procedure to free all nodes in a tree
void purge(node* root){ void purge(node *root)
if (root != NULL){ {
if (root != NULL)
{
if (root->left != NULL) if (root->left != NULL)
purge(root->left); purge(root->left);
if (root->right != NULL) if (root->right != NULL)
@ -150,16 +176,20 @@ void purge(node* root){
} }
} }
// Traversal procedure to list the current keys in the tree in order of value (from the left to the right) // Traversal procedure to list the current keys in the tree in order of value
void inOrder(node* root){ // (from the left to the right)
if(root != NULL){ void inOrder(node *root)
{
if (root != NULL)
{
inOrder(root->left); inOrder(root->left);
printf("\t[ %d ]\t", root->data); printf("\t[ %d ]\t", root->data);
inOrder(root->right); inOrder(root->right);
} }
} }
void main(){ void main()
{
// this reference don't change. // this reference don't change.
// only the tree changes. // only the tree changes.
@ -168,19 +198,25 @@ void main(){
int data = 0; int data = 0;
// event-loop. // event-loop.
while (opt != 0){ while (opt != 0)
printf("\n\n[1] Insert Node\n[2] Delete Node\n[3] Find a Node\n[4] Get current Height\n[5] Print Tree in Crescent Order\n[0] Quit\n"); {
printf("\n\n[1] Insert Node\n[2] Delete Node\n[3] Find a Node\n[4] Get "
"current Height\n[5] Print Tree in Crescent Order\n[0] Quit\n");
scanf("%d", &opt); // reads the choice of the user scanf("%d", &opt); // reads the choice of the user
// processes the choice // processes the choice
switch(opt){ switch (opt)
case 1: printf("Enter the new node's value:\n"); {
case 1:
printf("Enter the new node's value:\n");
scanf("%d", &data); scanf("%d", &data);
root = insert(root, data); root = insert(root, data);
break; break;
case 2: printf("Enter the value to be removed:\n"); case 2:
if (root != NULL){ printf("Enter the value to be removed:\n");
if (root != NULL)
{
scanf("%d", &data); scanf("%d", &data);
root = delete (root, data); root = delete (root, data);
} }
@ -188,15 +224,19 @@ void main(){
printf("Tree is already empty!\n"); printf("Tree is already empty!\n");
break; break;
case 3: printf("Enter the searched value:\n"); case 3:
printf("Enter the searched value:\n");
scanf("%d", &data); scanf("%d", &data);
find(root,data) ? printf("The value is in the tree.\n") : printf("The value is not in the tree.\n"); find(root, data) ? printf("The value is in the tree.\n")
: printf("The value is not in the tree.\n");
break; break;
case 4: printf("Current height of the tree is: %d\n", height(root)); case 4:
printf("Current height of the tree is: %d\n", height(root));
break; break;
case 5: inOrder(root); case 5:
inOrder(root);
break; break;
} }
} }

View File

@ -1,8 +1,9 @@
#include <math.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <math.h>
typedef struct node{ typedef struct node
{
int val; int val;
struct node *par; struct node *par;
struct node *left; struct node *left;
@ -11,7 +12,8 @@ typedef struct node{
} Node; } Node;
// Create a new node // Create a new node
Node* newNode(int val, Node* par){ Node *newNode(int val, Node *par)
{
Node *create = (Node *)(malloc(sizeof(Node))); Node *create = (Node *)(malloc(sizeof(Node)));
create->val = val; create->val = val;
create->par = par; create->par = par;
@ -21,30 +23,37 @@ Node* newNode(int val, Node* par){
} }
// Check if the node is the leaf // Check if the node is the leaf
int isLeaf(Node* n){ int isLeaf(Node *n)
if(n->left == NULL && n->right == NULL){ {
if (n->left == NULL && n->right == NULL)
{
return 1; return 1;
} }
return 0; return 0;
} }
// Left Rotate // Left Rotate
Node* leftRotate(Node* node){ Node *leftRotate(Node *node)
{
Node *parent = node->par; Node *parent = node->par;
Node *grandParent = parent->par; Node *grandParent = parent->par;
parent->right = node->left; parent->right = node->left;
if(node->left != NULL){ if (node->left != NULL)
{
node->left->par = parent; node->left->par = parent;
} }
node->par = grandParent; node->par = grandParent;
parent->par = node; parent->par = node;
node->left = parent; node->left = parent;
if(grandParent != NULL){ if (grandParent != NULL)
if(grandParent->right == parent){ {
if (grandParent->right == parent)
{
grandParent->right = node; grandParent->right = node;
} }
else{ else
{
grandParent->left = node; grandParent->left = node;
} }
} }
@ -52,39 +61,46 @@ Node* leftRotate(Node* node){
} }
// Right Rotate // Right Rotate
Node* rightRotate(Node* node){ Node *rightRotate(Node *node)
{
Node *parent = node->par; Node *parent = node->par;
Node *grandParent = parent->par; Node *grandParent = parent->par;
parent->left = node->right; parent->left = node->right;
if(node->right != NULL){ if (node->right != NULL)
{
node->right->par = parent; node->right->par = parent;
} }
node->par = grandParent; node->par = grandParent;
parent->par = node; parent->par = node;
node->right = parent; node->right = parent;
if(grandParent != NULL){ if (grandParent != NULL)
if(grandParent->right == parent){ {
if (grandParent->right == parent)
{
grandParent->right = node; grandParent->right = node;
} }
else{ else
{
grandParent->left = node; grandParent->left = node;
} }
} }
return node; return node;
} }
// Check the node after the insertion step // Check the node after the insertion step
void checkNode(Node* node){ void checkNode(Node *node)
{
// If the node is the root // If the node is the root
if(node == NULL || node->par == NULL){ if (node == NULL || node->par == NULL)
{
return; return;
} }
Node *child = node; Node *child = node;
// If it is a black node or its parent is a black node // If it is a black node or its parent is a black node
if(node->color == 0 || (node->par)->color == 0){ if (node->color == 0 || (node->par)->color == 0)
{
// Dont Do Anything // Dont Do Anything
return; return;
} }
@ -96,29 +112,35 @@ void checkNode(Node* node){
// If grandParent is NULL, then parent is the root. // If grandParent is NULL, then parent is the root.
// Just make the root black. // Just make the root black.
if(grandParent == NULL){ if (grandParent == NULL)
{
parent->color = 0; parent->color = 0;
return; return;
} }
// If both the children of the grandParent are red // If both the children of the grandParent are red
if(grandParent->right != NULL && (grandParent->right)->color == 1 && grandParent->left != NULL && (grandParent->left)->color == 1){ if (grandParent->right != NULL && (grandParent->right)->color == 1 &&
grandParent->left != NULL && (grandParent->left)->color == 1)
{
// Make the grandParent red and both of its children black // Make the grandParent red and both of its children black
(grandParent->right)->color = 0; (grandParent->right)->color = 0;
(grandParent->left)->color = 0; (grandParent->left)->color = 0;
grandParent->color = 1; grandParent->color = 1;
return; return;
} }
else{ else
{
// The only option left is rotation. // The only option left is rotation.
Node *greatGrandParent = grandParent->par; Node *greatGrandParent = grandParent->par;
// Right Case // Right Case
if(grandParent->right == parent){ if (grandParent->right == parent)
{
// Right Right Case // Right Right Case
if(parent->right == node){ if (parent->right == node)
{
grandParent->right = parent->left; grandParent->right = parent->left;
if(parent->left != NULL){ if (parent->left != NULL)
{
(parent->left)->par = grandParent; (parent->left)->par = grandParent;
} }
parent->left = grandParent; parent->left = grandParent;
@ -126,11 +148,15 @@ void checkNode(Node* node){
// Attach to existing Tree; // Attach to existing Tree;
parent->par = greatGrandParent; parent->par = greatGrandParent;
if(greatGrandParent != NULL){ if (greatGrandParent != NULL)
if(greatGrandParent->left != NULL && greatGrandParent->left == grandParent){ {
if (greatGrandParent->left != NULL &&
greatGrandParent->left == grandParent)
{
greatGrandParent->left = parent; greatGrandParent->left = parent;
} }
else{ else
{
greatGrandParent->right = parent; greatGrandParent->right = parent;
} }
} }
@ -139,10 +165,12 @@ void checkNode(Node* node){
parent->color = 0; parent->color = 0;
grandParent->color = 1; grandParent->color = 1;
} }
else{ // Right Left Case else
{ // Right Left Case
// First step -> Parent Child Rotation // First step -> Parent Child Rotation
parent->left = child->right; parent->left = child->right;
if(child->right != NULL){ if (child->right != NULL)
{
(child->right)->par = parent; (child->right)->par = parent;
} }
child->right = parent; child->right = parent;
@ -150,7 +178,8 @@ void checkNode(Node* node){
// Second step -> Child and GrandParent Rotation // Second step -> Child and GrandParent Rotation
grandParent->right = child->left; grandParent->right = child->left;
if(child->left != NULL){ if (child->left != NULL)
{
(child->left)->par = grandParent; (child->left)->par = grandParent;
} }
child->left = grandParent; child->left = grandParent;
@ -158,11 +187,15 @@ void checkNode(Node* node){
// Attach to the existing tree // Attach to the existing tree
child->par = greatGrandParent; child->par = greatGrandParent;
if(greatGrandParent != NULL){ if (greatGrandParent != NULL)
if(greatGrandParent->left != NULL && greatGrandParent->left == grandParent){ {
if (greatGrandParent->left != NULL &&
greatGrandParent->left == grandParent)
{
greatGrandParent->left = child; greatGrandParent->left = child;
} }
else{ else
{
greatGrandParent->right = child; greatGrandParent->right = child;
} }
} }
@ -172,11 +205,14 @@ void checkNode(Node* node){
grandParent->color = 1; grandParent->color = 1;
} }
} }
else{ // Left Case else
{ // Left Case
// Left Left Case // Left Left Case
if(parent->left == node){ if (parent->left == node)
{
grandParent->left = parent->right; grandParent->left = parent->right;
if(parent->right != NULL){ if (parent->right != NULL)
{
(parent->right)->par = grandParent; (parent->right)->par = grandParent;
} }
parent->right = grandParent; parent->right = grandParent;
@ -184,11 +220,15 @@ void checkNode(Node* node){
// Attach to existing Tree; // Attach to existing Tree;
parent->par = greatGrandParent; parent->par = greatGrandParent;
if(greatGrandParent != NULL){ if (greatGrandParent != NULL)
if(greatGrandParent->left != NULL && greatGrandParent->left == grandParent){ {
if (greatGrandParent->left != NULL &&
greatGrandParent->left == grandParent)
{
greatGrandParent->left = parent; greatGrandParent->left = parent;
} }
else{ else
{
greatGrandParent->right = parent; greatGrandParent->right = parent;
} }
} }
@ -197,11 +237,13 @@ void checkNode(Node* node){
parent->color = 0; parent->color = 0;
grandParent->color = 1; grandParent->color = 1;
} }
else{ //Left Right Case else
{ // Left Right Case
// First step -> Parent Child Rotation // First step -> Parent Child Rotation
parent->right = child->left; parent->right = child->left;
if(child->left != NULL){ if (child->left != NULL)
{
(child->left)->par = parent; (child->left)->par = parent;
} }
child->left = parent; child->left = parent;
@ -209,7 +251,8 @@ void checkNode(Node* node){
// Second step -> Child and GrandParent Rotation // Second step -> Child and GrandParent Rotation
grandParent->left = child->right; grandParent->left = child->right;
if(child->right != NULL){ if (child->right != NULL)
{
(child->right)->par = grandParent; (child->right)->par = grandParent;
} }
child->right = grandParent; child->right = grandParent;
@ -217,11 +260,15 @@ void checkNode(Node* node){
// Attach to the existing tree // Attach to the existing tree
child->par = greatGrandParent; child->par = greatGrandParent;
if(greatGrandParent != NULL){ if (greatGrandParent != NULL)
if(greatGrandParent->left != NULL && greatGrandParent->left == grandParent){ {
if (greatGrandParent->left != NULL &&
greatGrandParent->left == grandParent)
{
greatGrandParent->left = child; greatGrandParent->left = child;
} }
else{ else
{
greatGrandParent->right = child; greatGrandParent->right = child;
} }
} }
@ -235,15 +282,20 @@ void checkNode(Node* node){
} }
// To insert a node in the existing tree // To insert a node in the existing tree
void insertNode(int val, Node** root){ void insertNode(int val, Node **root)
{
Node *buffRoot = *root; Node *buffRoot = *root;
while(buffRoot){ while (buffRoot)
if(buffRoot->val > val){ {
if (buffRoot->val > val)
{
// Go left // Go left
if(buffRoot->left != NULL){ if (buffRoot->left != NULL)
{
buffRoot = buffRoot->left; buffRoot = buffRoot->left;
} }
else{ else
{
// Insert The Node // Insert The Node
Node *toInsert = newNode(val, buffRoot); Node *toInsert = newNode(val, buffRoot);
buffRoot->left = toInsert; buffRoot->left = toInsert;
@ -253,13 +305,16 @@ void insertNode(int val, Node** root){
break; break;
} }
} }
else{ else
{
// Go right // Go right
if(buffRoot->right != NULL){ if (buffRoot->right != NULL)
{
buffRoot = buffRoot->right; buffRoot = buffRoot->right;
} }
else{ else
{
// Insert The Node // Insert The Node
Node *toInsert = newNode(val, buffRoot); Node *toInsert = newNode(val, buffRoot);
buffRoot->right = toInsert; buffRoot->right = toInsert;
@ -271,35 +326,44 @@ void insertNode(int val, Node** root){
} }
} }
while (buffRoot != *root)
while(buffRoot != *root){ {
checkNode(buffRoot); checkNode(buffRoot);
if(buffRoot->par == NULL){ if (buffRoot->par == NULL)
{
*root = buffRoot; *root = buffRoot;
break; break;
} }
buffRoot = buffRoot->par; buffRoot = buffRoot->par;
if(buffRoot == *root){ if (buffRoot == *root)
{
buffRoot->color = 0; buffRoot->color = 0;
} }
} }
} }
void checkForCase2(Node* toDelete, int delete, int fromDirection, Node** root){ void checkForCase2(Node *toDelete, int delete, int fromDirection, Node **root)
{
if(toDelete == (*root)){ if (toDelete == (*root))
{
(*root)->color = 0; (*root)->color = 0;
return; return;
} }
if(!delete && toDelete->color == 1){ if (!delete &&toDelete->color == 1)
if(!fromDirection){ {
if(toDelete->right != NULL){ if (!fromDirection)
{
if (toDelete->right != NULL)
{
toDelete->right->color = 1; toDelete->right->color = 1;
} }
} }
else{ else
if(toDelete->left != NULL){ {
if (toDelete->left != NULL)
{
toDelete->left->color = 1; toDelete->left->color = 1;
} }
} }
@ -307,25 +371,30 @@ void checkForCase2(Node* toDelete, int delete, int fromDirection, Node** root){
return; return;
} }
// Get the sibling for further inspection // Get the sibling for further inspection
Node *sibling; Node *sibling;
Node *parent = toDelete->par; Node *parent = toDelete->par;
int locateChild = 0; // 0 if toDeleted is left of its parent else 1 int locateChild = 0; // 0 if toDeleted is left of its parent else 1
if(parent->right == toDelete){ if (parent->right == toDelete)
{
sibling = parent->left; sibling = parent->left;
locateChild = 1; locateChild = 1;
} }
else{ else
{
sibling = parent->right; sibling = parent->right;
} }
// Case 2.1. i.e. if the any children of the sibling is red // Case 2.1. i.e. if the any children of the sibling is red
if((sibling->right != NULL && sibling->right->color == 1) || (sibling->left != NULL && sibling->left->color == 1)){ if ((sibling->right != NULL && sibling->right->color == 1) ||
if(sibling->right != NULL && sibling->right->color == 1){ (sibling->left != NULL && sibling->left->color == 1))
{
if (sibling->right != NULL && sibling->right->color == 1)
{
// Sibling is left and child is right. i.e. LEFT RIGHT ROTATION // Sibling is left and child is right. i.e. LEFT RIGHT ROTATION
if(locateChild == 1){ if (locateChild == 1)
{
int parColor = parent->color; int parColor = parent->color;
@ -336,7 +405,8 @@ void checkForCase2(Node* toDelete, int delete, int fromDirection, Node** root){
parent = rightRotate(sibling); parent = rightRotate(sibling);
// Check if the root is rotated // Check if the root is rotated
if(parent->par == NULL){ if (parent->par == NULL)
{
*root = parent; *root = parent;
} }
@ -346,16 +416,19 @@ void checkForCase2(Node* toDelete, int delete, int fromDirection, Node** root){
parent->right->color = 0; parent->right->color = 0;
// Delete the node (present at parent->right->right) // Delete the node (present at parent->right->right)
if(delete){ if (delete)
if(toDelete->left != NULL){ {
if (toDelete->left != NULL)
{
toDelete->left->par = parent->right; toDelete->left->par = parent->right;
} }
parent->right->right = toDelete->left; parent->right->right = toDelete->left;
free(toDelete); free(toDelete);
} }
} }
else{ // Sibling is right and child is also right. i.e. LEFT LEFT ROTATION else
{ // Sibling is right and child is also right. i.e. LEFT LEFT
// ROTATION
int parColor = parent->color; int parColor = parent->color;
@ -363,7 +436,8 @@ void checkForCase2(Node* toDelete, int delete, int fromDirection, Node** root){
parent = leftRotate(sibling); parent = leftRotate(sibling);
// Check if the root is rotated // Check if the root is rotated
if(parent->par == NULL){ if (parent->par == NULL)
{
*root = parent; *root = parent;
} }
@ -373,20 +447,23 @@ void checkForCase2(Node* toDelete, int delete, int fromDirection, Node** root){
parent->right->color = 0; parent->right->color = 0;
// Delete the node (present at parent->left->left) // Delete the node (present at parent->left->left)
if(delete){ if (delete)
if(toDelete->right != NULL){ {
if (toDelete->right != NULL)
{
toDelete->right->par = parent->left; toDelete->right->par = parent->left;
} }
parent->left->left = toDelete->left; parent->left->left = toDelete->left;
free(toDelete); free(toDelete);
} }
} }
} }
else{ else
{
// Sibling is right and child is left. i.e. RIGHT LEFT ROTATION // Sibling is right and child is left. i.e. RIGHT LEFT ROTATION
if(locateChild == 0){ if (locateChild == 0)
{
int parColor = parent->color; int parColor = parent->color;
@ -400,7 +477,8 @@ void checkForCase2(Node* toDelete, int delete, int fromDirection, Node** root){
parent = leftRotate(sibling); parent = leftRotate(sibling);
// Check if the root is rotated // Check if the root is rotated
if(parent->par == NULL){ if (parent->par == NULL)
{
*root = parent; *root = parent;
} }
@ -410,17 +488,19 @@ void checkForCase2(Node* toDelete, int delete, int fromDirection, Node** root){
parent->right->color = 0; parent->right->color = 0;
// Delete the node (present at parent->left->left) // Delete the node (present at parent->left->left)
if(delete){ if (delete)
if(toDelete->right != NULL){ {
if (toDelete->right != NULL)
{
toDelete->right->par = parent->left; toDelete->right->par = parent->left;
} }
parent->left->left = toDelete->right; parent->left->left = toDelete->right;
free(toDelete); free(toDelete);
} }
} }
else{ // Sibling is left and child is also left. i.e. RIGHT RIGHT ROTATION else
{ // Sibling is left and child is also left. i.e. RIGHT RIGHT
// ROTATION
int parColor = parent->color; int parColor = parent->color;
@ -428,7 +508,8 @@ void checkForCase2(Node* toDelete, int delete, int fromDirection, Node** root){
parent = rightRotate(sibling); parent = rightRotate(sibling);
// Check if the root is rotated // Check if the root is rotated
if(parent->par == NULL){ if (parent->par == NULL)
{
*root = parent; *root = parent;
} }
@ -438,33 +519,40 @@ void checkForCase2(Node* toDelete, int delete, int fromDirection, Node** root){
parent->right->color = 0; parent->right->color = 0;
// Delete the node (present at parent->right->right) // Delete the node (present at parent->right->right)
if(delete){ if (delete)
if(toDelete->left != NULL){ {
if (toDelete->left != NULL)
{
toDelete->left->par = parent->right; toDelete->left->par = parent->right;
} }
parent->right->right = toDelete->left; parent->right->right = toDelete->left;
free(toDelete); free(toDelete);
} }
} }
} }
} }
else if(sibling->color == 0){ //Make the sibling red and recur for its parent else if (sibling->color == 0)
{ // Make the sibling red and recur for its parent
// Recolor the sibling // Recolor the sibling
sibling->color = 1; sibling->color = 1;
// Delete if necessary // Delete if necessary
if(delete){ if (delete)
if(locateChild){ {
if (locateChild)
{
toDelete->par->right = toDelete->left; toDelete->par->right = toDelete->left;
if(toDelete->left != NULL){ if (toDelete->left != NULL)
{
toDelete->left->par = toDelete->par; toDelete->left->par = toDelete->par;
} }
} }
else{ else
{
toDelete->par->left = toDelete->right; toDelete->par->left = toDelete->right;
if(toDelete->right != NULL){ if (toDelete->right != NULL)
{
toDelete->right->par = toDelete->par; toDelete->right->par = toDelete->par;
} }
} }
@ -472,18 +560,22 @@ void checkForCase2(Node* toDelete, int delete, int fromDirection, Node** root){
checkForCase2(parent, 0, locateChild, root); checkForCase2(parent, 0, locateChild, root);
} }
else{ // Bring the sibling on top and apply 2.1 or 2.2 accordingly else
if(locateChild){ //Right Rotate { // Bring the sibling on top and apply 2.1 or 2.2 accordingly
if (locateChild)
{ // Right Rotate
toDelete->par->right = toDelete->left; toDelete->par->right = toDelete->left;
if(toDelete->left != NULL){ if (toDelete->left != NULL)
{
toDelete->left->par = toDelete->par; toDelete->left->par = toDelete->par;
} }
parent = rightRotate(sibling); parent = rightRotate(sibling);
// Check if the root is rotated // Check if the root is rotated
if(parent->par == NULL){ if (parent->par == NULL)
{
*root = parent; *root = parent;
} }
@ -491,16 +583,19 @@ void checkForCase2(Node* toDelete, int delete, int fromDirection, Node** root){
parent->right->color = 1; parent->right->color = 1;
checkForCase2(parent->right, 0, 1, root); checkForCase2(parent->right, 0, 1, root);
} }
else{ // Left Rotate else
{ // Left Rotate
toDelete->par->left = toDelete->right; toDelete->par->left = toDelete->right;
if(toDelete->right != NULL){ if (toDelete->right != NULL)
{
toDelete->right->par = toDelete->par; toDelete->right->par = toDelete->par;
} }
parent = leftRotate(sibling); parent = leftRotate(sibling);
// Check if the root is rotated // Check if the root is rotated
if(parent->par == NULL){ if (parent->par == NULL)
{
*root = parent; *root = parent;
} }
@ -511,35 +606,43 @@ void checkForCase2(Node* toDelete, int delete, int fromDirection, Node** root){
checkForCase2(parent->left, 0, 0, root); checkForCase2(parent->left, 0, 0, root);
} }
} }
} }
// To delete a node from the tree // To delete a node from the tree
void deleteNode(int val, Node** root){ void deleteNode(int val, Node **root)
{
Node *buffRoot = *root; Node *buffRoot = *root;
// Search for the element in the tree // Search for the element in the tree
while(1){ while (1)
{
if(val == buffRoot->val){ if (val == buffRoot->val)
{
// Node Found // Node Found
break; break;
} }
if(val > buffRoot->val){ if (val > buffRoot->val)
if(buffRoot->right != NULL){ {
if (buffRoot->right != NULL)
{
buffRoot = buffRoot->right; buffRoot = buffRoot->right;
} }
else{ else
{
printf("Node Not Found!!!"); printf("Node Not Found!!!");
return; return;
} }
} }
else{ else
if(buffRoot->left != NULL){ {
if (buffRoot->left != NULL)
{
buffRoot = buffRoot->left; buffRoot = buffRoot->left;
} }
else{ else
{
printf("Node Not Found!!!"); printf("Node Not Found!!!");
return; return;
} }
@ -549,20 +652,25 @@ void deleteNode(int val, Node** root){
Node *toDelete = buffRoot; Node *toDelete = buffRoot;
// Look for the leftmost of right node or right most of left node // Look for the leftmost of right node or right most of left node
if(toDelete->left != NULL){ if (toDelete->left != NULL)
{
toDelete = toDelete->left; toDelete = toDelete->left;
while(toDelete->right != NULL){ while (toDelete->right != NULL)
{
toDelete = toDelete->right; toDelete = toDelete->right;
} }
} }
else if(toDelete->right != NULL){ else if (toDelete->right != NULL)
{
toDelete = toDelete->right; toDelete = toDelete->right;
while(toDelete->left != NULL){ while (toDelete->left != NULL)
{
toDelete = toDelete->left; toDelete = toDelete->left;
} }
} }
if(toDelete == *root){ if (toDelete == *root)
{
*root = NULL; *root = NULL;
return; return;
} }
@ -572,28 +680,37 @@ void deleteNode(int val, Node** root){
toDelete->val = val; toDelete->val = val;
// Checking for case 1 // Checking for case 1
if(toDelete->color == 1 || (toDelete->left != NULL && toDelete->left->color == 1) || (toDelete->right != NULL && toDelete->right->color == 1)){ if (toDelete->color == 1 ||
(toDelete->left != NULL && toDelete->left->color == 1) ||
(toDelete->right != NULL && toDelete->right->color == 1))
{
// if it is a leaf // if it is a leaf
if(toDelete->left == NULL && toDelete->right == NULL){ if (toDelete->left == NULL && toDelete->right == NULL)
{
// Delete instantly // Delete instantly
if(toDelete->par->left == toDelete){ if (toDelete->par->left == toDelete)
{
toDelete->par->left = NULL; toDelete->par->left = NULL;
} }
else{ else
{
toDelete->par->right = NULL; toDelete->par->right = NULL;
} }
} }
else{ // else its child should be red else
{ // else its child should be red
// Check for the exitstence of left node // Check for the exitstence of left node
if(toDelete->left != NULL){ if (toDelete->left != NULL)
{
// The node should be right to its parent // The node should be right to its parent
toDelete->par->right = toDelete->left; toDelete->par->right = toDelete->left;
toDelete->left->par = toDelete->par; toDelete->left->par = toDelete->par;
toDelete->left->color = 1; toDelete->left->color = 1;
} }
else{ // else the right node should be red else
{ // else the right node should be red
toDelete->par->left = toDelete->right; toDelete->par->left = toDelete->right;
toDelete->right->par = toDelete->par; toDelete->right->par = toDelete->par;
toDelete->right->color = 1; toDelete->right->color = 1;
@ -603,49 +720,58 @@ void deleteNode(int val, Node** root){
// Remove the node from memory // Remove the node from memory
free(toDelete); free(toDelete);
} }
else{ // Case 2 else
{ // Case 2
checkForCase2(toDelete, 1, ((toDelete->par->right == toDelete)), root); checkForCase2(toDelete, 1, ((toDelete->par->right == toDelete)), root);
} }
} }
void printInorder(Node* root){ void printInorder(Node *root)
if(root != NULL){ {
if (root != NULL)
{
printInorder(root->left); printInorder(root->left);
printf("%d c-%d ", root->val, root->color); printf("%d c-%d ", root->val, root->color);
printInorder(root->right); printInorder(root->right);
} }
} }
void checkBlack(Node* temp,int c){ void checkBlack(Node *temp, int c)
if (temp==NULL){ {
if (temp == NULL)
{
printf("%d ", c); printf("%d ", c);
return; return;
} }
if (temp->color==0){ if (temp->color == 0)
{
c++; c++;
} }
checkBlack(temp->left, c); checkBlack(temp->left, c);
checkBlack(temp->right, c); checkBlack(temp->right, c);
} }
int main(){ int main()
{
Node *root = NULL; Node *root = NULL;
int scanValue, choice = 1; int scanValue, choice = 1;
printf("1 - Input\n2 - Delete\n3 - Inorder Traversel\n0 - Quit\n\nPlease Enter the Choice - "); printf("1 - Input\n2 - Delete\n3 - Inorder Traversel\n0 - Quit\n\nPlease "
"Enter the Choice - ");
scanf("%d", &choice); scanf("%d", &choice);
while(choice){ while (choice)
switch(choice){ {
switch (choice)
{
case 1: case 1:
printf("\n\nPlease Enter A Value to insert - "); printf("\n\nPlease Enter A Value to insert - ");
scanf("%d", &scanValue); scanf("%d", &scanValue);
if(root == NULL){ if (root == NULL)
{
root = newNode(scanValue, NULL); root = newNode(scanValue, NULL);
root->color = 0; root->color = 0;
} }
else{ else
{
insertNode(scanValue, &root); insertNode(scanValue, &root);
} }
printf("\nSuccessfully Inserted %d in the tree\n\n", scanValue); printf("\nSuccessfully Inserted %d in the tree\n\n", scanValue);
@ -664,15 +790,15 @@ int main(){
// printf("\n"); // printf("\n");
break; break;
default: default:
if(root != NULL){ if (root != NULL)
{
printf("Root - %d\n", root->val); printf("Root - %d\n", root->val);
} }
} }
printf("1 - Input\n2 - Delete\n3 - Inorder Traversel\n0 - Quit\n\nPlease Enter the Choice - "); printf("1 - Input\n2 - Delete\n3 - Inorder Traversel\n0 - "
"Quit\n\nPlease Enter the Choice - ");
scanf("%d", &choice); scanf("%d", &choice);
} }
} }
// 32 12 50 53 1 2 3 4 5 6 7 8 9 // 32 12 50 53 1 2 3 4 5 6 7 8 9

View File

@ -1,7 +1,6 @@
#include "dict.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include "dict.h"
/* simple constructor */ /* simple constructor */
Dictionary *create_dict(void) Dictionary *create_dict(void)
@ -26,7 +25,6 @@ Dictionary * create_dict(void)
} }
} }
/* /*
utility function utility function
sdbm hash algorithm sdbm hash algorithm
@ -40,14 +38,14 @@ int get_hash(char s[])
for (int counter = 0; s[counter] != '\0'; counter++) for (int counter = 0; s[counter] != '\0'; counter++)
{ {
/* actual computing of the hash code */ /* actual computing of the hash code */
hash_code = s[counter] + (hash_code << 6) + (hash_code << 16) - hash_code; hash_code =
s[counter] + (hash_code << 6) + (hash_code << 16) - hash_code;
} }
/* % modulo is for fitting the index in array. */ /* % modulo is for fitting the index in array. */
return hash_code % MAXELEMENTS; return hash_code % MAXELEMENTS;
} }
int add_item_label(Dictionary *dic, char label[], void *item) int add_item_label(Dictionary *dic, char label[], void *item)
{ {
unsigned int index = get_hash(label); unsigned int index = get_hash(label);
@ -63,7 +61,6 @@ int add_item_label(Dictionary * dic,char label[],void * item)
return -1; return -1;
} }
int add_item_index(Dictionary *dic, int index, void *item) int add_item_index(Dictionary *dic, int index, void *item)
{ {
/* make sure whether this place is already given */ /* make sure whether this place is already given */
@ -77,7 +74,6 @@ int add_item_index(Dictionary * dic , int index, void * item)
return -1; return -1;
} }
void *get_element_label(Dictionary *dict, char s[]) void *get_element_label(Dictionary *dict, char s[])
{ {
int index = get_hash(s); int index = get_hash(s);
@ -90,7 +86,6 @@ void * get_element_label(Dictionary * dict, char s[])
return NULL; return NULL;
} }
void *get_element_index(Dictionary *dict, int index) void *get_element_index(Dictionary *dict, int index)
{ {
if (index >= 0 && index < MAXELEMENTS) if (index >= 0 && index < MAXELEMENTS)
@ -102,8 +97,4 @@ void * get_element_index(Dictionary * dict, int index)
return NULL; return NULL;
} }
void destroy(Dictionary *dict) { free(dict); }
void destroy(Dictionary * dict)
{
free(dict);
}

View File

@ -47,13 +47,11 @@ int add_item_label(Dictionary *,char label[],void *);
*/ */
int add_item_index(Dictionary *, int index, void *); int add_item_index(Dictionary *, int index, void *);
/* /*
get_element: returns the element at given label get_element: returns the element at given label
*/ */
void *get_element_label(Dictionary *, char[]); void *get_element_label(Dictionary *, char[]);
/* /*
get_element: returns the element at given index get_element: returns the element at given index
*/ */
@ -64,5 +62,4 @@ void * get_element_index(Dictionary *, int );
*/ */
void destroy(Dictionary *); void destroy(Dictionary *);
#endif #endif

View File

@ -21,7 +21,6 @@ int main(void)
add_item_label(testObj1, "age", &value); add_item_label(testObj1, "age", &value);
add_item_label(testObj2, "name", "Christian"); add_item_label(testObj2, "name", "Christian");
/* /*
test for function add_item_label test for function add_item_label
@ -35,7 +34,8 @@ int main(void)
/* test for function add_item_index */ /* test for function add_item_index */
if (!add_item_index(testObj1, 0, &value)) if (!add_item_index(testObj1, 0, &value))
{ {
printf("My age at index %d is %d\n",0,*((int *)get_element_index(testObj1,0))); printf("My age at index %d is %d\n", 0,
*((int *)get_element_index(testObj1, 0)));
} }
/* error scenario */ /* error scenario */

View File

@ -1,7 +1,7 @@
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "dynamic_array.h" #include "dynamic_array.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
dynamic_array_t *init_dynamic_array() dynamic_array_t *init_dynamic_array()
{ {
@ -14,8 +14,10 @@ dynamic_array_t *init_dynamic_array()
void *add(dynamic_array_t *da, const void *value) void *add(dynamic_array_t *da, const void *value)
{ {
if (da->size >= da->capacity) { if (da->size >= da->capacity)
void **newItems = realloc(da->items, (da->capacity <<= 1) * sizeof(void **)); {
void **newItems =
realloc(da->items, (da->capacity <<= 1) * sizeof(void **));
free(da->items); free(da->items);
da->items = newItems; da->items = newItems;
@ -52,7 +54,8 @@ void delete (dynamic_array_t *da, const unsigned index)
if (!contains(da->size, index)) if (!contains(da->size, index))
return; return;
for (unsigned i = index; i < da->size; i++) { for (unsigned i = index; i < da->size; i++)
{
da->items[i] = da->items[i + 1]; da->items[i] = da->items[i + 1];
} }

View File

@ -3,7 +3,8 @@
#define DEFAULT_CAPACITY 1 << 4 #define DEFAULT_CAPACITY 1 << 4
#define INDEX_OUT_OF_BOUNDS NULL #define INDEX_OUT_OF_BOUNDS NULL
typedef struct dynamic_array { typedef struct dynamic_array
{
void **items; void **items;
unsigned size; unsigned size;
unsigned capacity; unsigned capacity;

View File

@ -6,7 +6,8 @@ int main()
{ {
dynamic_array_t *da = init_dynamic_array(); dynamic_array_t *da = init_dynamic_array();
for (int i = 1; i <= 50; i++) { for (int i = 1; i <= 50; i++)
{
add(da, &i); add(da, &i);
} }
@ -22,7 +23,8 @@ int main()
add(da, &another_value); add(da, &another_value);
for (int i = 0; i < da->size; i++) { for (int i = 0; i < da->size; i++)
{
printf("value %d\n", *(int *)get(da, i)); printf("value %d\n", *(int *)get(da, i));
} }

View File

@ -2,7 +2,8 @@
#include <stdlib.h> #include <stdlib.h>
#define SIZE 40 #define SIZE 40
// Assume max size of graph is 40 nodes // Assume max size of graph is 40 nodes
struct queue { struct queue
{
int items[SIZE]; int items[SIZE];
int front; int front;
int rear; int rear;
@ -80,16 +81,20 @@ void bfs(struct Graph* graph, int startVertex)
printf("Breadth first traversal from vertex %d is:\n", startVertex); printf("Breadth first traversal from vertex %d is:\n", startVertex);
// Iterate while queue not empty // Iterate while queue not empty
while(!isEmpty(q)){ while (!isEmpty(q))
{
printf("%d ", pollQueue(q)); printf("%d ", pollQueue(q));
int currentVertex = dequeue(q); int currentVertex = dequeue(q);
struct node *temp = graph->adjLists[currentVertex]; struct node *temp = graph->adjLists[currentVertex];
//Add all unvisited neighbours of current vertex to queue to be printed next // Add all unvisited neighbours of current vertex to queue to be printed
while(temp) { // next
while (temp)
{
int adjVertex = temp->vertex; int adjVertex = temp->vertex;
// Only add if neighbour is unvisited // Only add if neighbour is unvisited
if(graph->visited[adjVertex] == 0){ if (graph->visited[adjVertex] == 0)
{
graph->visited[adjVertex] = 1; graph->visited[adjVertex] = 1;
enqueue(q, adjVertex); enqueue(q, adjVertex);
} }
@ -115,7 +120,8 @@ struct Graph* createGraph(int vertices)
graph->visited = malloc(vertices * sizeof(int)); graph->visited = malloc(vertices * sizeof(int));
int i; int i;
for (i = 0; i < vertices; i++) { for (i = 0; i < vertices; i++)
{
graph->adjLists[i] = NULL; graph->adjLists[i] = NULL;
graph->visited[i] = 0; graph->visited[i] = 0;
} }
@ -156,7 +162,8 @@ void enqueue(struct queue* q, int value)
{ {
if (q->rear == SIZE - 1) if (q->rear == SIZE - 1)
printf("\nQueue is Full!!"); printf("\nQueue is Full!!");
else { else
{
if (q->front == -1) if (q->front == -1)
q->front = 0; q->front = 0;
q->rear++; q->rear++;
@ -167,14 +174,17 @@ void enqueue(struct queue* q, int value)
int dequeue(struct queue *q) int dequeue(struct queue *q)
{ {
int item; int item;
if(isEmpty(q)){ if (isEmpty(q))
{
printf("Queue is empty"); printf("Queue is empty");
item = -1; item = -1;
} }
else{ else
{
item = q->items[q->front]; item = q->items[q->front];
q->front++; q->front++;
if(q->front > q->rear){ if (q->front > q->rear)
{
q->front = q->rear = -1; q->front = q->rear = -1;
} }
} }
@ -182,7 +192,4 @@ int dequeue(struct queue* q)
} }
// Returns element at front of queue // Returns element at front of queue
int pollQueue(struct queue *q) int pollQueue(struct queue *q) { return q->items[q->front]; }
{
return q->items[q->front];
}

View File

@ -1,29 +1,33 @@
#include <limits.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include<limits.h>
#include <string.h> #include <string.h>
// Structure for storing edge // Structure for storing edge
struct Edge{ struct Edge
{
int src, dst, weight; int src, dst, weight;
}; };
// Structure for storing a graph // Structure for storing a graph
struct Graph{ struct Graph
{
int vertexNum; int vertexNum;
int edgeNum; int edgeNum;
struct Edge *edges; struct Edge *edges;
}; };
// Constructs a graph with V vertices and E edges // Constructs a graph with V vertices and E edges
void createGraph(struct Graph* G,int V,int E){ void createGraph(struct Graph *G, int V, int E)
{
G->vertexNum = V; G->vertexNum = V;
G->edgeNum = E; G->edgeNum = E;
G->edges = (struct Edge *)malloc(E * sizeof(struct Edge)); G->edges = (struct Edge *)malloc(E * sizeof(struct Edge));
} }
// Adds the given edge to the graph // Adds the given edge to the graph
void addEdge(struct Graph* G, int src, int dst, int weight){ void addEdge(struct Graph *G, int src, int dst, int weight)
{
static int ind; static int ind;
struct Edge newEdge; struct Edge newEdge;
newEdge.src = src; newEdge.src = src;
@ -32,12 +36,13 @@ void addEdge(struct Graph* G, int src, int dst, int weight){
G->edges[ind++] = newEdge; G->edges[ind++] = newEdge;
} }
// Utility function to find minimum distance vertex in mdist // Utility function to find minimum distance vertex in mdist
int minDistance(int mdist[], int vset[], int V){ int minDistance(int mdist[], int vset[], int V)
{
int minVal = INT_MAX, minInd; int minVal = INT_MAX, minInd;
for (int i = 0; i < V; i++) for (int i = 0; i < V; i++)
if(vset[i] == 0 && mdist[i] < minVal){ if (vset[i] == 0 && mdist[i] < minVal)
{
minVal = mdist[i]; minVal = mdist[i];
minInd = i; minInd = i;
} }
@ -46,9 +51,11 @@ int minDistance(int mdist[], int vset[], int V){
} }
// Utility function to print distances // Utility function to print distances
void print(int dist[], int V){ void print(int dist[], int V)
{
printf("\nVertex Distance\n"); printf("\nVertex Distance\n");
for(int i = 0; i < V; i++){ for (int i = 0; i < V; i++)
{
if (dist[i] != INT_MAX) if (dist[i] != INT_MAX)
printf("%d\t%d\n", i, dist[i]); printf("%d\t%d\n", i, dist[i]);
else else
@ -59,7 +66,8 @@ void print(int dist[], int V){
// The main function that finds the shortest path from given source // The main function that finds the shortest path from given source
// to all other vertices using Bellman-Ford.It also detects negative // to all other vertices using Bellman-Ford.It also detects negative
// weight cycle // weight cycle
void BellmanFord(struct Graph* graph, int src){ void BellmanFord(struct Graph *graph, int src)
{
int V = graph->vertexNum; int V = graph->vertexNum;
int E = graph->edgeNum; int E = graph->edgeNum;
int dist[V]; int dist[V];
@ -73,7 +81,8 @@ void BellmanFord(struct Graph* graph, int src){
// Calculate shortest path distance from source to all edges // Calculate shortest path distance from source to all edges
// A path can contain maximum (|V|-1) edges // A path can contain maximum (|V|-1) edges
for (int i = 0; i <= V - 1; i++) for (int i = 0; i <= V - 1; i++)
for(int j = 0; j<E; j++){ for (int j = 0; j < E; j++)
{
int u = graph->edges[j].src; int u = graph->edges[j].src;
int v = graph->edges[j].dst; int v = graph->edges[j].dst;
int w = graph->edges[j].weight; int w = graph->edges[j].weight;
@ -83,13 +92,16 @@ void BellmanFord(struct Graph* graph, int src){
} }
// Iterate inner loop once more to check for negative cycle // Iterate inner loop once more to check for negative cycle
for(int j = 0; j<E; j++){ for (int j = 0; j < E; j++)
{
int u = graph->edges[j].src; int u = graph->edges[j].src;
int v = graph->edges[j].dst; int v = graph->edges[j].dst;
int w = graph->edges[j].weight; int w = graph->edges[j].weight;
if(dist[u]!=INT_MAX && dist[u] + w < dist[v]){ if (dist[u] != INT_MAX && dist[u] + w < dist[v])
printf("Graph contains negative weight cycle. Hence, shortest distance not guaranteed."); {
printf("Graph contains negative weight cycle. Hence, shortest "
"distance not guaranteed.");
return; return;
} }
} }
@ -99,10 +111,9 @@ void BellmanFord(struct Graph* graph, int src){
return; return;
} }
// Driver Function // Driver Function
int main(){ int main()
{
int V, E, gsrc; int V, E, gsrc;
int src, dst, weight; int src, dst, weight;
struct Graph G; struct Graph G;
@ -111,7 +122,8 @@ int main(){
printf("Enter number of edges: "); printf("Enter number of edges: ");
scanf("%d", &E); scanf("%d", &E);
createGraph(&G, V, E); createGraph(&G, V, E);
for(int i=0; i<E; i++){ for (int i = 0; i < E; i++)
{
printf("\nEdge %d \nEnter source: ", i + 1); printf("\nEdge %d \nEnter source: ", i + 1);
scanf("%d", &src); scanf("%d", &src);
printf("Enter destination: "); printf("Enter destination: ");
@ -126,5 +138,3 @@ int main(){
return 0; return 0;
} }

View File

@ -13,7 +13,9 @@ struct Graph
{ {
int numVertices; int numVertices;
int *visited; int *visited;
struct node** adjLists; // we need int** to store a two dimensional array. Similary, we need struct node** to store an array of Linked lists struct node *
*adjLists; // we need int** to store a two dimensional array. Similary,
// we need struct node** to store an array of Linked lists
}; };
struct Graph *createGraph(int); struct Graph *createGraph(int);
void addEdge(struct Graph *, int, int); void addEdge(struct Graph *, int, int);
@ -55,7 +57,8 @@ int main()
return 0; return 0;
} }
// Recursive dfs approach // Recursive dfs approach
void dfs(struct Graph* graph, int vertex) { void dfs(struct Graph *graph, int vertex)
{
struct node *adjList = graph->adjLists[vertex]; struct node *adjList = graph->adjLists[vertex];
struct node *temp = adjList; struct node *temp = adjList;
@ -64,9 +67,11 @@ void dfs(struct Graph* graph, int vertex) {
printf("%d ", vertex); printf("%d ", vertex);
// Recursively call the dfs function on all unvisited neighbours // Recursively call the dfs function on all unvisited neighbours
while(temp!=NULL) { while (temp != NULL)
{
int connectedVertex = temp->vertex; int connectedVertex = temp->vertex;
if(graph->visited[connectedVertex] == 0) { if (graph->visited[connectedVertex] == 0)
{
dfs(graph, connectedVertex); dfs(graph, connectedVertex);
} }
temp = temp->next; temp = temp->next;
@ -91,7 +96,8 @@ struct Graph* createGraph(int vertices)
graph->visited = malloc(vertices * sizeof(int)); graph->visited = malloc(vertices * sizeof(int));
int i; int i;
for (i = 0; i < vertices; i++) { for (i = 0; i < vertices; i++)
{
graph->adjLists[i] = NULL; graph->adjLists[i] = NULL;
graph->visited[i] = 0; graph->visited[i] = 0;
} }

View File

@ -1,20 +1,22 @@
#include <limits.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include<limits.h>
#include <string.h> #include <string.h>
// Structure for storing a graph // Structure for storing a graph
struct Graph{ struct Graph
{
int vertexNum; int vertexNum;
int **edges; int **edges;
}; };
// Constructs a graph with V vertices and E edges // Constructs a graph with V vertices and E edges
void createGraph(struct Graph* G,int V){ void createGraph(struct Graph *G, int V)
{
G->vertexNum = V; G->vertexNum = V;
G->edges = (int **)malloc(V * sizeof(int *)); G->edges = (int **)malloc(V * sizeof(int *));
for(int i=0; i<V; i++){ for (int i = 0; i < V; i++)
{
G->edges[i] = (int *)malloc(V * sizeof(int)); G->edges[i] = (int *)malloc(V * sizeof(int));
for (int j = 0; j < V; j++) for (int j = 0; j < V; j++)
G->edges[i][j] = INT_MAX; G->edges[i][j] = INT_MAX;
@ -23,16 +25,18 @@ void createGraph(struct Graph* G,int V){
} }
// Adds the given edge to the graph // Adds the given edge to the graph
void addEdge(struct Graph* G, int src, int dst, int weight){ void addEdge(struct Graph *G, int src, int dst, int weight)
{
G->edges[src][dst] = weight; G->edges[src][dst] = weight;
} }
// Utility function to find minimum distance vertex in mdist // Utility function to find minimum distance vertex in mdist
int minDistance(int mdist[], int vset[], int V){ int minDistance(int mdist[], int vset[], int V)
{
int minVal = INT_MAX, minInd; int minVal = INT_MAX, minInd;
for (int i = 0; i < V; i++) for (int i = 0; i < V; i++)
if(vset[i] == 0 && mdist[i] < minVal){ if (vset[i] == 0 && mdist[i] < minVal)
{
minVal = mdist[i]; minVal = mdist[i];
minInd = i; minInd = i;
} }
@ -41,9 +45,11 @@ int minDistance(int mdist[], int vset[], int V){
} }
// Utility function to print distances // Utility function to print distances
void print(int dist[], int V){ void print(int dist[], int V)
{
printf("\nVertex Distance\n"); printf("\nVertex Distance\n");
for(int i = 0; i < V; i++){ for (int i = 0; i < V; i++)
{
if (dist[i] != INT_MAX) if (dist[i] != INT_MAX)
printf("%d\t%d\n", i, dist[i]); printf("%d\t%d\n", i, dist[i]);
else else
@ -54,7 +60,8 @@ void print(int dist[], int V){
// The main function that finds the shortest path from given source // The main function that finds the shortest path from given source
// to all other vertices using Dijkstra's Algorithm.It doesn't work on negative // to all other vertices using Dijkstra's Algorithm.It doesn't work on negative
// weights // weights
void Dijkstra(struct Graph* graph, int src){ void Dijkstra(struct Graph *graph, int src)
{
int V = graph->vertexNum; int V = graph->vertexNum;
int mdist[V]; // Stores updated distances to vertex int mdist[V]; // Stores updated distances to vertex
int vset[V]; // vset[i] is true if the vertex i included int vset[V]; // vset[i] is true if the vertex i included
@ -67,14 +74,16 @@ void Dijkstra(struct Graph* graph, int src){
mdist[src] = 0; mdist[src] = 0;
// iterate to find shortest path // iterate to find shortest path
for(int count = 0; count<V-1; count++){ for (int count = 0; count < V - 1; count++)
{
int u = minDistance(mdist, vset, V); int u = minDistance(mdist, vset, V);
vset[u] = 1; vset[u] = 1;
for(int v=0; v<V; v++){ for (int v = 0; v < V; v++)
if(!vset[v] && graph->edges[u][v]!=INT_MAX && mdist[u] + graph->edges[u][v] < mdist[v]) {
if (!vset[v] && graph->edges[u][v] != INT_MAX &&
mdist[u] + graph->edges[u][v] < mdist[v])
mdist[v] = mdist[u] + graph->edges[u][v]; mdist[v] = mdist[u] + graph->edges[u][v];
} }
} }
@ -83,10 +92,9 @@ void Dijkstra(struct Graph* graph, int src){
return; return;
} }
// Driver Function // Driver Function
int main(){ int main()
{
int V, E, gsrc; int V, E, gsrc;
int src, dst, weight; int src, dst, weight;
struct Graph G; struct Graph G;
@ -95,7 +103,8 @@ int main(){
printf("Enter number of edges: "); printf("Enter number of edges: ");
scanf("%d", &E); scanf("%d", &E);
createGraph(&G, V); createGraph(&G, V);
for(int i=0; i<E; i++){ for (int i = 0; i < E; i++)
{
printf("\nEdge %d \nEnter source: ", i + 1); printf("\nEdge %d \nEnter source: ", i + 1);
scanf("%d", &src); scanf("%d", &src);
printf("Enter destination: "); printf("Enter destination: ");
@ -110,5 +119,3 @@ int main(){
return 0; return 0;
} }

View File

@ -1,20 +1,22 @@
#include <limits.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include<limits.h>
#include <string.h> #include <string.h>
// Structure for storing a graph // Structure for storing a graph
struct Graph{ struct Graph
{
int vertexNum; int vertexNum;
int **edges; int **edges;
}; };
// Constructs a graph with V vertices and E edges // Constructs a graph with V vertices and E edges
void createGraph(struct Graph* G,int V){ void createGraph(struct Graph *G, int V)
{
G->vertexNum = V; G->vertexNum = V;
G->edges = (int **)malloc(V * sizeof(int *)); G->edges = (int **)malloc(V * sizeof(int *));
for(int i=0; i<V; i++){ for (int i = 0; i < V; i++)
{
G->edges[i] = (int *)malloc(V * sizeof(int)); G->edges[i] = (int *)malloc(V * sizeof(int));
for (int j = 0; j < V; j++) for (int j = 0; j < V; j++)
G->edges[i][j] = INT_MAX; G->edges[i][j] = INT_MAX;
@ -23,16 +25,19 @@ void createGraph(struct Graph* G,int V){
} }
// Adds the given edge to the graph // Adds the given edge to the graph
void addEdge(struct Graph* G, int src, int dst, int weight){ void addEdge(struct Graph *G, int src, int dst, int weight)
{
G->edges[src][dst] = weight; G->edges[src][dst] = weight;
} }
// Utility function to print distances // Utility function to print distances
void print(int dist[], int V){ void print(int dist[], int V)
{
printf("\nThe Distance matrix for Floyd - Warshall\n"); printf("\nThe Distance matrix for Floyd - Warshall\n");
for(int i = 0; i < V; i++){ for (int i = 0; i < V; i++)
for(int j=0; j<V; j++){ {
for (int j = 0; j < V; j++)
{
if (dist[i * V + j] != INT_MAX) if (dist[i * V + j] != INT_MAX)
printf("%d\t", dist[i * V + j]); printf("%d\t", dist[i * V + j]);
@ -45,7 +50,8 @@ void print(int dist[], int V){
// The main function that finds the shortest path from a vertex // The main function that finds the shortest path from a vertex
// to all other vertices using Floyd-Warshall Algorithm. // to all other vertices using Floyd-Warshall Algorithm.
void FloydWarshall(struct Graph* graph){ void FloydWarshall(struct Graph *graph)
{
int V = graph->vertexNum; int V = graph->vertexNum;
int dist[V][V]; int dist[V][V];
@ -54,7 +60,6 @@ void FloydWarshall(struct Graph* graph){
for (int j = 0; j < V; j++) for (int j = 0; j < V; j++)
dist[i][j] = graph->edges[i][j]; dist[i][j] = graph->edges[i][j];
// Calculate distances // Calculate distances
for (int k = 0; k < V; k++) for (int k = 0; k < V; k++)
// Choose an intermediate vertex // Choose an intermediate vertex
@ -65,11 +70,12 @@ void FloydWarshall(struct Graph* graph){
for (int j = 0; j < V; j++) for (int j = 0; j < V; j++)
// Choose a destination vertex for above source vertex // Choose a destination vertex for above source vertex
if(dist[i][k] != INT_MAX && dist[k][j] != INT_MAX && dist[i][k] + dist[k][j] < dist[i][j]) if (dist[i][k] != INT_MAX && dist[k][j] != INT_MAX &&
//If the distance through intermediate vertex is less than direct edge then update value in distance array dist[i][k] + dist[k][j] < dist[i][j])
// If the distance through intermediate vertex is less than
// direct edge then update value in distance array
dist[i][j] = dist[i][k] + dist[k][j]; dist[i][j] = dist[i][k] + dist[k][j];
// Convert 2d array to 1d array for print // Convert 2d array to 1d array for print
int dist1d[V * V]; int dist1d[V * V];
for (int i = 0; i < V; i++) for (int i = 0; i < V; i++)
@ -80,7 +86,8 @@ void FloydWarshall(struct Graph* graph){
} }
// Driver Function // Driver Function
int main(){ int main()
{
int V, E; int V, E;
int src, dst, weight; int src, dst, weight;
struct Graph G; struct Graph G;
@ -89,7 +96,8 @@ int main(){
printf("Enter number of edges: "); printf("Enter number of edges: ");
scanf("%d", &E); scanf("%d", &E);
createGraph(&G, V); createGraph(&G, V);
for(int i=0; i<E; i++){ for (int i = 0; i < E; i++)
{
printf("\nEdge %d \nEnter source: ", i + 1); printf("\nEdge %d \nEnter source: ", i + 1);
scanf("%d", &src); scanf("%d", &src);
printf("Enter destination: "); printf("Enter destination: ");

View File

@ -2,16 +2,18 @@
// Adjacency Matrix Representation // Adjacency Matrix Representation
#include "Graph.h" #include "Graph.h"
#include <assert.h> #include <assert.h>
#include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
typedef struct GraphRep { typedef struct GraphRep
{
int **edges; // adjacency matrix int **edges; // adjacency matrix
int nV; // #vertices int nV; // #vertices
int nE; // #edges int nE; // #edges
} GraphRep; } GraphRep;
Graph newGraph(int V) { Graph newGraph(int V)
{
assert(V >= 0); assert(V >= 0);
int i; int i;
@ -24,7 +26,8 @@ Graph newGraph(int V) {
g->edges = malloc(V * sizeof(int *)); g->edges = malloc(V * sizeof(int *));
assert(g->edges != NULL); assert(g->edges != NULL);
// allocate memory for each column and initialise with 0 // allocate memory for each column and initialise with 0
for (i = 0; i < V; i++) { for (i = 0; i < V; i++)
{
g->edges[i] = calloc(V, sizeof(int)); g->edges[i] = calloc(V, sizeof(int));
assert(g->edges[i] != NULL); assert(g->edges[i] != NULL);
} }
@ -33,37 +36,41 @@ Graph newGraph(int V) {
} }
// check if vertex is valid in a graph // check if vertex is valid in a graph
bool validV(Graph g, Vertex v) { bool validV(Graph g, Vertex v) { return (g != NULL && v >= 0 && v < g->nV); }
return (g != NULL && v >= 0 && v < g->nV);
}
void insertEdge(Graph g, Edge e) { void insertEdge(Graph g, Edge e)
{
assert(g != NULL && validV(g, e.v) && validV(g, e.w)); assert(g != NULL && validV(g, e.v) && validV(g, e.w));
if (!g->edges[e.v][e.w]) { // edge e not in graph if (!g->edges[e.v][e.w])
{ // edge e not in graph
g->edges[e.v][e.w] = 1; g->edges[e.v][e.w] = 1;
g->edges[e.w][e.v] = 1; g->edges[e.w][e.v] = 1;
g->nE++; g->nE++;
} }
} }
void removeEdge(Graph g, Edge e) { void removeEdge(Graph g, Edge e)
{
assert(g != NULL && validV(g, e.v) && validV(g, e.w)); assert(g != NULL && validV(g, e.v) && validV(g, e.w));
if (g->edges[e.v][e.w]) { // edge e in graph if (g->edges[e.v][e.w])
{ // edge e in graph
g->edges[e.v][e.w] = 0; g->edges[e.v][e.w] = 0;
g->edges[e.w][e.v] = 0; g->edges[e.w][e.v] = 0;
g->nE--; g->nE--;
} }
} }
bool adjacent(Graph g, Vertex v, Vertex w) { bool adjacent(Graph g, Vertex v, Vertex w)
{
assert(g != NULL && validV(g, v) && validV(g, w)); assert(g != NULL && validV(g, v) && validV(g, w));
return (g->edges[v][w] != 0); return (g->edges[v][w] != 0);
} }
void showGraph(Graph g) { void showGraph(Graph g)
{
assert(g != NULL); assert(g != NULL);
int i, j; int i, j;
@ -75,7 +82,8 @@ void showGraph(Graph g) {
printf("Edge %d - %d\n", i, j); printf("Edge %d - %d\n", i, j);
} }
void freeGraph(Graph g) { void freeGraph(Graph g)
{
assert(g != NULL); assert(g != NULL);
int i; int i;
@ -86,17 +94,25 @@ void freeGraph(Graph g) {
} }
// By // By
// .----------------. .----------------. .----------------. .-----------------. .----------------. .----------------. // .----------------. .----------------. .----------------.
// | .--------------. || .--------------. || .--------------. || .--------------. | | .--------------. || .--------------. | // .-----------------. .----------------. .----------------.
// | | _________ | || | _____ _____ | || | __ | || | ____ _____ | | | | ____ ____ | || | ____ | | // | .--------------. || .--------------. || .--------------. ||
// | | | _ _ | | || ||_ _||_ _|| || | / \ | || ||_ \|_ _| | | | | |_ || _| | || | .' `. | | // .--------------. | | .--------------. || .--------------. | | | _________ |
// | | |_/ | | \_| | || | | | | | | || | / /\ \ | || | | \ | | | | | | | |__| | | || | / .--. \ | | // || | _____ _____ | || | __ | || | ____ _____ | | | | ____ ____
// | | | | | || | | ' ' | | || | / ____ \ | || | | |\ \| | | | | | | __ | | || | | | | | | | // | || | ____ | | | | | _ _ | | || ||_ _||_ _|| || | / \
// | | _| |_ | || | \ `--' / | || | _/ / \ \_ | || | _| |_\ |_ | | | | _| | | |_ | || | \ `--' / | | // | || ||_ \|_ _| | | | | |_ || _| | || | .' `. | | | | |_/ | |
// | | |_____| | || | `.__.' | || ||____| |____|| || ||_____|\____| | | | | |____||____| | || | `.____.' | | // \_| | || | | | | | | || | / /\ \ | || | | \ | | | | | | |
// | | | || | | || | | || | | | | | | || | | | // |__| | | || | / .--. \ | | | | | | | || | | ' ' | | || |
// | '--------------' || '--------------' || '--------------' || '--------------' | | '--------------' || '--------------' | // / ____ \ | || | | |\ \| | | | | | | __ | | || | | | | | | |
// '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' // | | _| |_ | || | \ `--' / | || | _/ / \ \_ | || | _| |_\ |_
// | | | | _| | | |_ | || | \ `--' / | | | | |_____| | || | `.__.'
// | || ||____| |____|| || ||_____|\____| | | | | |____||____| | || | `.____.'
// | | | | | || | | || | | || | | | | |
// | || | | | | '--------------' || '--------------' ||
// '--------------' || '--------------' | | '--------------' || '--------------'
// |
// '----------------' '----------------' '----------------'
// '----------------' '----------------' '----------------'
// Email : z5261243@unsw.edu.au // Email : z5261243@unsw.edu.au
// hhoanhtuann@gmail.com // hhoanhtuann@gmail.com

View File

@ -7,7 +7,8 @@ typedef struct GraphRep *Graph;
typedef int Vertex; typedef int Vertex;
// edges are pairs of vertices (end-points) // edges are pairs of vertices (end-points)
typedef struct Edge { typedef struct Edge
{
Vertex v; Vertex v;
Vertex w; Vertex w;
} Edge; } Edge;
@ -19,19 +20,26 @@ bool adjacent(Graph, Vertex, Vertex);
void showGraph(Graph); void showGraph(Graph);
void freeGraph(Graph); void freeGraph(Graph);
// By // By
// .----------------. .----------------. .----------------. .-----------------. .----------------. .----------------. // .----------------. .----------------. .----------------.
// | .--------------. || .--------------. || .--------------. || .--------------. | | .--------------. || .--------------. | // .-----------------. .----------------. .----------------.
// | | _________ | || | _____ _____ | || | __ | || | ____ _____ | | | | ____ ____ | || | ____ | | // | .--------------. || .--------------. || .--------------. ||
// | | | _ _ | | || ||_ _||_ _|| || | / \ | || ||_ \|_ _| | | | | |_ || _| | || | .' `. | | // .--------------. | | .--------------. || .--------------. | | | _________ |
// | | |_/ | | \_| | || | | | | | | || | / /\ \ | || | | \ | | | | | | | |__| | | || | / .--. \ | | // || | _____ _____ | || | __ | || | ____ _____ | | | | ____ ____
// | | | | | || | | ' ' | | || | / ____ \ | || | | |\ \| | | | | | | __ | | || | | | | | | | // | || | ____ | | | | | _ _ | | || ||_ _||_ _|| || | / \
// | | _| |_ | || | \ `--' / | || | _/ / \ \_ | || | _| |_\ |_ | | | | _| | | |_ | || | \ `--' / | | // | || ||_ \|_ _| | | | | |_ || _| | || | .' `. | | | | |_/ | |
// | | |_____| | || | `.__.' | || ||____| |____|| || ||_____|\____| | | | | |____||____| | || | `.____.' | | // \_| | || | | | | | | || | / /\ \ | || | | \ | | | | | | |
// | | | || | | || | | || | | | | | | || | | | // |__| | | || | / .--. \ | | | | | | | || | | ' ' | | || |
// | '--------------' || '--------------' || '--------------' || '--------------' | | '--------------' || '--------------' | // / ____ \ | || | | |\ \| | | | | | | __ | | || | | | | | | |
// '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' // | | _| |_ | || | \ `--' / | || | _/ / \ \_ | || | _| |_\ |_
// | | | | _| | | |_ | || | \ `--' / | | | | |_____| | || | `.__.'
// | || ||____| |____|| || ||_____|\____| | | | | |____||____| | || | `.____.'
// | | | | | || | | || | | || | | | | |
// | || | | | | '--------------' || '--------------' ||
// '--------------' || '--------------' | | '--------------' || '--------------'
// |
// '----------------' '----------------' '----------------'
// '----------------' '----------------' '----------------'
// Email : z5261243@unsw.edu.au // Email : z5261243@unsw.edu.au
// hhoanhtuann@gmail.com // hhoanhtuann@gmail.com

View File

@ -1,14 +1,15 @@
#include <stdio.h>
#include <stdbool.h>
#include "queue.h"
#include "Graph.h" #include "Graph.h"
#include "queue.h"
#include <stdbool.h>
#include <stdio.h>
#define MAX_NODES 1000 #define MAX_NODES 1000
int visited[MAX_NODES]; // array to store visiting order int visited[MAX_NODES]; // array to store visiting order
// indexed by vertex 0..nV-1 // indexed by vertex 0..nV-1
bool findPathBFS(Graph g, int nV, Vertex src, Vertex dest) { bool findPathBFS(Graph g, int nV, Vertex src, Vertex dest)
{
Vertex v; Vertex v;
for (v = 0; v < nV; v++) for (v = 0; v < nV; v++)
visited[v] = -1; visited[v] = -1;
@ -16,11 +17,13 @@ bool findPathBFS(Graph g, int nV, Vertex src, Vertex dest) {
visited[src] = src; visited[src] = src;
queue Q = newQueue(); queue Q = newQueue();
QueueEnqueue(Q, src); QueueEnqueue(Q, src);
while (!QueueIsEmpty(Q)) { while (!QueueIsEmpty(Q))
{
v = QueueDequeue(Q); v = QueueDequeue(Q);
Vertex w; Vertex w;
for (w = 0; w < nV; w++) for (w = 0; w < nV; w++)
if (adjacent(g, v, w) && visited[w] == -1) { if (adjacent(g, v, w) && visited[w] == -1)
{
visited[w] = v; visited[w] = v;
if (w == dest) if (w == dest)
return true; return true;
@ -31,31 +34,64 @@ bool findPathBFS(Graph g, int nV, Vertex src, Vertex dest) {
return false; return false;
} }
int main(void) { int main(void)
{
int V = 10; int V = 10;
Graph g = newGraph(V); Graph g = newGraph(V);
Edge e; Edge e;
e.v = 0; e.w = 1; insertEdge(g, e); e.v = 0;
e.v = 0; e.w = 2; insertEdge(g, e); e.w = 1;
e.v = 0; e.w = 5; insertEdge(g, e); insertEdge(g, e);
e.v = 1; e.w = 5; insertEdge(g, e); e.v = 0;
e.v = 2; e.w = 3; insertEdge(g, e); e.w = 2;
e.v = 3; e.w = 4; insertEdge(g, e); insertEdge(g, e);
e.v = 3; e.w = 5; insertEdge(g, e); e.v = 0;
e.v = 3; e.w = 8; insertEdge(g, e); e.w = 5;
e.v = 4; e.w = 5; insertEdge(g, e); insertEdge(g, e);
e.v = 4; e.w = 7; insertEdge(g, e); e.v = 1;
e.v = 4; e.w = 8; insertEdge(g, e); e.w = 5;
e.v = 5; e.w = 6; insertEdge(g, e); insertEdge(g, e);
e.v = 7; e.w = 8; insertEdge(g, e); e.v = 2;
e.v = 7; e.w = 9; insertEdge(g, e); e.w = 3;
e.v = 8; e.w = 9; insertEdge(g, e); insertEdge(g, e);
e.v = 3;
e.w = 4;
insertEdge(g, e);
e.v = 3;
e.w = 5;
insertEdge(g, e);
e.v = 3;
e.w = 8;
insertEdge(g, e);
e.v = 4;
e.w = 5;
insertEdge(g, e);
e.v = 4;
e.w = 7;
insertEdge(g, e);
e.v = 4;
e.w = 8;
insertEdge(g, e);
e.v = 5;
e.w = 6;
insertEdge(g, e);
e.v = 7;
e.w = 8;
insertEdge(g, e);
e.v = 7;
e.w = 9;
insertEdge(g, e);
e.v = 8;
e.w = 9;
insertEdge(g, e);
int src = 0, dest = 6; int src = 0, dest = 6;
if (findPathBFS(g, V, src, dest)) { if (findPathBFS(g, V, src, dest))
{
Vertex v = dest; Vertex v = dest;
while (v != src) { while (v != src)
{
printf("%d - ", v); printf("%d - ", v);
v = visited[v]; v = visited[v];
} }
@ -65,17 +101,25 @@ int main(void) {
} }
// By // By
// .----------------. .----------------. .----------------. .-----------------. .----------------. .----------------. // .----------------. .----------------. .----------------.
// | .--------------. || .--------------. || .--------------. || .--------------. | | .--------------. || .--------------. | // .-----------------. .----------------. .----------------.
// | | _________ | || | _____ _____ | || | __ | || | ____ _____ | | | | ____ ____ | || | ____ | | // | .--------------. || .--------------. || .--------------. ||
// | | | _ _ | | || ||_ _||_ _|| || | / \ | || ||_ \|_ _| | | | | |_ || _| | || | .' `. | | // .--------------. | | .--------------. || .--------------. | | | _________ |
// | | |_/ | | \_| | || | | | | | | || | / /\ \ | || | | \ | | | | | | | |__| | | || | / .--. \ | | // || | _____ _____ | || | __ | || | ____ _____ | | | | ____ ____
// | | | | | || | | ' ' | | || | / ____ \ | || | | |\ \| | | | | | | __ | | || | | | | | | | // | || | ____ | | | | | _ _ | | || ||_ _||_ _|| || | / \
// | | _| |_ | || | \ `--' / | || | _/ / \ \_ | || | _| |_\ |_ | | | | _| | | |_ | || | \ `--' / | | // | || ||_ \|_ _| | | | | |_ || _| | || | .' `. | | | | |_/ | |
// | | |_____| | || | `.__.' | || ||____| |____|| || ||_____|\____| | | | | |____||____| | || | `.____.' | | // \_| | || | | | | | | || | / /\ \ | || | | \ | | | | | | |
// | | | || | | || | | || | | | | | | || | | | // |__| | | || | / .--. \ | | | | | | | || | | ' ' | | || |
// | '--------------' || '--------------' || '--------------' || '--------------' | | '--------------' || '--------------' | // / ____ \ | || | | |\ \| | | | | | | __ | | || | | | | | | |
// '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' // | | _| |_ | || | \ `--' / | || | _/ / \ \_ | || | _| |_\ |_
// | | | | _| | | |_ | || | \ `--' / | | | | |_____| | || | `.__.'
// | || ||____| |____|| || ||_____|\____| | | | | |____||____| | || | `.____.'
// | | | | | || | | || | | || | | | | |
// | || | | | | '--------------' || '--------------' ||
// '--------------' || '--------------' | | '--------------' || '--------------'
// |
// '----------------' '----------------' '----------------'
// '----------------' '----------------' '----------------'
// Email : z5261243@unsw.edu.au // Email : z5261243@unsw.edu.au
// hhoanhtuann@gmail.com // hhoanhtuann@gmail.com

View File

@ -1,16 +1,18 @@
#include <stdio.h>
#include <stdbool.h>
#include "Graph.h" #include "Graph.h"
#include <stdbool.h>
#include <stdio.h>
#define MAX_NODES 1000 #define MAX_NODES 1000
int visited[MAX_NODES]; // array to store visiting order int visited[MAX_NODES]; // array to store visiting order
// indexed by vertex 0..nV-1 // indexed by vertex 0..nV-1
bool dfsPathCheck(Graph g, int nV, Vertex v, Vertex dest) { bool dfsPathCheck(Graph g, int nV, Vertex v, Vertex dest)
{
Vertex w; Vertex w;
for (w = 0; w < nV; w++) for (w = 0; w < nV; w++)
if (adjacent(g, v, w) && visited[w] == -1) { if (adjacent(g, v, w) && visited[w] == -1)
{
visited[w] = v; visited[w] = v;
if (w == dest) if (w == dest)
return true; return true;
@ -20,7 +22,8 @@ bool dfsPathCheck(Graph g, int nV, Vertex v, Vertex dest) {
return false; return false;
} }
bool findPathDFS(Graph g, int nV, Vertex src, Vertex dest) { bool findPathDFS(Graph g, int nV, Vertex src, Vertex dest)
{
Vertex v; Vertex v;
for (v = 0; v < nV; v++) for (v = 0; v < nV; v++)
visited[v] = -1; visited[v] = -1;
@ -28,25 +31,46 @@ bool findPathDFS(Graph g, int nV, Vertex src, Vertex dest) {
return dfsPathCheck(g, nV, src, dest); return dfsPathCheck(g, nV, src, dest);
} }
int main(void) { int main(void)
{
int V = 6; int V = 6;
Graph g = newGraph(V); Graph g = newGraph(V);
Edge e; Edge e;
e.v = 0; e.w = 1; insertEdge(g, e); e.v = 0;
e.v = 0; e.w = 4; insertEdge(g, e); e.w = 1;
e.v = 0; e.w = 5; insertEdge(g, e); insertEdge(g, e);
e.v = 5; e.w = 4; insertEdge(g, e); e.v = 0;
e.v = 4; e.w = 2; insertEdge(g, e); e.w = 4;
e.v = 4; e.w = 3; insertEdge(g, e); insertEdge(g, e);
e.v = 5; e.w = 3; insertEdge(g, e); e.v = 0;
e.v = 1; e.w = 2; insertEdge(g, e); e.w = 5;
e.v = 3; e.w = 2; insertEdge(g, e); insertEdge(g, e);
e.v = 5;
e.w = 4;
insertEdge(g, e);
e.v = 4;
e.w = 2;
insertEdge(g, e);
e.v = 4;
e.w = 3;
insertEdge(g, e);
e.v = 5;
e.w = 3;
insertEdge(g, e);
e.v = 1;
e.w = 2;
insertEdge(g, e);
e.v = 3;
e.w = 2;
insertEdge(g, e);
int src = 0, dest = 5; int src = 0, dest = 5;
if (findPathDFS(g, V, src, dest)) { if (findPathDFS(g, V, src, dest))
{
Vertex v = dest; Vertex v = dest;
while (v != src) { while (v != src)
{
printf("%d - ", v); printf("%d - ", v);
v = visited[v]; v = visited[v];
} }
@ -55,20 +79,26 @@ int main(void) {
return 0; return 0;
} }
// By // By
// .----------------. .----------------. .----------------. .-----------------. .----------------. .----------------. // .----------------. .----------------. .----------------.
// | .--------------. || .--------------. || .--------------. || .--------------. | | .--------------. || .--------------. | // .-----------------. .----------------. .----------------.
// | | _________ | || | _____ _____ | || | __ | || | ____ _____ | | | | ____ ____ | || | ____ | | // | .--------------. || .--------------. || .--------------. ||
// | | | _ _ | | || ||_ _||_ _|| || | / \ | || ||_ \|_ _| | | | | |_ || _| | || | .' `. | | // .--------------. | | .--------------. || .--------------. | | | _________ |
// | | |_/ | | \_| | || | | | | | | || | / /\ \ | || | | \ | | | | | | | |__| | | || | / .--. \ | | // || | _____ _____ | || | __ | || | ____ _____ | | | | ____ ____
// | | | | | || | | ' ' | | || | / ____ \ | || | | |\ \| | | | | | | __ | | || | | | | | | | // | || | ____ | | | | | _ _ | | || ||_ _||_ _|| || | / \
// | | _| |_ | || | \ `--' / | || | _/ / \ \_ | || | _| |_\ |_ | | | | _| | | |_ | || | \ `--' / | | // | || ||_ \|_ _| | | | | |_ || _| | || | .' `. | | | | |_/ | |
// | | |_____| | || | `.__.' | || ||____| |____|| || ||_____|\____| | | | | |____||____| | || | `.____.' | | // \_| | || | | | | | | || | / /\ \ | || | | \ | | | | | | |
// | | | || | | || | | || | | | | | | || | | | // |__| | | || | / .--. \ | | | | | | | || | | ' ' | | || |
// | '--------------' || '--------------' || '--------------' || '--------------' | | '--------------' || '--------------' | // / ____ \ | || | | |\ \| | | | | | | __ | | || | | | | | | |
// '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' // | | _| |_ | || | \ `--' / | || | _/ / \ \_ | || | _| |_\ |_
// | | | | _| | | |_ | || | \ `--' / | | | | |_____| | || | `.__.'
// | || ||____| |____|| || ||_____|\____| | | | | |____||____| | || | `.____.'
// | | | | | || | | || | | || | | | | |
// | || | | | | '--------------' || '--------------' ||
// '--------------' || '--------------' | | '--------------' || '--------------'
// |
// '----------------' '----------------' '----------------'
// '----------------' '----------------' '----------------'
// Email : z5261243@unsw.edu.au // Email : z5261243@unsw.edu.au
// hhoanhtuann@gmail.com // hhoanhtuann@gmail.com

View File

@ -1,10 +1,11 @@
#include <stdio.h>
#include <stdbool.h>
#include "Graph.h" #include "Graph.h"
#include <stdbool.h>
#include <stdio.h>
// Return the number of vertices that v is // Return the number of vertices that v is
// connected to // connected to
int degree(Graph g, int nV, Vertex v) { int degree(Graph g, int nV, Vertex v)
{
int deg = 0; int deg = 0;
Vertex w; Vertex w;
for (w = 0; w < nV; w++) for (w = 0; w < nV; w++)
@ -15,11 +16,15 @@ int degree(Graph g, int nV, Vertex v) {
// If start from vertex v, decide if the // If start from vertex v, decide if the
// graph has euler path // graph has euler path
bool hasEulerPath(Graph g, int nV, Vertex v, Vertex w) { bool hasEulerPath(Graph g, int nV, Vertex v, Vertex w)
if (v != w) { {
if (v != w)
{
if (degree(g, nV, v) % 2 == 0 || degree(g, nV, w) % 2 == 0) if (degree(g, nV, v) % 2 == 0 || degree(g, nV, w) % 2 == 0)
return false; return false;
} else if (degree(g, nV, v) % 2 != 0) { }
else if (degree(g, nV, v) % 2 != 0)
{
return false; return false;
} }
Vertex x; Vertex x;
@ -29,7 +34,8 @@ bool hasEulerPath(Graph g, int nV, Vertex v, Vertex w) {
return true; return true;
} }
int main(void) { int main(void)
{
Edge e; Edge e;
int n; int n;
@ -44,7 +50,8 @@ int main(void) {
scanf("%d", &dest); scanf("%d", &dest);
printf("Enter an edge (from): "); printf("Enter an edge (from): ");
while (scanf("%d", &e.v) == 1) { while (scanf("%d", &e.v) == 1)
{
printf("Enter an edge (to): "); printf("Enter an edge (to): ");
scanf("%d", &e.w); scanf("%d", &e.w);
insertEdge(g, e); insertEdge(g, e);
@ -63,20 +70,26 @@ int main(void) {
return 0; return 0;
} }
// By // By
// .----------------. .----------------. .----------------. .-----------------. .----------------. .----------------. // .----------------. .----------------. .----------------.
// | .--------------. || .--------------. || .--------------. || .--------------. | | .--------------. || .--------------. | // .-----------------. .----------------. .----------------.
// | | _________ | || | _____ _____ | || | __ | || | ____ _____ | | | | ____ ____ | || | ____ | | // | .--------------. || .--------------. || .--------------. ||
// | | | _ _ | | || ||_ _||_ _|| || | / \ | || ||_ \|_ _| | | | | |_ || _| | || | .' `. | | // .--------------. | | .--------------. || .--------------. | | | _________ |
// | | |_/ | | \_| | || | | | | | | || | / /\ \ | || | | \ | | | | | | | |__| | | || | / .--. \ | | // || | _____ _____ | || | __ | || | ____ _____ | | | | ____ ____
// | | | | | || | | ' ' | | || | / ____ \ | || | | |\ \| | | | | | | __ | | || | | | | | | | // | || | ____ | | | | | _ _ | | || ||_ _||_ _|| || | / \
// | | _| |_ | || | \ `--' / | || | _/ / \ \_ | || | _| |_\ |_ | | | | _| | | |_ | || | \ `--' / | | // | || ||_ \|_ _| | | | | |_ || _| | || | .' `. | | | | |_/ | |
// | | |_____| | || | `.__.' | || ||____| |____|| || ||_____|\____| | | | | |____||____| | || | `.____.' | | // \_| | || | | | | | | || | / /\ \ | || | | \ | | | | | | |
// | | | || | | || | | || | | | | | | || | | | // |__| | | || | / .--. \ | | | | | | | || | | ' ' | | || |
// | '--------------' || '--------------' || '--------------' || '--------------' | | '--------------' || '--------------' | // / ____ \ | || | | |\ \| | | | | | | __ | | || | | | | | | |
// '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' // | | _| |_ | || | \ `--' / | || | _/ / \ \_ | || | _| |_\ |_
// | | | | _| | | |_ | || | \ `--' / | | | | |_____| | || | `.__.'
// | || ||____| |____|| || ||_____|\____| | | | | |____||____| | || | `.____.'
// | | | | | || | | || | | || | | | | |
// | || | | | | '--------------' || '--------------' ||
// '--------------' || '--------------' | | '--------------' || '--------------'
// |
// '----------------' '----------------' '----------------'
// '----------------' '----------------' '----------------'
// Email : z5261243@unsw.edu.au // Email : z5261243@unsw.edu.au
// hhoanhtuann@gmail.com // hhoanhtuann@gmail.com

View File

@ -1,24 +1,31 @@
#include <stdio.h>
#include <stdbool.h>
#include "Graph.h" #include "Graph.h"
#include <stdbool.h>
#include <stdio.h>
#define MAX_NODES 1000 #define MAX_NODES 1000
bool visited[MAX_NODES]; bool visited[MAX_NODES];
bool hamiltonR(Graph g, int nV, Vertex v, Vertex dest, int d) { bool hamiltonR(Graph g, int nV, Vertex v, Vertex dest, int d)
{
// v = current vertex considered // v = current vertex considered
// dest = destination vertex // dest = destination vertex
// d = distance "remaining" until path found // d = distance "remaining" until path found
Vertex w; Vertex w;
if (v == dest) { if (v == dest)
{
return (d == 0); return (d == 0);
} else { }
else
{
visited[v] = true; visited[v] = true;
for (w = 0; w < nV; w++) { for (w = 0; w < nV; w++)
if (adjacent(g, v, w) && !visited[w]) { {
if (hamiltonR(g, nV, w, dest, d-1)) { if (adjacent(g, v, w) && !visited[w])
{
if (hamiltonR(g, nV, w, dest, d - 1))
{
return true; return true;
} }
} }
@ -28,14 +35,16 @@ bool hamiltonR(Graph g, int nV, Vertex v, Vertex dest, int d) {
return false; return false;
} }
bool hasHamiltonianPath(Graph g, int nV, Vertex src, Vertex dest) { bool hasHamiltonianPath(Graph g, int nV, Vertex src, Vertex dest)
{
Vertex v; Vertex v;
for (v = 0; v < nV; v++) for (v = 0; v < nV; v++)
visited[v] = false; visited[v] = false;
return hamiltonR(g, nV, src, dest, nV - 1); return hamiltonR(g, nV, src, dest, nV - 1);
} }
int main(void) { int main(void)
{
Edge e; Edge e;
int n; int n;
@ -50,7 +59,8 @@ int main(void) {
scanf("%d", &dest); scanf("%d", &dest);
printf("Enter an edge (from): "); printf("Enter an edge (from): ");
while (scanf("%d", &e.v) == 1) { while (scanf("%d", &e.v) == 1)
{
printf("Enter an edge (to): "); printf("Enter an edge (to): ");
scanf("%d", &e.w); scanf("%d", &e.w);
insertEdge(g, e); insertEdge(g, e);
@ -69,19 +79,26 @@ int main(void) {
return 0; return 0;
} }
// By // By
// .----------------. .----------------. .----------------. .-----------------. .----------------. .----------------. // .----------------. .----------------. .----------------.
// | .--------------. || .--------------. || .--------------. || .--------------. | | .--------------. || .--------------. | // .-----------------. .----------------. .----------------.
// | | _________ | || | _____ _____ | || | __ | || | ____ _____ | | | | ____ ____ | || | ____ | | // | .--------------. || .--------------. || .--------------. ||
// | | | _ _ | | || ||_ _||_ _|| || | / \ | || ||_ \|_ _| | | | | |_ || _| | || | .' `. | | // .--------------. | | .--------------. || .--------------. | | | _________ |
// | | |_/ | | \_| | || | | | | | | || | / /\ \ | || | | \ | | | | | | | |__| | | || | / .--. \ | | // || | _____ _____ | || | __ | || | ____ _____ | | | | ____ ____
// | | | | | || | | ' ' | | || | / ____ \ | || | | |\ \| | | | | | | __ | | || | | | | | | | // | || | ____ | | | | | _ _ | | || ||_ _||_ _|| || | / \
// | | _| |_ | || | \ `--' / | || | _/ / \ \_ | || | _| |_\ |_ | | | | _| | | |_ | || | \ `--' / | | // | || ||_ \|_ _| | | | | |_ || _| | || | .' `. | | | | |_/ | |
// | | |_____| | || | `.__.' | || ||____| |____|| || ||_____|\____| | | | | |____||____| | || | `.____.' | | // \_| | || | | | | | | || | / /\ \ | || | | \ | | | | | | |
// | | | || | | || | | || | | | | | | || | | | // |__| | | || | / .--. \ | | | | | | | || | | ' ' | | || |
// | '--------------' || '--------------' || '--------------' || '--------------' | | '--------------' || '--------------' | // / ____ \ | || | | |\ \| | | | | | | __ | | || | | | | | | |
// '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' // | | _| |_ | || | \ `--' / | || | _/ / \ \_ | || | _| |_\ |_
// | | | | _| | | |_ | || | \ `--' / | | | | |_____| | || | `.__.'
// | || ||____| |____|| || ||_____|\____| | | | | |____||____| | || | `.____.'
// | | | | | || | | || | | || | | | | |
// | || | | | | '--------------' || '--------------' ||
// '--------------' || '--------------' | | '--------------' || '--------------'
// |
// '----------------' '----------------' '----------------'
// '----------------' '----------------' '----------------'
// Email : z5261243@unsw.edu.au // Email : z5261243@unsw.edu.au
// hhoanhtuann@gmail.com // hhoanhtuann@gmail.com

View File

@ -102,8 +102,7 @@ void KruskalMST(struct Graph* graph)
qsort(graph->edge, graph->E, sizeof(graph->edge[0]), myComp); qsort(graph->edge, graph->E, sizeof(graph->edge[0]), myComp);
// Allocate memory for creating V ssubsets // Allocate memory for creating V ssubsets
struct subset *subsets = struct subset *subsets = (struct subset *)malloc(V * sizeof(struct subset));
(struct subset*) malloc( V * sizeof(struct subset) );
// Create V subsets with single elements // Create V subsets with single elements
for (int v = 0; v < V; ++v) for (int v = 0; v < V; ++v)
@ -157,7 +156,6 @@ int main()
int E = 5; // Number of edges in graph int E = 5; // Number of edges in graph
struct Graph *graph = createGraph(V, E); struct Graph *graph = createGraph(V, E);
// add edge 0-1 // add edge 0-1
graph->edge[0].src = 0; graph->edge[0].src = 0;
graph->edge[0].dest = 1; graph->edge[0].dest = 1;

View File

@ -1,22 +1,25 @@
// Queue ADT implementation ... COMP2521 // Queue ADT implementation ... COMP2521
#include <stdlib.h>
#include <assert.h>
#include "queue.h" #include "queue.h"
#include <assert.h>
#include <stdlib.h>
typedef struct node { typedef struct node
{
int data; int data;
struct node *next; struct node *next;
} NodeT; } NodeT;
typedef struct QueueRep { typedef struct QueueRep
{
int length; int length;
NodeT *head; NodeT *head;
NodeT *tail; NodeT *tail;
} QueueRep; } QueueRep;
// set up empty queue // set up empty queue
queue newQueue() { queue newQueue()
{
queue Q = malloc(sizeof(QueueRep)); queue Q = malloc(sizeof(QueueRep));
Q->length = 0; Q->length = 0;
Q->head = NULL; Q->head = NULL;
@ -25,9 +28,11 @@ queue newQueue() {
} }
// remove unwanted queue // remove unwanted queue
void dropQueue(queue Q) { void dropQueue(queue Q)
{
NodeT *curr = Q->head; NodeT *curr = Q->head;
while (curr != NULL) { while (curr != NULL)
{
NodeT *temp = curr->next; NodeT *temp = curr->next;
free(curr); free(curr);
curr = temp; curr = temp;
@ -36,20 +41,22 @@ void dropQueue(queue Q) {
} }
// check whether queue is empty // check whether queue is empty
int QueueIsEmpty(queue Q) { int QueueIsEmpty(queue Q) { return (Q->length == 0); }
return (Q->length == 0);
}
// insert an int at end of queue // insert an int at end of queue
void QueueEnqueue(queue Q, int v) { void QueueEnqueue(queue Q, int v)
{
NodeT *new = malloc(sizeof(NodeT)); NodeT *new = malloc(sizeof(NodeT));
assert(new != NULL); assert(new != NULL);
new->data = v; new->data = v;
new->next = NULL; new->next = NULL;
if (Q->tail != NULL) { if (Q->tail != NULL)
{
Q->tail->next = new; Q->tail->next = new;
Q->tail = new; Q->tail = new;
} else { }
else
{
Q->head = new; Q->head = new;
Q->tail = new; Q->tail = new;
} }
@ -57,11 +64,13 @@ void QueueEnqueue(queue Q, int v) {
} }
// remove int from front of queue // remove int from front of queue
int QueueDequeue(queue Q) { int QueueDequeue(queue Q)
{
assert(Q->length > 0); assert(Q->length > 0);
NodeT *p = Q->head; NodeT *p = Q->head;
Q->head = Q->head->next; Q->head = Q->head->next;
if (Q->head == NULL) { if (Q->head == NULL)
{
Q->tail = NULL; Q->tail = NULL;
} }
Q->length--; Q->length--;
@ -70,19 +79,26 @@ int QueueDequeue(queue Q) {
return d; return d;
} }
// By // By
// .----------------. .----------------. .----------------. .-----------------. .----------------. .----------------. // .----------------. .----------------. .----------------.
// | .--------------. || .--------------. || .--------------. || .--------------. | | .--------------. || .--------------. | // .-----------------. .----------------. .----------------.
// | | _________ | || | _____ _____ | || | __ | || | ____ _____ | | | | ____ ____ | || | ____ | | // | .--------------. || .--------------. || .--------------. ||
// | | | _ _ | | || ||_ _||_ _|| || | / \ | || ||_ \|_ _| | | | | |_ || _| | || | .' `. | | // .--------------. | | .--------------. || .--------------. | | | _________ |
// | | |_/ | | \_| | || | | | | | | || | / /\ \ | || | | \ | | | | | | | |__| | | || | / .--. \ | | // || | _____ _____ | || | __ | || | ____ _____ | | | | ____ ____
// | | | | | || | | ' ' | | || | / ____ \ | || | | |\ \| | | | | | | __ | | || | | | | | | | // | || | ____ | | | | | _ _ | | || ||_ _||_ _|| || | / \
// | | _| |_ | || | \ `--' / | || | _/ / \ \_ | || | _| |_\ |_ | | | | _| | | |_ | || | \ `--' / | | // | || ||_ \|_ _| | | | | |_ || _| | || | .' `. | | | | |_/ | |
// | | |_____| | || | `.__.' | || ||____| |____|| || ||_____|\____| | | | | |____||____| | || | `.____.' | | // \_| | || | | | | | | || | / /\ \ | || | | \ | | | | | | |
// | | | || | | || | | || | | | | | | || | | | // |__| | | || | / .--. \ | | | | | | | || | | ' ' | | || |
// | '--------------' || '--------------' || '--------------' || '--------------' | | '--------------' || '--------------' | // / ____ \ | || | | |\ \| | | | | | | __ | | || | | | | | | |
// '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' // | | _| |_ | || | \ `--' / | || | _/ / \ \_ | || | _| |_\ |_
// | | | | _| | | |_ | || | \ `--' / | | | | |_____| | || | `.__.'
// | || ||____| |____|| || ||_____|\____| | | | | |____||____| | || | `.____.'
// | | | | | || | | || | | || | | | | |
// | || | | | | '--------------' || '--------------' ||
// '--------------' || '--------------' | | '--------------' || '--------------'
// |
// '----------------' '----------------' '----------------'
// '----------------' '----------------' '----------------'
// Email : z5261243@unsw.edu.au // Email : z5261243@unsw.edu.au
// hhoanhtuann@gmail.com // hhoanhtuann@gmail.com

View File

@ -8,19 +8,26 @@ int QueueIsEmpty(queue); // check whether queue is empty
void QueueEnqueue(queue, int); // insert an int at end of queue void QueueEnqueue(queue, int); // insert an int at end of queue
int QueueDequeue(queue); // remove int from front of queue int QueueDequeue(queue); // remove int from front of queue
// By // By
// .----------------. .----------------. .----------------. .-----------------. .----------------. .----------------. // .----------------. .----------------. .----------------.
// | .--------------. || .--------------. || .--------------. || .--------------. | | .--------------. || .--------------. | // .-----------------. .----------------. .----------------.
// | | _________ | || | _____ _____ | || | __ | || | ____ _____ | | | | ____ ____ | || | ____ | | // | .--------------. || .--------------. || .--------------. ||
// | | | _ _ | | || ||_ _||_ _|| || | / \ | || ||_ \|_ _| | | | | |_ || _| | || | .' `. | | // .--------------. | | .--------------. || .--------------. | | | _________ |
// | | |_/ | | \_| | || | | | | | | || | / /\ \ | || | | \ | | | | | | | |__| | | || | / .--. \ | | // || | _____ _____ | || | __ | || | ____ _____ | | | | ____ ____
// | | | | | || | | ' ' | | || | / ____ \ | || | | |\ \| | | | | | | __ | | || | | | | | | | // | || | ____ | | | | | _ _ | | || ||_ _||_ _|| || | / \
// | | _| |_ | || | \ `--' / | || | _/ / \ \_ | || | _| |_\ |_ | | | | _| | | |_ | || | \ `--' / | | // | || ||_ \|_ _| | | | | |_ || _| | || | .' `. | | | | |_/ | |
// | | |_____| | || | `.__.' | || ||____| |____|| || ||_____|\____| | | | | |____||____| | || | `.____.' | | // \_| | || | | | | | | || | / /\ \ | || | | \ | | | | | | |
// | | | || | | || | | || | | | | | | || | | | // |__| | | || | / .--. \ | | | | | | | || | | ' ' | | || |
// | '--------------' || '--------------' || '--------------' || '--------------' | | '--------------' || '--------------' | // / ____ \ | || | | |\ \| | | | | | | __ | | || | | | | | | |
// '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' // | | _| |_ | || | \ `--' / | || | _/ / \ \_ | || | _| |_\ |_
// | | | | _| | | |_ | || | \ `--' / | | | | |_____| | || | `.__.'
// | || ||____| |____|| || ||_____|\____| | | | | |____||____| | || | `.____.'
// | | | | | || | | || | | || | | | | |
// | || | | | | '--------------' || '--------------' ||
// '--------------' || '--------------' | | '--------------' || '--------------'
// |
// '----------------' '----------------' '----------------'
// '----------------' '----------------' '----------------'
// Email : z5261243@unsw.edu.au // Email : z5261243@unsw.edu.au
// hhoanhtuann@gmail.com // hhoanhtuann@gmail.com

View File

@ -14,7 +14,9 @@ struct Graph
{ {
int numVertices; int numVertices;
int *visited; int *visited;
struct node** adjLists; // we need int** to store a two dimensional array. Similary, we need struct node** to store an array of Linked lists struct node *
*adjLists; // we need int** to store a two dimensional array. Similary,
// we need struct node** to store an array of Linked lists
}; };
// Structure to create a stack, necessary for topological sorting // Structure to create a stack, necessary for topological sorting
struct Stack struct Stack
@ -71,9 +73,11 @@ void fillOrder(int vertex, struct Graph* graph, struct Stack* stack)
struct node *adjList = graph->adjLists[vertex]; struct node *adjList = graph->adjLists[vertex];
struct node *temp = adjList; struct node *temp = adjList;
// First add all dependents (that is, children) to stack // First add all dependents (that is, children) to stack
while(temp!=NULL) { while (temp != NULL)
{
int connectedVertex = temp->vertex; int connectedVertex = temp->vertex;
if(graph->visited[connectedVertex] == 0) { if (graph->visited[connectedVertex] == 0)
{
fillOrder(connectedVertex, graph, stack); fillOrder(connectedVertex, graph, stack);
} }
temp = temp->next; temp = temp->next;
@ -84,7 +88,8 @@ void fillOrder(int vertex, struct Graph* graph, struct Stack* stack)
// Transpose the adjacency list // Transpose the adjacency list
struct Graph *transpose(struct Graph *g) struct Graph *transpose(struct Graph *g)
{ {
struct Graph* graph = createGraph(g->numVertices);//Number of vertices is same struct Graph *graph =
createGraph(g->numVertices); // Number of vertices is same
int i = 0; int i = 0;
for (i = 0; i < g->numVertices; i++) for (i = 0; i < g->numVertices; i++)
{ {
@ -98,7 +103,8 @@ struct Graph* transpose(struct Graph* g)
return graph; return graph;
} }
// Recursive dfs aproach // Recursive dfs aproach
void dfs(struct Graph* graph, int vertex) { void dfs(struct Graph *graph, int vertex)
{
struct node *adjList = graph->adjLists[vertex]; struct node *adjList = graph->adjLists[vertex];
struct node *temp = adjList; struct node *temp = adjList;
@ -107,9 +113,11 @@ void dfs(struct Graph* graph, int vertex) {
printf("%d ", vertex); printf("%d ", vertex);
// Recursively call the dfs function on all unvisited neighbours // Recursively call the dfs function on all unvisited neighbours
while(temp!=NULL) { while (temp != NULL)
{
int connectedVertex = temp->vertex; int connectedVertex = temp->vertex;
if(graph->visited[connectedVertex] == 0) { if (graph->visited[connectedVertex] == 0)
{
dfs(graph, connectedVertex); dfs(graph, connectedVertex);
} }
temp = temp->next; temp = temp->next;
@ -161,7 +169,8 @@ struct Graph* createGraph(int vertices)
graph->visited = malloc(vertices * sizeof(int)); graph->visited = malloc(vertices * sizeof(int));
int i; int i;
for (i = 0; i < vertices; i++) { for (i = 0; i < vertices; i++)
{
graph->adjLists[i] = NULL; graph->adjLists[i] = NULL;
graph->visited[i] = 0; graph->visited[i] = 0;
} }
@ -201,7 +210,8 @@ struct Stack* createStack()
// Pushes element into stack // Pushes element into stack
void push(struct Stack *stack, int element) void push(struct Stack *stack, int element)
{ {
stack->arr[++stack->top]=element;//Increment then add, as we start from -1 stack->arr[++stack->top] =
element; // Increment then add, as we start from -1
} }
// Removes element from stack, or returns INT_MIN if stack empty // Removes element from stack, or returns INT_MIN if stack empty
int pop(struct Stack *stack) int pop(struct Stack *stack)

View File

@ -14,7 +14,9 @@ struct Graph
{ {
int numVertices; int numVertices;
int *visited; int *visited;
struct node** adjLists; // we need int** to store a two dimensional array. Similary, we need struct node** to store an array of Linked lists struct node *
*adjLists; // we need int** to store a two dimensional array. Similary,
// we need struct node** to store an array of Linked lists
}; };
// Structure to create a stack, necessary for topological sorting // Structure to create a stack, necessary for topological sorting
struct Stack struct Stack
@ -69,9 +71,11 @@ void topologicalSortHelper(int vertex, struct Graph* graph, struct Stack* stack)
struct node *adjList = graph->adjLists[vertex]; struct node *adjList = graph->adjLists[vertex];
struct node *temp = adjList; struct node *temp = adjList;
// First add all dependents (that is, children) to stack // First add all dependents (that is, children) to stack
while(temp!=NULL) { while (temp != NULL)
{
int connectedVertex = temp->vertex; int connectedVertex = temp->vertex;
if(graph->visited[connectedVertex] == 0) { if (graph->visited[connectedVertex] == 0)
{
topologicalSortHelper(connectedVertex, graph, stack); topologicalSortHelper(connectedVertex, graph, stack);
} }
temp = temp->next; temp = temp->next;
@ -113,7 +117,8 @@ struct Graph* createGraph(int vertices)
graph->visited = malloc(vertices * sizeof(int)); graph->visited = malloc(vertices * sizeof(int));
int i; int i;
for (i = 0; i < vertices; i++) { for (i = 0; i < vertices; i++)
{
graph->adjLists[i] = NULL; graph->adjLists[i] = NULL;
graph->visited[i] = 0; graph->visited[i] = 0;
} }
@ -153,7 +158,8 @@ struct Stack* createStack()
// Pushes element into stack // Pushes element into stack
void push(struct Stack *stack, int element) void push(struct Stack *stack, int element)
{ {
stack->arr[++stack->top]=element;//Increment then add, as we start from -1 stack->arr[++stack->top] =
element; // Increment then add, as we start from -1
} }
// Removes element from stack, or returns INT_MIN if stack empty // Removes element from stack, or returns INT_MIN if stack empty
int pop(struct Stack *stack) int pop(struct Stack *stack)
@ -163,4 +169,3 @@ int pop(struct Stack* stack)
else else
return stack->arr[stack->top--]; return stack->arr[stack->top--];
} }

View File

@ -1,12 +1,14 @@
#include <stdio.h>
#include <stdbool.h> #include <stdbool.h>
#include <stdio.h>
#define NODES 4 #define NODES 4
int digraph[NODES][NODES]={ {0,1,1,1}, {1,0,1,0}, {0,1,0,0}, {0,0,0,0} }; int digraph[NODES][NODES] = {
{0, 1, 1, 1}, {1, 0, 1, 0}, {0, 1, 0, 0}, {0, 0, 0, 0}};
int tc[NODES][NODES]; int tc[NODES][NODES];
void warshall() { void warshall()
{
int i, s, t; int i, s, t;
for (s = 0; s < NODES; s++) for (s = 0; s < NODES; s++)
for (t = 0; t < NODES; t++) for (t = 0; t < NODES; t++)
@ -19,11 +21,14 @@ void warshall() {
tc[s][t] = 1; tc[s][t] = 1;
} }
int main(void) { int main(void)
{
warshall(); warshall();
int i, j; int i, j;
for (i = 0; i < NODES; i++) { for (i = 0; i < NODES; i++)
for (j = 0; j < NODES; j++) { {
for (j = 0; j < NODES; j++)
{
printf("%d ", tc[i][j]); printf("%d ", tc[i][j]);
} }
putchar('\n'); putchar('\n');
@ -32,17 +37,25 @@ int main(void) {
} }
// By // By
// .----------------. .----------------. .----------------. .-----------------. .----------------. .----------------. // .----------------. .----------------. .----------------.
// | .--------------. || .--------------. || .--------------. || .--------------. | | .--------------. || .--------------. | // .-----------------. .----------------. .----------------.
// | | _________ | || | _____ _____ | || | __ | || | ____ _____ | | | | ____ ____ | || | ____ | | // | .--------------. || .--------------. || .--------------. ||
// | | | _ _ | | || ||_ _||_ _|| || | / \ | || ||_ \|_ _| | | | | |_ || _| | || | .' `. | | // .--------------. | | .--------------. || .--------------. | | | _________ |
// | | |_/ | | \_| | || | | | | | | || | / /\ \ | || | | \ | | | | | | | |__| | | || | / .--. \ | | // || | _____ _____ | || | __ | || | ____ _____ | | | | ____ ____
// | | | | | || | | ' ' | | || | / ____ \ | || | | |\ \| | | | | | | __ | | || | | | | | | | // | || | ____ | | | | | _ _ | | || ||_ _||_ _|| || | / \
// | | _| |_ | || | \ `--' / | || | _/ / \ \_ | || | _| |_\ |_ | | | | _| | | |_ | || | \ `--' / | | // | || ||_ \|_ _| | | | | |_ || _| | || | .' `. | | | | |_/ | |
// | | |_____| | || | `.__.' | || ||____| |____|| || ||_____|\____| | | | | |____||____| | || | `.____.' | | // \_| | || | | | | | | || | / /\ \ | || | | \ | | | | | | |
// | | | || | | || | | || | | | | | | || | | | // |__| | | || | / .--. \ | | | | | | | || | | ' ' | | || |
// | '--------------' || '--------------' || '--------------' || '--------------' | | '--------------' || '--------------' | // / ____ \ | || | | |\ \| | | | | | | __ | | || | | | | | | |
// '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' // | | _| |_ | || | \ `--' / | || | _/ / \ \_ | || | _| |_\ |_
// | | | | _| | | |_ | || | \ `--' / | | | | |_____| | || | `.__.'
// | || ||____| |____|| || ||_____|\____| | | | | |____||____| | || | `.____.'
// | | | | | || | | || | | || | | | | |
// | || | | | | '--------------' || '--------------' ||
// '--------------' || '--------------' | | '--------------' || '--------------'
// |
// '----------------' '----------------' '----------------'
// '----------------' '----------------' '----------------'
// Email : z5261243@unsw.edu.au // Email : z5261243@unsw.edu.au
// hhoanhtuann@gmail.com // hhoanhtuann@gmail.com

View File

@ -21,8 +21,10 @@ unsigned add(hash_set_t *set, void *value)
unsigned put(hash_set_t *set, long long hash, void *value) unsigned put(hash_set_t *set, long long hash, void *value)
{ {
if (contains_hash(set, hash)) { if (contains_hash(set, hash))
if (set->keys[retrieve_index_from_hash(hash, set->capacity)] == value) { {
if (set->keys[retrieve_index_from_hash(hash, set->capacity)] == value)
{
return 0; return 0;
} }
@ -40,7 +42,10 @@ unsigned put(hash_set_t *set, long long hash, void *value)
int contains(hash_set_t *set, void *value) int contains(hash_set_t *set, void *value)
{ {
return set->keys[retrieve_index_from_hash(hash(value), set->capacity)] == value ? 1 : 0; return set->keys[retrieve_index_from_hash(hash(value), set->capacity)] ==
value
? 1
: 0;
} }
int contains_hash(hash_set_t *set, long long hash) int contains_hash(hash_set_t *set, long long hash)
@ -48,11 +53,11 @@ int contains_hash(hash_set_t *set, long long hash)
return set->keys[retrieve_index_from_hash(hash, set->capacity)] ? 1 : 0; return set->keys[retrieve_index_from_hash(hash, set->capacity)] ? 1 : 0;
} }
void delete(hash_set_t *set, void *value) { void delete (hash_set_t *set, void *value)
{
set->keys[retrieve_index_from_hash(hash(value), set->capacity)] = NULL; set->keys[retrieve_index_from_hash(hash(value), set->capacity)] = NULL;
} }
// adler_32 hash // adler_32 hash
long long hash(void *value) long long hash(void *value)
{ {
@ -62,7 +67,8 @@ long long hash(void *value)
int b = 0; int b = 0;
const int MODADLER = 65521; const int MODADLER = 65521;
for (int i = 0; str[i] != '\0'; i++) { for (int i = 0; str[i] != '\0'; i++)
{
a = (a + str[i]) % MODADLER; a = (a + str[i]) % MODADLER;
b = (b + a) % MODADLER; b = (b + a) % MODADLER;
} }
@ -79,14 +85,17 @@ void resize(hash_set_t *set)
{ {
void **keys_resized = calloc((set->capacity <<= 1), sizeof(void **)); void **keys_resized = calloc((set->capacity <<= 1), sizeof(void **));
for (int i = 0; i < set->length; i++) { for (int i = 0; i < set->length; i++)
keys_resized[retrieve_index_from_hash(hash(set->values[i]), set->capacity)] = set->values[i]; {
keys_resized[retrieve_index_from_hash(hash(set->values[i]),
set->capacity)] = set->values[i];
} }
free(set->keys); free(set->keys);
set->keys = keys_resized; set->keys = keys_resized;
void **new_values = (void **)realloc(set->values, set->capacity * sizeof(void **)); void **new_values =
(void **)realloc(set->values, set->capacity * sizeof(void **));
set->values = new_values; set->values = new_values;
} }

View File

@ -3,7 +3,8 @@
#define DEFAULT_HASH_SET_CAPACITY 1 << 10 #define DEFAULT_HASH_SET_CAPACITY 1 << 10
typedef struct { typedef struct
{
unsigned capacity; unsigned capacity;
unsigned length; unsigned length;
void **values; void **values;
@ -24,7 +25,8 @@ extern void delete(hash_set_t *set, void *value);
extern long long hash(void *value); extern long long hash(void *value);
extern unsigned retrieve_index_from_hash(const long long hash, const unsigned capacity); extern unsigned retrieve_index_from_hash(const long long hash,
const unsigned capacity);
extern void resize(hash_set_t *set); extern void resize(hash_set_t *set);

View File

@ -1,22 +1,28 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
typedef struct max_heap{ typedef struct max_heap
{
int *p; int *p;
int size; int size;
int count; int count;
} Heap; } Heap;
Heap* create_heap(Heap* heap); /*Creates a max_heap structure and returns a pointer to the struct*/ Heap *create_heap(Heap *heap); /*Creates a max_heap structure and returns a
void down_heapify(Heap* heap, int index);/*Pushes an element downwards in the heap to find its correct position*/ pointer to the struct*/
void up_heapify(Heap* heap, int index);/*Pushes an element upwards in the heap to find its correct position*/ void down_heapify(Heap *heap, int index); /*Pushes an element downwards in the
heap to find its correct position*/
void up_heapify(Heap *heap, int index); /*Pushes an element upwards in the heap
to find its correct position*/
void push(Heap *heap, int x); /*Inserts an element in the heap*/ void push(Heap *heap, int x); /*Inserts an element in the heap*/
void pop(Heap *heap); /*Removes the top element from the heap*/ void pop(Heap *heap); /*Removes the top element from the heap*/
int top(Heap* heap);/*Returns the top element of the heap or returns INT_MIN if heap is empty*/ int top(Heap *heap); /*Returns the top element of the heap or returns INT_MIN if
heap is empty*/
int empty(Heap *heap); /*Checks if heap is empty*/ int empty(Heap *heap); /*Checks if heap is empty*/
int size(Heap *heap); /*Returns the size of heap*/ int size(Heap *heap); /*Returns the size of heap*/
int main(){ int main()
{
Heap *head = create_heap(head); Heap *head = create_heap(head);
push(head, 10); push(head, 10);
printf("Pushing element : 10\n"); printf("Pushing element : 10\n");
@ -41,7 +47,8 @@ int main(){
printf("\n"); printf("\n");
return 0; return 0;
} }
Heap* create_heap(Heap* heap){ Heap *create_heap(Heap *heap)
{
heap = (Heap *)malloc(sizeof(Heap)); heap = (Heap *)malloc(sizeof(Heap));
heap->size = 1; heap->size = 1;
heap->p = (int *)malloc(heap->size * sizeof(int)); heap->p = (int *)malloc(heap->size * sizeof(int));
@ -49,37 +56,46 @@ Heap* create_heap(Heap* heap){
return heap; return heap;
} }
void down_heapify(Heap* heap, int index){ void down_heapify(Heap *heap, int index)
if(index>=heap->count)return; {
if (index >= heap->count)
return;
int left = index * 2 + 1; int left = index * 2 + 1;
int right = index * 2 + 2; int right = index * 2 + 2;
int leftflag = 0, rightflag = 0; int leftflag = 0, rightflag = 0;
int maximum = *((heap->p) + index); int maximum = *((heap->p) + index);
if(left<heap->count && maximum<*((heap->p)+left)){ if (left < heap->count && maximum < *((heap->p) + left))
{
maximum = *((heap->p) + left); maximum = *((heap->p) + left);
leftflag = 1; leftflag = 1;
} }
if(right<heap->count && maximum<*((heap->p)+right)){ if (right < heap->count && maximum < *((heap->p) + right))
{
maximum = *((heap->p) + right); maximum = *((heap->p) + right);
leftflag = 0; leftflag = 0;
rightflag = 1; rightflag = 1;
} }
if(leftflag){ if (leftflag)
{
*((heap->p) + left) = *((heap->p) + index); *((heap->p) + left) = *((heap->p) + index);
*((heap->p) + index) = maximum; *((heap->p) + index) = maximum;
down_heapify(heap, left); down_heapify(heap, left);
} }
if(rightflag){ if (rightflag)
{
*((heap->p) + right) = *((heap->p) + index); *((heap->p) + right) = *((heap->p) + index);
*((heap->p) + index) = maximum; *((heap->p) + index) = maximum;
down_heapify(heap, right); down_heapify(heap, right);
} }
} }
void up_heapify(Heap* heap, int index){ void up_heapify(Heap *heap, int index)
{
int parent = (index - 1) / 2; int parent = (index - 1) / 2;
if(parent<0)return; if (parent < 0)
if(*((heap->p)+index)>*((heap->p)+parent)){ return;
if (*((heap->p) + index) > *((heap->p) + parent))
{
int temp = *((heap->p) + index); int temp = *((heap->p) + index);
*((heap->p) + index) = *((heap->p) + parent); *((heap->p) + index) = *((heap->p) + parent);
*((heap->p) + parent) = temp; *((heap->p) + parent) = temp;
@ -87,36 +103,46 @@ void up_heapify(Heap* heap, int index){
} }
} }
void push(Heap* heap, int x){ void push(Heap *heap, int x)
if(heap->count>=heap->size)return; {
if (heap->count >= heap->size)
return;
*((heap->p) + heap->count) = x; *((heap->p) + heap->count) = x;
heap->count++; heap->count++;
if(4*heap->count >= 3*heap->size){ if (4 * heap->count >= 3 * heap->size)
{
heap->size *= 2; heap->size *= 2;
(heap->p) = (int *)realloc((heap->p), (heap->size) * sizeof(int)); (heap->p) = (int *)realloc((heap->p), (heap->size) * sizeof(int));
} }
up_heapify(heap, heap->count - 1); up_heapify(heap, heap->count - 1);
} }
void pop(Heap* heap){ void pop(Heap *heap)
if(heap->count==0)return; {
if (heap->count == 0)
return;
heap->count--; heap->count--;
int temp = *((heap->p) + heap->count); int temp = *((heap->p) + heap->count);
*((heap->p) + heap->count) = *(heap->p); *((heap->p) + heap->count) = *(heap->p);
*(heap->p) = temp; *(heap->p) = temp;
down_heapify(heap, 0); down_heapify(heap, 0);
if(4*heap->count<=heap->size){ if (4 * heap->count <= heap->size)
{
heap->size /= 2; heap->size /= 2;
(heap->p) = (int *)realloc((heap->p), (heap->size) * sizeof(int)); (heap->p) = (int *)realloc((heap->p), (heap->size) * sizeof(int));
} }
} }
int top(Heap* heap){ int top(Heap *heap)
if(heap->count!=0)return *(heap->p); {
else return INT_MIN; if (heap->count != 0)
return *(heap->p);
else
return INT_MIN;
} }
int empty(Heap* heap){ int empty(Heap *heap)
if(heap->count!=0)return 0; {
else return 1; if (heap->count != 0)
} return 0;
int size(Heap* heap){ else
return heap->count; return 1;
} }
int size(Heap *heap) { return heap->count; }

View File

@ -1,22 +1,28 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
typedef struct min_heap{ typedef struct min_heap
{
int *p; int *p;
int size; int size;
int count; int count;
} Heap; } Heap;
Heap* create_heap(Heap* heap); /*Creates a min_heap structure and returns a pointer to the struct*/ Heap *create_heap(Heap *heap); /*Creates a min_heap structure and returns a
void down_heapify(Heap* heap, int index);/*Pushes an element downwards in the heap to find its correct position*/ pointer to the struct*/
void up_heapify(Heap* heap, int index);/*Pushes an element upwards in the heap to find its correct position*/ void down_heapify(Heap *heap, int index); /*Pushes an element downwards in the
heap to find its correct position*/
void up_heapify(Heap *heap, int index); /*Pushes an element upwards in the heap
to find its correct position*/
void push(Heap *heap, int x); /*Inserts an element in the heap*/ void push(Heap *heap, int x); /*Inserts an element in the heap*/
void pop(Heap *heap); /*Removes the top element from the heap*/ void pop(Heap *heap); /*Removes the top element from the heap*/
int top(Heap* heap);/*Returns the top element of the heap or returns INT_MIN if heap is empty*/ int top(Heap *heap); /*Returns the top element of the heap or returns INT_MIN if
heap is empty*/
int empty(Heap *heap); /*Checks if heap is empty*/ int empty(Heap *heap); /*Checks if heap is empty*/
int size(Heap *heap); /*Returns the size of heap*/ int size(Heap *heap); /*Returns the size of heap*/
int main(){ int main()
{
Heap *head = create_heap(head); Heap *head = create_heap(head);
push(head, 10); push(head, 10);
printf("Pushing element : 10\n"); printf("Pushing element : 10\n");
@ -41,7 +47,8 @@ int main(){
printf("\n"); printf("\n");
return 0; return 0;
} }
Heap* create_heap(Heap* heap){ Heap *create_heap(Heap *heap)
{
heap = (Heap *)malloc(sizeof(Heap)); heap = (Heap *)malloc(sizeof(Heap));
heap->size = 1; heap->size = 1;
heap->p = (int *)malloc(heap->size * sizeof(int)); heap->p = (int *)malloc(heap->size * sizeof(int));
@ -49,37 +56,46 @@ Heap* create_heap(Heap* heap){
return heap; return heap;
} }
void down_heapify(Heap* heap, int index){ void down_heapify(Heap *heap, int index)
if(index>=heap->count)return; {
if (index >= heap->count)
return;
int left = index * 2 + 1; int left = index * 2 + 1;
int right = index * 2 + 2; int right = index * 2 + 2;
int leftflag = 0, rightflag = 0; int leftflag = 0, rightflag = 0;
int minimum = *((heap->p) + index); int minimum = *((heap->p) + index);
if(left<heap->count && minimum>*((heap->p)+left)){ if (left < heap->count && minimum > *((heap->p) + left))
{
minimum = *((heap->p) + left); minimum = *((heap->p) + left);
leftflag = 1; leftflag = 1;
} }
if(right<heap->count && minimum>*((heap->p)+right)){ if (right < heap->count && minimum > *((heap->p) + right))
{
minimum = *((heap->p) + right); minimum = *((heap->p) + right);
leftflag = 0; leftflag = 0;
rightflag = 1; rightflag = 1;
} }
if(leftflag){ if (leftflag)
{
*((heap->p) + left) = *((heap->p) + index); *((heap->p) + left) = *((heap->p) + index);
*((heap->p) + index) = minimum; *((heap->p) + index) = minimum;
down_heapify(heap, left); down_heapify(heap, left);
} }
if(rightflag){ if (rightflag)
{
*((heap->p) + right) = *((heap->p) + index); *((heap->p) + right) = *((heap->p) + index);
*((heap->p) + index) = minimum; *((heap->p) + index) = minimum;
down_heapify(heap, right); down_heapify(heap, right);
} }
} }
void up_heapify(Heap* heap, int index){ void up_heapify(Heap *heap, int index)
{
int parent = (index - 1) / 2; int parent = (index - 1) / 2;
if(parent<0)return; if (parent < 0)
if(*((heap->p)+index)<*((heap->p)+parent)){ return;
if (*((heap->p) + index) < *((heap->p) + parent))
{
int temp = *((heap->p) + index); int temp = *((heap->p) + index);
*((heap->p) + index) = *((heap->p) + parent); *((heap->p) + index) = *((heap->p) + parent);
*((heap->p) + parent) = temp; *((heap->p) + parent) = temp;
@ -87,36 +103,46 @@ void up_heapify(Heap* heap, int index){
} }
} }
void push(Heap* heap, int x){ void push(Heap *heap, int x)
if(heap->count>=heap->size)return; {
if (heap->count >= heap->size)
return;
*((heap->p) + heap->count) = x; *((heap->p) + heap->count) = x;
heap->count++; heap->count++;
if(4*heap->count >= 3*heap->size){ if (4 * heap->count >= 3 * heap->size)
{
heap->size *= 2; heap->size *= 2;
(heap->p) = (int *)realloc((heap->p), (heap->size) * sizeof(int)); (heap->p) = (int *)realloc((heap->p), (heap->size) * sizeof(int));
} }
up_heapify(heap, heap->count - 1); up_heapify(heap, heap->count - 1);
} }
void pop(Heap* heap){ void pop(Heap *heap)
if(heap->count==0)return; {
if (heap->count == 0)
return;
heap->count--; heap->count--;
int temp = *((heap->p) + heap->count); int temp = *((heap->p) + heap->count);
*((heap->p) + heap->count) = *(heap->p); *((heap->p) + heap->count) = *(heap->p);
*(heap->p) = temp; *(heap->p) = temp;
down_heapify(heap, 0); down_heapify(heap, 0);
if(4*heap->count<=heap->size){ if (4 * heap->count <= heap->size)
{
heap->size /= 2; heap->size /= 2;
(heap->p) = (int *)realloc((heap->p), (heap->size) * sizeof(int)); (heap->p) = (int *)realloc((heap->p), (heap->size) * sizeof(int));
} }
} }
int top(Heap* heap){ int top(Heap *heap)
if(heap->count!=0)return *(heap->p); {
else return INT_MIN; if (heap->count != 0)
return *(heap->p);
else
return INT_MIN;
} }
int empty(Heap* heap){ int empty(Heap *heap)
if(heap->count!=0)return 0; {
else return 1; if (heap->count != 0)
} return 0;
int size(Heap* heap){ else
return heap->count; return 1;
} }
int size(Heap *heap) { return heap->count; }

View File

@ -1,22 +1,27 @@
/* Ascending priority queue using Linked List - Program to implement Ascending priority queue using Linked List */ /* Ascending priority queue using Linked List - Program to implement Ascending
* priority queue using Linked List */
/*A priority queue is a special type of queue in which each element is associated with a priority and is served according /*A priority queue is a special type of queue in which each element is
to its priority. If elements with the same priority occur, they are served according to their order in the queue. associated with a priority and is served according to its priority. If elements
with the same priority occur, they are served according to their order in the
queue.
Generally, the value of the element itself is considered for assigning the priority. Generally, the value of the element itself is considered for assigning the
priority.
For example: The element with the highest value is considered as the highest priority element. However, in other cases, For example: The element with the highest value is considered as the highest
we can assume the element with the lowest value as the highest priority element. In other cases, priority element. However, in other cases, we can assume the element with the
we can set priorities according to our needs. lowest value as the highest priority element. In other cases, we can set
priorities according to our needs.
In a queue, the first-in-first-out rule is implemented whereas, in a priority queue, the values are removed on the basis of priority. In a queue, the first-in-first-out rule is implemented whereas, in a priority
The element with the highest priority is removed first. queue, the values are removed on the basis of priority. The element with the
highest priority is removed first.
insert() - Would insert an element in a queue insert() - Would insert an element in a queue
delete() - Would delete the smallest element in the queue delete() - Would delete the smallest element in the queue
*/ */
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#define NULL ((void *)0) #define NULL ((void *)0)
@ -29,11 +34,9 @@ struct node
struct node *front, *rear; struct node *front, *rear;
/* This function initializes the queue to empty by making both front and rear as NULL */ /* This function initializes the queue to empty by making both front and rear as
void createqueue() * NULL */
{ void createqueue() { front = rear = NULL; }
front=rear=NULL ;
}
int empty() int empty()
{ {
@ -109,7 +112,6 @@ int removes()
else /* deleting any other node.*/ else /* deleting any other node.*/
follow1->next = p1->next; follow1->next = p1->next;
free(p1); free(p1);
return min; /* DONT FORGET LAST 2 STATEMENTS.*/ return min; /* DONT FORGET LAST 2 STATEMENTS.*/
} }
@ -135,10 +137,7 @@ void show()
} }
} }
void destroyqueue() void destroyqueue() { front = rear = NULL; }
{
front=rear=NULL ;
}
int main() int main()
{ {
@ -146,7 +145,6 @@ int main()
createqueue(); createqueue();
do do
{ {
printf("\n\n Menu: \n"); printf("\n\n Menu: \n");
@ -174,8 +172,7 @@ int main()
case 3: case 3:
break; break;
} }
} } while (ch != 3);
while(ch!=3) ;
destroyqueue(); destroyqueue();

View File

@ -1,6 +1,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
struct node{ struct node
{
int data; int data;
struct node *next; struct node *next;
}; };
@ -17,30 +18,37 @@ void merge()
struct node *holder1 = NULL; struct node *holder1 = NULL;
struct node *holder2 = NULL; struct node *holder2 = NULL;
//Temporary pointer variables to store the address of next node of the two input linked list // Temporary pointer variables to store the address of next node of the two
// input linked list
while (temp1 != NULL && temp2 != NULL) while (temp1 != NULL && temp2 != NULL)
{ {
holder1 = temp1->next; holder1 = temp1->next;
// Storing the address of next node of first linked list // Storing the address of next node of first linked list
temp1->next = temp2; temp1->next = temp2;
//Making the first node of first linked list point to first node of second linked list // Making the first node of first linked list point to first node of
// second linked list
if(holder1!=NULL) { if (holder1 != NULL)
//Making the first node of second linked list point to second node of first linked list {
// Making the first node of second linked list point to second node
// of first linked list
holder2 = temp2->next; holder2 = temp2->next;
temp2->next = holder1; temp2->next = holder1;
} }
temp1 = holder1; temp1 = holder1;
temp2 = holder2; temp2 = holder2;
//Updating the address location of two pointer variables temp1 and temp2 // Updating the address location of two pointer variables temp1 and
// temp2
} }
} }
void printlist(struct node *temp){ void printlist(struct node *temp)
{
printf("%d", temp->data); printf("%d", temp->data);
temp = temp->next; temp = temp->next;
while(temp!=NULL){ while (temp != NULL)
{
printf("->%d", temp->data); printf("->%d", temp->data);
temp = temp->next; temp = temp->next;
} }

View File

@ -28,8 +28,7 @@ void printMiddle(struct Node *head)
void push(struct Node **head_ref, int new_data) void push(struct Node **head_ref, int new_data)
{ {
/* allocate node */ /* allocate node */
struct Node* new_node = struct Node *new_node = (struct Node *)malloc(sizeof(struct Node));
(struct Node*) malloc(sizeof(struct Node));
/* put in the data */ /* put in the data */
new_node->data = new_data; new_node->data = new_data;

View File

@ -1,8 +1,6 @@
/* Queue using Linked List - Program to create a queue ADT using linked list. ADT should support the following operations /* Queue using Linked List - Program to create a queue ADT using linked list.
1) Createqueue ADT should support the following operations 1) Createqueue 2) Insert into the
2) Insert into the queue queue 3) Delete from the queue 4) destroyqueue
3) Delete from the queue
4) destroyqueue
*/ */
/* queue q declared globally */ /* queue q declared globally */
@ -24,11 +22,9 @@ struct queue
struct queue q; struct queue q;
/* This function initializes the queue to empty by making both front and rear as NULL */ /* This function initializes the queue to empty by making both front and rear as
void createqueue() * NULL */
{ void createqueue() { q.front = q.rear = NULL; }
q.front=q.rear=NULL ;
}
int empty() int empty()
{ {
@ -102,10 +98,7 @@ void show()
} }
} }
void destroyqueue() void destroyqueue() { q.front = q.rear = NULL; }
{
q.front=q.rear=NULL ;
}
int main() int main()
{ {
@ -140,8 +133,7 @@ int main()
case 3: case 3:
break; break;
} }
} } while (ch != 3);
while(ch!=3) ;
destroyqueue(); destroyqueue();

View File

@ -1,11 +1,12 @@
/*Includes structure for a node which can be use to make new nodes of the Linked List. /*Includes structure for a node which can be use to make new nodes of the Linked
It is assumed that the data in nodes will be an integer, though List. It is assumed that the data in nodes will be an integer, though function
function can be modified according to the data type, easily. can be modified according to the data type, easily. deleteNode deletes a node
deleteNode deletes a node when passed with a key of the node. when passed with a key of the node.
*/ */
#include <stdio.h> #include <stdio.h>
struct node struct node
{int info; {
int info;
struct node *link; struct node *link;
}; };
struct node *start = NULL; struct node *start = NULL;
@ -59,7 +60,8 @@ void viewlist()//function to display values
printf("\nlist is empty"); printf("\nlist is empty");
} }
else else
{ p=start; {
p = start;
while (p != NULL) while (p != NULL)
{ {
printf("%d ", p->info); printf("%d ", p->info);

View File

@ -24,15 +24,16 @@ int main()
case 1: case 1:
push(top); push(top);
break; break;
case 2: pop(top); case 2:
pop(top);
break; break;
case 3: display(top); case 3:
display(top);
break; break;
case 4: return 0; case 4:
return 0;
} }
} }
} }
void push(struct node *p) void push(struct node *p)
@ -44,13 +45,9 @@ void push(struct node *p)
scanf("%d", &item); scanf("%d", &item);
temp->info = item; temp->info = item;
temp->link = top; temp->link = top;
top = temp; top = temp;
printf("inserted succesfully\n"); printf("inserted succesfully\n");
} }
void pop(struct node *p) void pop(struct node *p)
@ -60,33 +57,29 @@ void pop(struct node *p)
if (top == NULL) if (top == NULL)
printf("stack is empty\n"); printf("stack is empty\n");
else{ else
{
item = top->info; item = top->info;
temp = top; temp = top;
top = top->link; top = top->link;
free(temp); free(temp);
printf("Element popped is%d\n", item); printf("Element popped is%d\n", item);
} }
} }
void display(struct node *p) void display(struct node *p)
{ {
if (top == NULL) if (top == NULL)
printf("stack is empty\n"); printf("stack is empty\n");
else else
{ printf("Elements in the stack are\n"); {
printf("Elements in the stack are\n");
while (p != NULL) while (p != NULL)
{ {
printf("%d\n", p->info); printf("%d\n", p->info);
p = p->link; p = p->link;
} }
// printf("%d\n",p->info); // printf("%d\n",p->info);
} }
} }

View File

@ -1,14 +1,15 @@
#include "list.h"
#include <assert.h> #include <assert.h>
#include <stdarg.h>
#include <stddef.h> #include <stddef.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdarg.h>
#include "list.h"
#define L List_T #define L List_T
/* Initial list */ /* Initial list */
L List_init (void) { L List_init(void)
{
L list; L list;
list = (L)malloc(sizeof(L)); list = (L)malloc(sizeof(L));
list->next = NULL; list->next = NULL;
@ -16,7 +17,8 @@ L List_init (void) {
} }
/* Push an element into top of the list */ /* Push an element into top of the list */
L List_push(L list, void *val) { L List_push(L list, void *val)
{
L new_elem = (L)malloc(sizeof(L)); L new_elem = (L)malloc(sizeof(L));
new_elem->val = val; new_elem->val = val;
new_elem->next = list; new_elem->next = list;
@ -24,7 +26,8 @@ L List_push(L list, void *val) {
} }
/* Length of list */ /* Length of list */
int List_length(L list) { int List_length(L list)
{
int n; int n;
for (n = 0; list; list = list->next) for (n = 0; list; list = list->next)
n++; n++;
@ -32,11 +35,13 @@ int List_length(L list) {
} }
/* Convert list to array */ /* Convert list to array */
void **List_toArray(L list) { void **List_toArray(L list)
{
int i, n = List_length(list); int i, n = List_length(list);
void **array = (void **)malloc((n + 1) * sizeof(*array)); void **array = (void **)malloc((n + 1) * sizeof(*array));
for(i = 0; i < n; i++) { for (i = 0; i < n; i++)
{
array[i] = list->val; array[i] = list->val;
list = list->next; list = list->next;
} }
@ -45,12 +50,14 @@ void **List_toArray(L list) {
} }
/* Create and return a list */ /* Create and return a list */
L List_list(L list, void *val, ...) { L List_list(L list, void *val, ...)
{
va_list ap; va_list ap;
L *p = &list; L *p = &list;
va_start(ap, val); va_start(ap, val);
for(; val; val = va_arg(ap, void *)) { for (; val; val = va_arg(ap, void *))
{
*p = malloc(sizeof(L)); *p = malloc(sizeof(L));
(*p)->val = val; (*p)->val = val;
p = &(*p)->next; p = &(*p)->next;
@ -61,13 +68,14 @@ L List_list(L list, void *val, ...) {
} }
/* Append 2 lists together */ /* Append 2 lists together */
L List_append(L list, L tail) { L List_append(L list, L tail)
{
L *p = &list; L *p = &list;
while((*p)->next) { while ((*p)->next)
{
p = &(*p)->next; p = &(*p)->next;
} }
*p = tail; *p = tail;
return list; return list;
} }

View File

@ -4,7 +4,8 @@
#define L List_T #define L List_T
typedef struct L *L; typedef struct L *L;
struct L { struct L
{
void *val; void *val;
L next; L next;
}; };

View File

@ -1,17 +1,19 @@
#include "list.h"
#include <assert.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <assert.h>
#include <string.h> #include <string.h>
#include "list.h"
void print_list(char **array) { void print_list(char **array)
{
int i; int i;
for (i = 0; array[i]; i++) for (i = 0; array[i]; i++)
printf("%s", array[i]); printf("%s", array[i]);
printf("\n"); printf("\n");
} }
int main() { int main()
{
List_T list1, list2, list3; List_T list1, list2, list3;
char **str1 = (char **)malloc(100 * sizeof(char *)); char **str1 = (char **)malloc(100 * sizeof(char *));

View File

@ -8,7 +8,8 @@
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// DATA STRUCTURES // DATA STRUCTURES
struct node { struct node
{
int data; int data;
struct node *next; struct node *next;
struct node *pre; struct node *pre;
@ -30,17 +31,17 @@ int isEmpty();
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// MAIN ENTRY POINT // MAIN ENTRY POINT
int main(int argc, char const *argv[]) { int main(int argc, char const *argv[])
{
create(); create();
enque(5); enque(5);
return 0; return 0;
} }
void create()
void create() { {
head = NULL; head = NULL;
tail = NULL; tail = NULL;
} }
@ -48,13 +49,17 @@ void create() {
/** /**
* Puts an item into the Queue. * Puts an item into the Queue.
*/ */
void enque(int x) { void enque(int x)
if(head == NULL) { {
if (head == NULL)
{
head = (struct node *)malloc(1 * sizeof(struct node)); head = (struct node *)malloc(1 * sizeof(struct node));
head->data = x; head->data = x;
head->pre = NULL; head->pre = NULL;
tail = head; tail = head;
} else { }
else
{
tmp = (struct node *)malloc(1 * sizeof(struct node)); tmp = (struct node *)malloc(1 * sizeof(struct node));
tmp->data = x; tmp->data = x;
tmp->next = tail; tmp->next = tail;
@ -65,12 +70,16 @@ void enque(int x) {
/** /**
* Takes the next item from the Queue. * Takes the next item from the Queue.
*/ */
int deque() { int deque()
{
int returnData = 0; int returnData = 0;
if(head == NULL) { if (head == NULL)
{
printf("ERROR: Deque from empty queue.\n"); printf("ERROR: Deque from empty queue.\n");
exit(1); exit(1);
} else { }
else
{
returnData = head->data; returnData = head->data;
if (head->pre == NULL) if (head->pre == NULL)
head = NULL; head = NULL;
@ -84,6 +93,4 @@ int deque() {
/** /**
* Returns the size of the Queue. * Returns the size of the Queue.
*/ */
int size() { int size() { return count; }
return count;
}

View File

@ -13,7 +13,8 @@
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// DATA STRUCTURES // DATA STRUCTURES
struct node { struct node
{
int data; int data;
struct node *next; struct node *next;
struct node *pre; struct node *pre;
@ -35,7 +36,8 @@ int isEmpty();
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// MAIN ENTRY POINT // MAIN ENTRY POINT
int main(int argc, char const *argv[]) { int main(int argc, char const *argv[])
{
int x, y, z; int x, y, z;
@ -70,20 +72,22 @@ int main(int argc, char const *argv[]) {
/** /**
* Initialize the stack to NULL. * Initialize the stack to NULL.
*/ */
void create() { void create() { head = NULL; }
head = NULL;
}
/** /**
* Push data onto the stack. * Push data onto the stack.
*/ */
void push(int x) { void push(int x)
if(head == NULL) { {
if (head == NULL)
{
head = (struct node *)malloc(1 * sizeof(struct node)); head = (struct node *)malloc(1 * sizeof(struct node));
head->next = NULL; head->next = NULL;
head->pre = NULL; head->pre = NULL;
head->data = x; head->data = x;
} else { }
else
{
tmp = (struct node *)malloc(1 * sizeof(struct node)); tmp = (struct node *)malloc(1 * sizeof(struct node));
tmp->data = x; tmp->data = x;
tmp->next = NULL; tmp->next = NULL;
@ -97,19 +101,25 @@ void push(int x) {
/** /**
* Pop data from the stack * Pop data from the stack
*/ */
int pop() { int pop()
{
int returnData; int returnData;
if(head == NULL) { if (head == NULL)
{
printf("ERROR: Pop from empty stack.\n"); printf("ERROR: Pop from empty stack.\n");
exit(1); exit(1);
} else { }
else
{
returnData = head->data; returnData = head->data;
if(head->pre == NULL){ if (head->pre == NULL)
{
free(head); free(head);
head = NULL; head = NULL;
} }
else { else
{
head = head->pre; head = head->pre;
free(head->next); free(head->next);
} }
@ -121,10 +131,12 @@ int pop() {
/** /**
* Returns the next value to be popped. * Returns the next value to be popped.
*/ */
int peek() { int peek()
{
if (head != NULL) if (head != NULL)
return head->data; return head->data;
else { else
{
printf("ERROR: Peeking from empty stack."); printf("ERROR: Peeking from empty stack.");
exit(1); exit(1);
} }
@ -133,14 +145,13 @@ int peek() {
/** /**
* Returns the size of the stack. * Returns the size of the stack.
*/ */
int size() { int size() { return count; }
return count;
}
/** /**
* Returns 1 if stack is empty, returns 0 if not empty. * Returns 1 if stack is empty, returns 0 if not empty.
*/ */
int isEmpty() { int isEmpty()
{
if (count == 0) if (count == 0)
return 1; return 1;
return 0; return 0;

View File

@ -1,7 +1,7 @@
#include <assert.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <assert.h>
#define SIZE 100 #define SIZE 100
@ -19,7 +19,8 @@ void push(char x) //function for pushing
struct node *p = head, *temp; struct node *p = head, *temp;
temp = (struct node *)malloc(sizeof(struct node)); temp = (struct node *)malloc(sizeof(struct node));
temp->data = x; temp->data = x;
if (head == NULL) //will be execute only one time i.e, 1st time push is called if (head ==
NULL) // will be execute only one time i.e, 1st time push is called
{ {
head = temp; head = temp;
p = head; p = head;
@ -53,11 +54,13 @@ int isBalanced(char *s)
while (s[i] != '\0') // loop for covering entire string of brackets while (s[i] != '\0') // loop for covering entire string of brackets
{ {
// printf("\t s[i]=%c\n", s[i]); //DEBUG // printf("\t s[i]=%c\n", s[i]); //DEBUG
if (s[i] == '{' || s[i] == '(' || s[i] == '[') //if opening bracket then push if (s[i] == '{' || s[i] == '(' ||
s[i] == '[') // if opening bracket then push
push(s[i]); push(s[i]);
else else
{ {
if (c <= 0) //i.e, stack is empty as only opening brackets are added to stack if (c <= 0) // i.e, stack is empty as only opening brackets are
// added to stack
return 0; return 0;
x = pop(); x = pop();
@ -71,7 +74,8 @@ int isBalanced(char *s)
i++; i++;
} }
//at end if stack is empy which means whole process has been performed correctly so return 1 // at end if stack is empy which means whole process has been performed
// correctly so return 1
return (c == 0) ? 1 : 0; return (c == 0) ? 1 : 0;
} }

View File

@ -6,9 +6,9 @@
of data hiding. of data hiding.
*/ */
#include <assert.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <assert.h>
#include "stack.h" #include "stack.h"
@ -114,18 +114,12 @@ void *pop()
/* /*
size: gets the number of elements of the stack. size: gets the number of elements of the stack.
*/ */
int size() int size() { return counter; }
{
return counter;
}
/* /*
isEmpty(): returns 1 if stack is empty otherwise 0. isEmpty(): returns 1 if stack is empty otherwise 0.
*/ */
int isEmpty() int isEmpty() { return counter == 0; }
{
return counter == 0;
}
/* /*
top: returns the top element from the stack without removing it. top: returns the top element from the stack without removing it.

View File

@ -5,7 +5,6 @@
The stack is generic and self growing. The stack is generic and self growing.
*/ */
#ifndef __STACK__ #ifndef __STACK__
#define __STACK__ #define __STACK__

View File

@ -1,9 +1,10 @@
#include "stack.h"
#include <assert.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <assert.h>
#include "stack.h"
int main() { int main()
{
Stack_T stk; Stack_T stk;
stk = Stack_init(); stk = Stack_init();
Stack_push(stk, (int *)1); Stack_push(stk, (int *)1);

View File

@ -1,23 +1,26 @@
#include "stack.h"
#include <assert.h> #include <assert.h>
#include <stddef.h> #include <stddef.h>
#include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include "stack.h" #include <stdlib.h>
#define T Stack_T #define T Stack_T
typedef struct elem { typedef struct elem
{
void *val; void *val;
struct elem *next; struct elem *next;
} elem_t; } elem_t;
struct T { struct T
{
int count; int count;
elem_t *head; elem_t *head;
}; };
/* Initial stack */ /* Initial stack */
T Stack_init (void) { T Stack_init(void)
{
T stack; T stack;
stack = (T)malloc(sizeof(T)); stack = (T)malloc(sizeof(T));
stack->count = 0; stack->count = 0;
@ -26,19 +29,22 @@ T Stack_init (void) {
} }
/* Check empty stack*/ /* Check empty stack*/
int Stack_empty(T stack) { int Stack_empty(T stack)
{
assert(stack); assert(stack);
return stack->count == 0; return stack->count == 0;
} }
/* Return size of the stack */ /* Return size of the stack */
int Stack_size(T stack) { int Stack_size(T stack)
{
assert(stack); assert(stack);
return stack->count; return stack->count;
} }
/* Push an element into the stack */ /* Push an element into the stack */
void Stack_push(T stack, void *val) { void Stack_push(T stack, void *val)
{
elem_t *t; elem_t *t;
assert(stack); assert(stack);
@ -50,7 +56,8 @@ void Stack_push(T stack, void *val) {
} }
/* Pop an element out of the stack */ /* Pop an element out of the stack */
void *Stack_pop(T stack) { void *Stack_pop(T stack)
{
void *val; void *val;
elem_t *t; elem_t *t;
@ -65,13 +72,15 @@ void *Stack_pop(T stack) {
} }
/* Print all elements in the stack */ /* Print all elements in the stack */
void Stack_print(Stack_T stack) { void Stack_print(Stack_T stack)
{
assert(stack); assert(stack);
int i, size = Stack_size(stack); int i, size = Stack_size(stack);
elem_t *current_elem = stack->head; elem_t *current_elem = stack->head;
printf("Stack [Top --- Bottom]: "); printf("Stack [Top --- Bottom]: ");
for(i = 0; i < size; ++i) { for (i = 0; i < size; ++i)
{
printf("%p ", (int *)current_elem->val); printf("%p ", (int *)current_elem->val);
current_elem = current_elem->next; current_elem = current_elem->next;
} }

View File

@ -3,8 +3,8 @@
/*-----character - 97 used for get the character from the ASCII value-----*/ /*-----character - 97 used for get the character from the ASCII value-----*/
#include <stdio.h>
#include <stdbool.h> #include <stdbool.h>
#include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
@ -26,7 +26,8 @@ TrieNode *createTrieNode()
node = malloc(sizeof(TrieNode)); node = malloc(sizeof(TrieNode));
node->isEndOfWord = false; node->isEndOfWord = false;
int i = 0; int i = 0;
while(i<ALPHABET_SIZE){ while (i < ALPHABET_SIZE)
{
node->children[i] = NULL; node->children[i] = NULL;
i++; i++;
} }
@ -95,7 +96,8 @@ void printArray(char chars[], int len)
/*---Return all the related words------*/ /*---Return all the related words------*/
void printPathsRecur(TrieNode *node, char prefix[], int filledLen) void printPathsRecur(TrieNode *node, char prefix[], int filledLen)
{ {
if (node==NULL) return; if (node == NULL)
return;
prefix[filledLen] = node->character; prefix[filledLen] = node->character;
filledLen++; filledLen++;
@ -158,7 +160,6 @@ int main()
words[word_count] = malloc(INPUT_WORD_SIZE); words[word_count] = malloc(INPUT_WORD_SIZE);
} }
// Push the words in to Trie // Push the words in to Trie
TrieNode *root = NULL; TrieNode *root = NULL;
root = createTrieNode(); root = createTrieNode();
@ -173,12 +174,14 @@ int main()
printf("Enter keyword: "); printf("Enter keyword: ");
char str[100]; char str[100];
receiveInput(str); receiveInput(str);
printf("\n==========================================================\n"); printf(
"\n==========================================================\n");
printf("\n********************* Possible Words ********************\n"); printf("\n********************* Possible Words ********************\n");
// Find the word through the Trie // Find the word through the Trie
traverse(str, root); traverse(str, root);
printf("\n==========================================================\n"); printf(
"\n==========================================================\n");
} }
} }

View File

@ -1,6 +1,6 @@
#include <string.h>
#include <stdio.h>
#include <ctype.h> #include <ctype.h>
#include <stdio.h>
#include <string.h>
char *abbreviate(const char *phrase) char *abbreviate(const char *phrase)
{ {

View File

@ -5,7 +5,8 @@
#define MAX_WORD_LENGTH 50 // no individual word can exceed this length #define MAX_WORD_LENGTH 50 // no individual word can exceed this length
// results structure // results structure
typedef struct word_count_word { typedef struct word_count_word
{
char text[MAX_WORD_LENGTH]; char text[MAX_WORD_LENGTH];
int count; int count;
} word_count_word_t; } word_count_word_t;
@ -13,8 +14,8 @@ typedef struct word_count_word {
#define EXCESSIVE_LENGTH_WORD -1 #define EXCESSIVE_LENGTH_WORD -1
#define EXCESSIVE_NUMBER_OF_WORDS -2 #define EXCESSIVE_NUMBER_OF_WORDS -2
// word_count - routine to classify the unique words and their frequency in a test input string // word_count - routine to classify the unique words and their frequency in a
// inputs: // test input string inputs:
// input_text = a null-terminated string containing that is analyzed // input_text = a null-terminated string containing that is analyzed
// //
// outputs: // outputs:

View File

@ -12,43 +12,48 @@ int dist[MAX];
int q[MAX]; int q[MAX];
int qp = 0; int qp = 0;
void enqueue (int v) { void enqueue(int v) { q[qp++] = v; }
q[qp++] = v;
}
int cf (void *a, void *b) { int cf(void *a, void *b)
{
int *x = (int *)a; int *x = (int *)a;
int *y = (int *)b; int *y = (int *)b;
return *y - *x; return *y - *x;
} }
int dequeue () { int dequeue()
{
qsort(q, qp, sizeof(int), cf); qsort(q, qp, sizeof(int), cf);
return q[--qp]; return q[--qp];
} }
int queue_has_something () { int queue_has_something() { return (qp > 0); }
return (qp > 0);
}
int visited[MAX]; int visited[MAX];
int vp = 0; int vp = 0;
void dijkstra (int s) { void dijkstra(int s)
{
dist[s] = 0; dist[s] = 0;
int i; int i;
for (i = 0; i < V; ++i) { for (i = 0; i < V; ++i)
if (i != s) { {
if (i != s)
{
dist[i] = INF; dist[i] = INF;
} }
enqueue(i); enqueue(i);
} }
while (queue_has_something()) { while (queue_has_something())
{
int u = dequeue(); int u = dequeue();
visited[vp++] = u; visited[vp++] = u;
for (i = 0; i < V; ++i) { for (i = 0; i < V; ++i)
if (mat[u][i]) { {
if (dist[i] > dist[u] + mat[u][i]) { if (mat[u][i])
{
if (dist[i] > dist[u] + mat[u][i])
{
dist[i] = dist[u] + mat[u][i]; dist[i] = dist[u] + mat[u][i];
} }
} }
@ -56,14 +61,17 @@ void dijkstra (int s) {
} }
} }
int main(int argc, char const *argv[]) { int main(int argc, char const *argv[])
{
printf("Enter the number of vertices: "); printf("Enter the number of vertices: ");
scanf(" %d", &V); scanf(" %d", &V);
printf("Enter the adj matrix: "); printf("Enter the adj matrix: ");
int i, j; int i, j;
for (i = 0; i < V; ++i) { for (i = 0; i < V; ++i)
for (j = 0; j < V; ++j) { {
for (j = 0; j < V; ++j)
{
scanf(" %d", &mat[i][j]); scanf(" %d", &mat[i][j]);
} }
} }
@ -71,7 +79,8 @@ int main(int argc, char const *argv[]) {
dijkstra(0); dijkstra(0);
printf("\nNode\tDist\n"); printf("\nNode\tDist\n");
for (i = 0; i < V; ++i) { for (i = 0; i < V; ++i)
{
printf("%d\t%d\n", i, dist[i]); printf("%d\t%d\n", i, dist[i]);
} }

View File

@ -65,10 +65,12 @@ int adler_32(char s[])
/* crc32 Hash-Algorithm*/ /* crc32 Hash-Algorithm*/
#include <inttypes.h> #include <inttypes.h>
uint32_t crc32(char* data){ uint32_t crc32(char *data)
{
int i = 0; int i = 0;
uint32_t crc = 0xffffffff; uint32_t crc = 0xffffffff;
while(data[i] != '\0'){ while (data[i] != '\0')
{
uint8_t byte = data[i]; uint8_t byte = data[i];
crc = crc ^ byte; crc = crc ^ byte;
for (int j = 8; j > 0; --j) for (int j = 8; j > 0; --j)

View File

@ -46,6 +46,4 @@ int adler_32(char[]);
*/ */
int crc32(char[]); int crc32(char[]);
#endif #endif

View File

@ -3,8 +3,8 @@
This file contains a simple test program for each hash-function. This file contains a simple test program for each hash-function.
*/ */
#include <stdio.h>
#include "hash.h" #include "hash.h"
#include <stdio.h>
int main(void) int main(void)
{ {

View File

@ -1,10 +1,13 @@
int* twoSum(int* nums, int numsSize, int target, int* returnSize){ int *twoSum(int *nums, int numsSize, int target, int *returnSize)
{
int i, j; int i, j;
int *ret = calloc(2, sizeof(int)); int *ret = calloc(2, sizeof(int));
for (i = 0; i < numsSize; i++) { for (i = 0; i < numsSize; i++)
{
int key = target - nums[i]; int key = target - nums[i];
for (j = i + 1; j < numsSize; j++) for (j = i + 1; j < numsSize; j++)
if (nums[j] == key) { if (nums[j] == key)
{
ret[0] = i; ret[0] = i;
ret[1] = j; ret[1] = j;
} }

View File

@ -7,14 +7,17 @@
* }; * };
*/ */
bool checkSymmetric(struct TreeNode *left, struct TreeNode *right) { bool checkSymmetric(struct TreeNode *left, struct TreeNode *right)
{
if (!left || !right) if (!left || !right)
return left == right; return left == right;
if (left->val != right->val) if (left->val != right->val)
return 0; return 0;
return checkSymmetric(left->left, right->right) && checkSymmetric(left->right, right->left); return checkSymmetric(left->left, right->right) &&
checkSymmetric(left->right, right->left);
} }
bool isSymmetric(struct TreeNode* root){ bool isSymmetric(struct TreeNode *root)
{
return root == NULL || checkSymmetric(root->left, root->right); return root == NULL || checkSymmetric(root->left, root->right);
} }

View File

@ -7,16 +7,17 @@
* }; * };
*/ */
int maxval(int a, int b) { int maxval(int a, int b)
{
if (a > b) if (a > b)
return a; return a;
else else
return b; return b;
} }
int maxDepth(struct TreeNode* root){ int maxDepth(struct TreeNode *root)
{
if (root == NULL) if (root == NULL)
return 0; return 0;
else else
return 1 + maxval(maxDepth(root->left), maxDepth(root->right)); return 1 + maxval(maxDepth(root->left), maxDepth(root->right));
} }

View File

@ -7,10 +7,12 @@
* }; * };
*/ */
struct TreeNode* convertBST(int *nums, int left, int right) { struct TreeNode *convertBST(int *nums, int left, int right)
{
if (left > right) if (left > right)
return NULL; return NULL;
else { else
{
int mid = (right + left) / 2; int mid = (right + left) / 2;
struct TreeNode *new_val = malloc(sizeof(struct TreeNode)); struct TreeNode *new_val = malloc(sizeof(struct TreeNode));
new_val->val = nums[mid]; new_val->val = nums[mid];
@ -20,10 +22,10 @@ struct TreeNode* convertBST(int *nums, int left, int right) {
} }
} }
struct TreeNode* sortedArrayToBST(int* nums, int numsSize){ struct TreeNode *sortedArrayToBST(int *nums, int numsSize)
{
if (numsSize == 0) if (numsSize == 0)
return NULL; return NULL;
else else
return convertBST(nums, 0, numsSize - 1); return convertBST(nums, 0, numsSize - 1);
} }

View File

@ -1,14 +1,18 @@
void duplicateZeros(int* arr, int arrSize){ void duplicateZeros(int *arr, int arrSize)
{
int i, start = 0; int i, start = 0;
int *tmp = malloc(arrSize * sizeof(int)); int *tmp = malloc(arrSize * sizeof(int));
/* Copy arr into tmp arr */ /* Copy arr into tmp arr */
for(i = 0; i < arrSize; i++) { for (i = 0; i < arrSize; i++)
{
tmp[i] = arr[i]; tmp[i] = arr[i];
} }
i = 0; i = 0;
for(start = 0; start < arrSize; start++) { for (start = 0; start < arrSize; start++)
{
arr[start] = tmp[i]; arr[start] = tmp[i];
if(tmp[i] == 0) { if (tmp[i] == 0)
{
start++; start++;
if (start < arrSize) if (start < arrSize)
arr[start] = 0; arr[start] = 0;
@ -16,5 +20,3 @@ void duplicateZeros(int* arr, int arrSize){
i++; i++;
} }
} }

View File

@ -1,8 +1,10 @@
struct TreeNode* buildBST(struct ListNode* head, struct ListNode* tail) { struct TreeNode *buildBST(struct ListNode *head, struct ListNode *tail)
{
if (head == tail) if (head == tail)
return NULL; return NULL;
struct ListNode *slow = head, *fast = head; struct ListNode *slow = head, *fast = head;
while(fast != tail && fast->next != tail) { while (fast != tail && fast->next != tail)
{
fast = fast->next->next; fast = fast->next->next;
slow = slow->next; slow = slow->next;
} }
@ -12,10 +14,10 @@ struct TreeNode* buildBST(struct ListNode* head, struct ListNode* tail) {
node->right = buildBST(slow->next, tail); node->right = buildBST(slow->next, tail);
return node; return node;
} }
struct TreeNode* sortedListToBST(struct ListNode* head){ struct TreeNode *sortedListToBST(struct ListNode *head)
{
if (!head) if (!head)
return NULL; return NULL;
else else
return buildBST(head, NULL); return buildBST(head, NULL);
} }

View File

@ -1,17 +1,17 @@
// Fucntion to calculate min of values a and b // Fucntion to calculate min of values a and b
int min(int a, int b){ int min(int a, int b) { return ((a < b) ? a : b); }
return ((a<b)?a:b);
}
// Two pointer approach to find maximum container area // Two pointer approach to find maximum container area
int maxArea(int* height, int heightSize){ int maxArea(int *height, int heightSize)
{
// Start with maximum container width // Start with maximum container width
int start = 0; int start = 0;
int end = heightSize - 1; int end = heightSize - 1;
int res = 0; int res = 0;
while(start<end){ while (start < end)
{
// Calculate current area by taking minimum of two heights // Calculate current area by taking minimum of two heights
int currArea = (end - start) * min(height[start], height[end]); int currArea = (end - start) * min(height[start], height[end]);
@ -22,9 +22,7 @@ int maxArea(int* height, int heightSize){
start = start + 1; start = start + 1;
else else
end = end - 1; end = end - 1;
} }
return res; return res;
} }

View File

@ -1,19 +1,19 @@
int max(int a, int b) { int max(int a, int b) { return a >= b ? a : b; }
return a >= b ? a : b;
}
int height(struct TreeNode* root) { int height(struct TreeNode *root)
{
if (root == NULL) if (root == NULL)
return 0; return 0;
else else
return 1 + max(height(root->left), height(root->right)); return 1 + max(height(root->left), height(root->right));
} }
bool isBalanced(struct TreeNode* root){ bool isBalanced(struct TreeNode *root)
{
if (root == NULL) if (root == NULL)
return 1; return 1;
int left = height(root->left); int left = height(root->left);
int right = height(root->right); int right = height(root->right);
return abs(left - right) <= 1 && isBalanced(root->left) && isBalanced(root->right); return abs(left - right) <= 1 && isBalanced(root->left) &&
isBalanced(root->right);
} }

View File

@ -1,7 +1,9 @@
bool hasPathSum(struct TreeNode* root, int sum) { bool hasPathSum(struct TreeNode *root, int sum)
{
if (root == NULL) if (root == NULL)
return 0; return 0;
if (!root->left && !root->right && sum - root->val == 0) if (!root->left && !root->right && sum - root->val == 0)
return 1; return 1;
return hasPathSum(root->left, sum - root->val) || hasPathSum(root->right, sum - root->val); return hasPathSum(root->left, sum - root->val) ||
hasPathSum(root->right, sum - root->val);
} }

View File

@ -1,12 +1,16 @@
int distanceBetweenBusStops(int* distance, int distanceSize, int start, int destination){ int distanceBetweenBusStops(int *distance, int distanceSize, int start,
int destination)
{
int sum1 = 0, sum2 = 0; int sum1 = 0, sum2 = 0;
if (start > destination) { if (start > destination)
{
int tmp = start; int tmp = start;
start = destination; start = destination;
destination = tmp; destination = tmp;
} }
for (auto i = 0; i < distanceSize; ++i) { for (auto i = 0; i < distanceSize; ++i)
{
if (i >= start && i < destination) if (i >= start && i < destination)
sum1 += distance[i]; sum1 += distance[i];
else else

View File

@ -1,4 +1,5 @@
int maxNumberOfBalloons(char * text){ int maxNumberOfBalloons(char *text)
{
/* /*
0 -> b, 0 -> b,
1 -> a, 1 -> a,
@ -9,16 +10,26 @@ int maxNumberOfBalloons(char * text){
int count_letters[5] = {0}; int count_letters[5] = {0};
int i, min_counter_ballons; int i, min_counter_ballons;
for (char *ptr = text; *ptr; ptr++) { for (char *ptr = text; *ptr; ptr++)
if (*ptr == 'b') { {
if (*ptr == 'b')
{
count_letters[0]++; count_letters[0]++;
} else if(*ptr == 'a') { }
else if (*ptr == 'a')
{
count_letters[1]++; count_letters[1]++;
} else if (*ptr == 'l') { }
else if (*ptr == 'l')
{
count_letters[2]++; count_letters[2]++;
} else if(*ptr == 'o') { }
else if (*ptr == 'o')
{
count_letters[3]++; count_letters[3]++;
} else if(*ptr == 'n') { }
else if (*ptr == 'n')
{
count_letters[4]++; count_letters[4]++;
} }
} }
@ -27,9 +38,11 @@ int maxNumberOfBalloons(char * text){
count_letters[2] /= 2; count_letters[2] /= 2;
count_letters[3] /= 2; count_letters[3] /= 2;
/* Max number of times which we can write ballon is equal to min value of letters on count_letter */ /* Max number of times which we can write ballon is equal to min value of
* letters on count_letter */
min_counter_ballons = count_letters[0]; min_counter_ballons = count_letters[0];
for (i = 1; i < 5; i++) { for (i = 1; i < 5; i++)
{
if (count_letters[i] < min_counter_ballons) if (count_letters[i] < min_counter_ballons)
min_counter_ballons = count_letters[i]; min_counter_ballons = count_letters[i];
} }

View File

@ -1,5 +1,7 @@
char *getOne(char c){ char *getOne(char c)
switch (c) { {
switch (c)
{
case '9': case '9':
return "IX"; return "IX";
@ -35,8 +37,10 @@ char *getOne(char c){
} }
} }
char *getTen(char c){ char *getTen(char c)
switch (c) { {
switch (c)
{
case '9': case '9':
return "XC"; return "XC";
@ -70,11 +74,12 @@ char *getTen(char c){
default: default:
return NULL; return NULL;
} }
} }
char *getHundred(char c){ char *getHundred(char c)
switch (c) { {
switch (c)
{
case '9': case '9':
return "CM"; return "CM";
@ -110,8 +115,10 @@ char *getHundred(char c){
} }
} }
char *getThousand(char c){ char *getThousand(char c)
switch (c) { {
switch (c)
{
case '3': case '3':
return "MMM"; return "MMM";
@ -126,10 +133,8 @@ char *getThousand(char c){
} }
} }
char *intToRoman(int num)
{
char * intToRoman(int num){
int length; int length;
char number[5]; char number[5];
char *s = malloc(16 * sizeof(char)); char *s = malloc(16 * sizeof(char));
@ -138,13 +143,16 @@ char * intToRoman(int num){
length = strlen(number); length = strlen(number);
switch (length){ switch (length)
{
case 4: case 4:
sprintf(s,"%s%s%s%s", getThousand(number[0]), getHundred(number[1]), getTen(number[2]), getOne(number[3])); sprintf(s, "%s%s%s%s", getThousand(number[0]), getHundred(number[1]),
getTen(number[2]), getOne(number[3]));
break; break;
case 3: case 3:
sprintf(s,"%s%s%s", getHundred(number[0]), getTen(number[1]), getOne(number[2])); sprintf(s, "%s%s%s", getHundred(number[0]), getTen(number[1]),
getOne(number[2]));
break; break;

View File

@ -1,12 +1,12 @@
#define MAP_SIZE 2048 #define MAP_SIZE 2048
int cmpvalue(const void *a, const void *b) { int cmpvalue(const void *a, const void *b) { return *(int *)b - *(int *)a; }
return *(int *)b - *(int *)a; bool uniqueOccurrences(int *arr, int arrSize)
} {
bool uniqueOccurrences(int* arr, int arrSize){
int *map = calloc(MAP_SIZE, sizeof(int)); int *map = calloc(MAP_SIZE, sizeof(int));
int i; int i;
for(i = 0; i < arrSize; i++) { for (i = 0; i < arrSize; i++)
{
if (arr[i] < 0) if (arr[i] < 0)
map[arr[i] + MAP_SIZE / 2] += 1; map[arr[i] + MAP_SIZE / 2] += 1;
else else
@ -16,7 +16,8 @@ bool uniqueOccurrences(int* arr, int arrSize){
Ex: 3 2 1 0 0 0 0 */ Ex: 3 2 1 0 0 0 0 */
qsort(map, MAP_SIZE, sizeof(int), cmpvalue); qsort(map, MAP_SIZE, sizeof(int), cmpvalue);
i = 0; i = 0;
while(map[i]) { while (map[i])
{
if (map[i] == map[i + 1]) if (map[i] == map[i + 1])
return 0; return 0;
i++; i++;

View File

@ -1,15 +1,15 @@
int maxcmp(int a, int b) { int maxcmp(int a, int b) { return (a >= b) ? a : b; }
return (a >= b)? a : b;
}
/* max subarray problem by using Kadane's Algorithm /* max subarray problem by using Kadane's Algorithm
*/ */
int maxProfit(int* prices, int pricesSize){ int maxProfit(int *prices, int pricesSize)
{
/* maxCur: current maximum /* maxCur: current maximum
* maxSoFar: found maximum for subarray so far * maxSoFar: found maximum for subarray so far
*/ */
int maxCur = 0, maxSoFar = 0; int maxCur = 0, maxSoFar = 0;
for(int i = 1; i < pricesSize; i++) { for (int i = 1; i < pricesSize; i++)
{
maxCur = maxcmp(0, maxCur + prices[i] - prices[i - 1]); maxCur = maxcmp(0, maxCur + prices[i] - prices[i - 1]);
maxSoFar = maxcmp(maxSoFar, maxCur); maxSoFar = maxcmp(maxSoFar, maxCur);
} }

View File

@ -1,12 +1,18 @@
bool isPalindrome(char * s){ bool isPalindrome(char *s)
{
int start = 0, end = strlen(s) - 1; int start = 0, end = strlen(s) - 1;
while(start < end) { while (start < end)
if (!isalpha(s[start]) && !isalnum(s[start])) { {
if (!isalpha(s[start]) && !isalnum(s[start]))
{
start++; start++;
} }
else if (!isalpha(s[end]) && !isalnum(s[end])) { else if (!isalpha(s[end]) && !isalnum(s[end]))
{
end--; end--;
} else { }
else
{
char c1 = tolower(s[start]); char c1 = tolower(s[start]);
char c2 = tolower(s[end]); char c2 = tolower(s[end]);
if (c1 != c2) if (c1 != c2)

View File

@ -1,10 +1,15 @@
int romanToInt(char * s){ int romanToInt(char *s)
{
int romanToInt = 0; int romanToInt = 0;
for (int i = 0; i < strlen(s); i++) { for (int i = 0; i < strlen(s); i++)
switch(s[i]) { {
switch (s[i])
{
case 'I': case 'I':
if (i+1 < strlen(s)) { if (i + 1 < strlen(s))
if (s[i + 1] == 'V' || s[i + 1] == 'X') { {
if (s[i + 1] == 'V' || s[i + 1] == 'X')
{
romanToInt -= 1; romanToInt -= 1;
break; break;
} }
@ -15,8 +20,10 @@ int romanToInt(char * s){
romanToInt += 5; romanToInt += 5;
break; break;
case 'X': case 'X':
if (i+1 < strlen(s)) { if (i + 1 < strlen(s))
if (s[i + 1] == 'L' || s[i + 1] == 'C') { {
if (s[i + 1] == 'L' || s[i + 1] == 'C')
{
romanToInt -= 10; romanToInt -= 10;
break; break;
} }
@ -27,8 +34,10 @@ int romanToInt(char * s){
romanToInt += 50; romanToInt += 50;
break; break;
case 'C': case 'C':
if (i+1 < strlen(s)) { if (i + 1 < strlen(s))
if (s[i + 1] == 'D' || s[i + 1] == 'M') { {
if (s[i + 1] == 'D' || s[i + 1] == 'M')
{
romanToInt -= 100; romanToInt -= 100;
break; break;
} }

View File

@ -1,4 +1,5 @@
int singleNumber(int* nums, int numsSize){ int singleNumber(int *nums, int numsSize)
{
int i, result = 0; int i, result = 0;
for (i = 0; i < numsSize; i++) for (i = 0; i < numsSize; i++)
result = result ^ nums[i]; result = result ^ nums[i];

View File

@ -5,12 +5,15 @@
* struct ListNode *next; * struct ListNode *next;
* }; * };
*/ */
bool hasCycle(struct ListNode *head) { bool hasCycle(struct ListNode *head)
{
struct ListNode *fast = head, *slow = head; struct ListNode *fast = head, *slow = head;
while( slow && fast && fast->next ){ while (slow && fast && fast->next)
{
fast = fast->next->next; fast = fast->next->next;
slow = slow->next; slow = slow->next;
if(fast==slow) return true; if (fast == slow)
return true;
} }
return false; return false;
} }

View File

@ -1,14 +1,18 @@
struct ListNode *detectCycle(struct ListNode *head) { struct ListNode *detectCycle(struct ListNode *head)
{
if (head == NULL || head->next == NULL) if (head == NULL || head->next == NULL)
return NULL; return NULL;
struct ListNode *slow, *fast; struct ListNode *slow, *fast;
slow = fast = head; slow = fast = head;
while(fast && fast->next) { while (fast && fast->next)
{
slow = slow->next; slow = slow->next;
fast = fast->next->next; fast = fast->next->next;
if(slow == fast) { if (slow == fast)
{
struct ListNode *entry = head; struct ListNode *entry = head;
while(slow != entry) { while (slow != entry)
{
slow = slow->next; slow = slow->next;
entry = entry->next; entry = entry->next;
} }

View File

@ -1,6 +1,8 @@
int findMin(int* nums, int numsSize){ int findMin(int *nums, int numsSize)
{
int low = 0, high = numsSize - 1; int low = 0, high = numsSize - 1;
while (low < high) { while (low < high)
{
int mid = low + (high - low) / 2; int mid = low + (high - low) / 2;
/* minimum is on left side */ /* minimum is on left side */
if (nums[mid] < nums[high]) if (nums[mid] < nums[high])

View File

@ -1,8 +1,11 @@
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) { struct ListNode *getIntersectionNode(struct ListNode *headA,
struct ListNode *headB)
{
struct ListNode *cur1 = headA, *cur2 = headB; struct ListNode *cur1 = headA, *cur2 = headB;
if (cur1 == NULL || cur2 == NULL) if (cur1 == NULL || cur2 == NULL)
return NULL; return NULL;
while (cur1 && cur2 && cur1 != cur2) { while (cur1 && cur2 && cur1 != cur2)
{
cur1 = cur1->next; cur1 = cur1->next;
cur2 = cur2->next; cur2 = cur2->next;
if (cur1 == cur2) if (cur1 == cur2)
@ -13,5 +16,4 @@ struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *he
cur2 = headA; cur2 = headA;
} }
return cur1; return cur1;
} }

View File

@ -1,13 +1,17 @@
/* Boyer-Moore Majority Vote Algorithm /* Boyer-Moore Majority Vote Algorithm
* http://www.cs.utexas.edu/~moore/best-ideas/mjrty/ */ * http://www.cs.utexas.edu/~moore/best-ideas/mjrty/ */
int majorityElement(int* nums, int numsSize){ int majorityElement(int *nums, int numsSize)
{
int count = 1; int count = 1;
int majorNum = nums[0]; int majorNum = nums[0];
for (int i = 1; i < numsSize; i++) { for (int i = 1; i < numsSize; i++)
if(count == 0) { {
if (count == 0)
{
majorNum = nums[i]; majorNum = nums[i];
count++; count++;
} else if (majorNum == nums[i]) }
else if (majorNum == nums[i])
count++; count++;
else else
count--; count--;

View File

@ -9,13 +9,15 @@
#include <limits.h> #include <limits.h>
typedef struct { typedef struct
{
int *values; int *values;
int CurrentIndex; int CurrentIndex;
int NumberOfNodes; int NumberOfNodes;
} BSTIterator; } BSTIterator;
void TraverseAndAssign(struct TreeNode *root, BSTIterator *obj) { void TraverseAndAssign(struct TreeNode *root, BSTIterator *obj)
{
if (!root) if (!root)
return; return;
if (root->left) if (root->left)
@ -26,7 +28,8 @@ void TraverseAndAssign(struct TreeNode *root, BSTIterator *obj) {
TraverseAndAssign(root->right, obj); TraverseAndAssign(root->right, obj);
} }
int TotalNodes(struct TreeNode *root) { int TotalNodes(struct TreeNode *root)
{
if (!root) if (!root)
return 0; return 0;
int nodes_left = TotalNodes(root->left); int nodes_left = TotalNodes(root->left);
@ -34,7 +37,8 @@ int TotalNodes(struct TreeNode *root) {
return nodes_left + nodes_right + 1; return nodes_left + nodes_right + 1;
} }
BSTIterator* bSTIteratorCreate(struct TreeNode* root) { BSTIterator *bSTIteratorCreate(struct TreeNode *root)
{
int n = TotalNodes(root); int n = TotalNodes(root);
int size = n + 1; int size = n + 1;
printf("%d", size); printf("%d", size);
@ -49,22 +53,26 @@ BSTIterator* bSTIteratorCreate(struct TreeNode* root) {
} }
/** @return the next smallest number */ /** @return the next smallest number */
int bSTIteratorNext(BSTIterator* obj) { int bSTIteratorNext(BSTIterator *obj)
{
int NextValue = obj->values[obj->CurrentIndex]; int NextValue = obj->values[obj->CurrentIndex];
obj->CurrentIndex++; obj->CurrentIndex++;
return NextValue; return NextValue;
} }
/** @return whether we have a next smallest number */ /** @return whether we have a next smallest number */
bool bSTIteratorHasNext(BSTIterator* obj) { bool bSTIteratorHasNext(BSTIterator *obj)
if(!obj->NumberOfNodes) { {
if (!obj->NumberOfNodes)
{
return false; return false;
} }
printf(" Here "); printf(" Here ");
return (obj->values[obj->CurrentIndex] == INT_MAX) ? false : true; return (obj->values[obj->CurrentIndex] == INT_MAX) ? false : true;
} }
void bSTIteratorFree(BSTIterator* obj) { void bSTIteratorFree(BSTIterator *obj)
{
free(obj->values); free(obj->values);
free(obj); free(obj);
} }

View File

@ -1,9 +1,12 @@
void rotate(int* nums, int numsSize, int k){ void rotate(int *nums, int numsSize, int k)
for(int i = 1; i <= k; i++){ {
for (int i = 1; i <= k; i++)
{
int j; int j;
int lastElement; int lastElement;
lastElement = nums[numsSize - 1]; lastElement = nums[numsSize - 1];
for(j = numsSize - 1; j > 0; j--){ for (j = numsSize - 1; j > 0; j--)
{
nums[j] = nums[j - 1]; nums[j] = nums[j - 1];
} }
nums[0] = lastElement; nums[0] = lastElement;

View File

@ -1,13 +1,25 @@
uint32_t reverseBits(uint32_t n) { uint32_t reverseBits(uint32_t n)
{
uint TotalBits = 32; uint TotalBits = 32;
uint32_t reverse_int = 0; // stored in memory as 32 bits, each bit valued 0 uint32_t reverse_int = 0; // stored in memory as 32 bits, each bit valued 0
uint i; uint i;
for(i = 0; i < TotalBits; i++) { for (i = 0; i < TotalBits; i++)
if((n & (UINT32_C(1) << i))) //if the bit on the ith position of 32 bit input is 1, then proceed {
//Further note the use of UINT32_C to convert 1 to unsigned 32 bit int, since just 1 is treated as int which cannot be shifted left more than 30 times if ((n &
reverse_int = reverse_int | (UINT32_C(1) << (TotalBits - 1 - i)); //Convert the ith bit from the end in reverse_int from 0 to 1, if ith bit from beginning in n is 1 (UINT32_C(1)
//This is achieved by using bitwise OR on reverse_int (where ith bit from end is currently 0) and << i))) // if the bit on the ith position of 32 bit input is 1,
//1 shifted left 31 - i bits (to ith bit from the end) // then proceed Further note the use of UINT32_C to convert
// 1 to unsigned 32 bit int, since just 1 is treated as int
// which cannot be shifted left more than 30 times
reverse_int =
reverse_int |
(UINT32_C(1)
<< (TotalBits - 1 -
i)); // Convert the ith bit from the end in reverse_int
// from 0 to 1, if ith bit from beginning in n is 1
// This is achieved by using bitwise OR on reverse_int
// (where ith bit from end is currently 0) and 1
// shifted left 31 - i bits (to ith bit from the end)
} }
return reverse_int; return reverse_int;
} }

View File

@ -1,9 +1,14 @@
int hammingWeight(uint32_t n) { int hammingWeight(uint32_t n)
{
int TotalBits = 32; int TotalBits = 32;
int i, weight = 0; int i, weight = 0;
for(i = 0; i < TotalBits; i++) { for (i = 0; i < TotalBits; i++)
if(n & (UINT32_C(1) << i)) //if the bit on the ith position of 32 bit input is 1, then proceed {
//Further note the use of UINT32_C to convert 1 to unsigned 32 bit int, as just 1 is treated as int which cannot be shifted left more than 30 times if (n & (UINT32_C(1)
<< i)) // if the bit on the ith position of 32 bit input is 1,
// then proceed Further note the use of UINT32_C to
// convert 1 to unsigned 32 bit int, as just 1 is treated
// as int which cannot be shifted left more than 30 times
weight += 1; weight += 1;
} }
return weight; return weight;

View File

@ -6,7 +6,8 @@
* }; * };
*/ */
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) { struct ListNode *addTwoNumbers(struct ListNode *l1, struct ListNode *l2)
{
struct ListNode *head = NULL; struct ListNode *head = NULL;
struct ListNode *walk = NULL; struct ListNode *walk = NULL;
struct ListNode *tmp = NULL; struct ListNode *tmp = NULL;
@ -16,17 +17,20 @@ struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
int val2 = 0; int val2 = 0;
int val = 0; int val = 0;
while(l1 != NULL || l2 != NULL || carry) { while (l1 != NULL || l2 != NULL || carry)
{
val1 = 0; val1 = 0;
val2 = 0; val2 = 0;
val = 0; val = 0;
if(l1) { if (l1)
{
val1 = l1->val; val1 = l1->val;
l1 = l1->next; l1 = l1->next;
} }
if(l2) { if (l2)
{
val2 = l2->val; val2 = l2->val;
l2 = l2->next; l2 = l2->next;
} }
@ -38,9 +42,12 @@ struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
tmp->val = val % 10; tmp->val = val % 10;
tmp->next = NULL; tmp->next = NULL;
if(!head) { if (!head)
{
head = walk = tmp; head = walk = tmp;
} else { }
else
{
walk->next = tmp; walk->next = tmp;
walk = walk->next; walk = walk->next;
} }
@ -48,4 +55,3 @@ struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
return head; return head;
} }

View File

@ -1,9 +1,12 @@
bool isValid(char * s){ bool isValid(char *s)
{
int i, k = 0, len = strlen(s); int i, k = 0, len = strlen(s);
char *store = calloc(len, sizeof(char)); char *store = calloc(len, sizeof(char));
for( i = 0; s[i] != '\0'; i++) { for (i = 0; s[i] != '\0'; i++)
switch(s[i]) { {
switch (s[i])
{
case '(': case '(':
case '{': case '{':
case '[': case '[':

View File

@ -1,5 +1,7 @@
int rangeBitwiseAnd(int m, int n){ int rangeBitwiseAnd(int m, int n)
while (m < n) { {
while (m < n)
{
n &= n - 1; n &= n - 1;
} }
return n; return n;

View File

@ -1,9 +1,13 @@
struct ListNode* removeElements(struct ListNode* head, int val){ struct ListNode *removeElements(struct ListNode *head, int val)
{
if (head == NULL) if (head == NULL)
return NULL; return NULL;
if(head->val == val) { if (head->val == val)
{
return removeElements(head->next, val); return removeElements(head->next, val);
} else { }
else
{
head->next = removeElements(head->next, val); head->next = removeElements(head->next, val);
} }
return head; return head;

View File

@ -6,10 +6,11 @@
* }; * };
*/ */
struct ListNode *reverseList(struct ListNode *head)
struct ListNode* reverseList(struct ListNode* head){ {
struct ListNode *res = NULL; struct ListNode *res = NULL;
while(head) { while (head)
{
struct ListNode *pre_node = head; struct ListNode *pre_node = head;
head = head->next; head = head->next;
pre_node->next = res; pre_node->next = res;

View File

@ -1,7 +1,8 @@
/* /*
* Iterative approach * Iterative approach
*/ */
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) { struct ListNode *mergeTwoLists(struct ListNode *l1, struct ListNode *l2)
{
struct ListNode *list = NULL; struct ListNode *list = NULL;
struct ListNode *tmp = NULL; struct ListNode *tmp = NULL;
@ -10,20 +11,28 @@ struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
if (!l2) if (!l2)
return l1; return l1;
if (l1 && l2) { if (l1 && l2)
if (l1->val < l2->val) { {
if (l1->val < l2->val)
{
list = tmp = l1; list = tmp = l1;
l1 = l1->next; l1 = l1->next;
} else { }
else
{
list = tmp = l2; list = tmp = l2;
l2 = l2->next; l2 = l2->next;
} }
while(l1 && l2) { while (l1 && l2)
if (l1->val < l2->val) { {
if (l1->val < l2->val)
{
tmp->next = l1; tmp->next = l1;
l1 = l1->next; l1 = l1->next;
} else { }
else
{
tmp->next = l2; tmp->next = l2;
l2 = l2->next; l2 = l2->next;
} }
@ -44,17 +53,20 @@ struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
/* /*
* Recursive approach * Recursive approach
*/ */
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) { struct ListNode *mergeTwoLists(struct ListNode *l1, struct ListNode *l2)
{
if (!l1) if (!l1)
return l2; return l2;
if (!l2) if (!l2)
return l1; return l1;
if(l1->val < l2->val) { if (l1->val < l2->val)
{
l1->next = mergeTwoLists(l1->next, l2); l1->next = mergeTwoLists(l1->next, l2);
return l1; return l1;
} else { }
else
{
l2->next = mergeTwoLists(l1, l2->next); l2->next = mergeTwoLists(l1, l2->next);
return l2; return l2;
} }
} }

View File

@ -1,8 +1,7 @@
int *cmpval (const void *a, const void *b) { int *cmpval(const void *a, const void *b) { return *(int *)b - *(int *)a; }
return *(int *)b - *(int *)a;
}
int findKthLargest(int* nums, int numsSize, int k){ int findKthLargest(int *nums, int numsSize, int k)
{
qsort(nums, numsSize, sizeof(int), cmpval); qsort(nums, numsSize, sizeof(int), cmpval);
return nums[k - 1]; return nums[k - 1];
} }

Some files were not shown because too many files have changed in this diff Show More