Social Network #
| Name | Age | Rel Status | Friends | 
|---|---|---|---|
| Alice | 24 | Single | Diestel, Eve | 
| Bob | 28 | Maried | Alice | 
| Charlie | 20 | Single | Diestel | 
| Diestel | 27 | Not Mentioned | Alice, Eve, Charlie | 
| Eve | 25 | Engaged | Diestel, Alice | 
Define a Person (Profile) #
struct Person {
    char name[100];
    int age;
    int rel_status;
};
Implemeting Rel Status as int, requires us to keep in mind the mapping between Single, Maried, Not Mentioned, Engaged and integers.
Can we specify this in code??
Enums #
typedef enum Weekday {
    Sunday, 
    Monday, 
    Tuesday, 
    Wednesday, 
    Thursday, 
    Friday, 
    Saturday
} Weekday;
Weekday today = Wednesday;
printf("Day %d",today+1); 
printf("Size of enum variable = %d bytes", 
        sizeof(today));	
Enums : Changing default values #
typedef enum Weekday {
    Sunday = 1, 
    Monday, 
    Tuesday, 
    Wednesday, 
    Thursday, 
    Friday, 
    Saturday
} Weekday;
Weekday today = Wednesday;
printf("Day %d",today+1);
Enums : interchangable with int #
#include "stdio.h"
typedef enum Weekday {
    Sunday = 5, 
    Monday = 3, 
    Tuesday, 
    Wednesday = 2, 
    Thursday, 
    Friday, 
    Saturday
} Weekday;
int main() {
    Weekday today = Wednesday;;
    printf("Day %d\n",today+1);
    printf("Size of enum variable = %d bytes", 
            sizeof(today));	
    return 0 ;
}
Define a Person (Profile) #
enum RelStatus {
    NotMentioned,
    Single,
    Engaged,
    Married
};
struct Person {
    char name[100];
    int age;
    enum RelStatus status;
};
Social Nets #
typedef enum RelStatus {
    NotMentioned,
    Single,
    Engaged,
    Married
} RelStatus;
typedef struct Person {
    char name[100];
    int age;
    RelStatus relstatus;
} Person;
typedef struct SocialNet {
    Person members[100];
    int size;
} SocialNet;
Intitializer #
| Name | Age | Rel Status | 
|---|---|---|
| Alice | 24 | Not Mentioned | 
| Bob | 28 | Maried | 
| Charlie | 20 | Single | 
int main() {
    SocialNet social_net = {
        .members = {
            { "Alice",    24,  NotMentioned},
            { "Bob",      28,  Married},
            { "Charlie",  20,  Single},
        } ,
        .size = 3
    };
    print_network(social_net);
    return 0;
}
Print Person #
void print_person(struct Person p) {
    // TODO (solution at the end of page)
}
void print_network(SocialNet social_net) {
    printf(
        "----------------------------------------------\n"
        "Name\t\tAge \t Rel Status\n"
        "----------------------------------------------\n");
    for (int i=0;i <social_net.size; i++) {
        print_person(social_net.members[i]);
    }
    printf("----------------------------------------------\n");
}
Full Code for Social Net #
HomeWork: change the code to print all the names of friends of the person in 4th column #
#include <stdio.h>
#include <string.h>
typedef enum RelStatus {
	NotMentioned,
	Single,
	Engaged,
	Married
} RelStatus;
typedef struct Person {
	char name[100];
	int age;
	RelStatus status;
	int friends[10];
	int friends_size;
} Person;
typedef struct SocialNet {
	Person members[100];
	int size;
} SocialNet;
void print_person(Person* p) {
	char status_string[4][30] = {
		{ "Not Mentioned"},
		{ "Single" },
		{ "Engaged"},
		{ "Married" }
	};
	printf("%s\t%d\t%s\n", p->name, p->age, status_string[p->status]);
}	
void print_socialnet(SocialNet *s) {
	printf("------------------------------\n");
	printf("Name\tAge\tRelationship Status\tFriends\n");
	printf("------------------------------\n");
	for (int i = 0; i < s->size; i++ ) {
		// HomeWork: change the code to print all the names of friends of the person in 4th column
		print_person(&(s->members[i]));
	}
	printf("------------------------------\n");
}
int main() {
	SocialNet s = {
		.members = {
			{ "Ramu", 19, Single, {1,2}, 2},
			{ "Ammu", 21, Engaged, {2}, 1},
			{ "Vinod", 24, Married, {0}, 1}
		},
		.size = 3
	};
	print_socialnet(&s);
	return 0;
}
Commandline Argument #
An easier way to take input from the user in shell.
Commandline Argument #
#include <stdio.h>
int main(int argc, char* argv[]) {
    printf("The number of arguments is %d\n", argc);
    for (int i = 0; i < argc; i++) {
        printf("%d Argument: %s\n", i, argv[i]);    
    }
    return 0;
}
Problem #
Write a program that takes the First Name Last Name Age
as commandline arguments and prints it as follows
First Name: 
Last name : 
Age : 
Solution #
#include "stdio.h"
int main(int argc, char* argv[]) {
    
    if (argc != 4) {
        printf("Incorrect number of arguments provided.\n");
        return 0;
    }
    printf("First Name:\t%s\n", argv[1]);
    printf("Last Name :\t%s\n", argv[2]);
    printf("Age       :\t%s\n", argv[3]);
    return 0;
 }
Practice Problems #
HW: Implement Social Network Functions in the code bellow:
HW: Implement Bank Functions in the code bellow:
HW: Enumerating arrangement of k items from n objects
Fill in the function in the code bellow:
In the questions bellow LinkedList is defined as follows:
typedef struct Node Node;
typedef Node* LinkedList;
struct Node {
    int data;
    struct Node* next;
};
HW: Reverse a LinkedList in place #
void reverse_inplace(LinkedList l) {
    // If l is a->b->c->d 
    // after executing reverse_inplace(l) 
    // l should become d->c->b->a
    // the function also should not use another linkedlist or array
}
HW: Shuffle 2 lists #
LinkedList shuffle(LinkedList l1, LinkedList l2) {
    // If l1 is a->b->c->d and l2 is 1->2->3->4
    // shuffle(l1,l2) should return the list
    // a->1->b->2->c->3->d->4
}
Can you make the above function also in place? That is it should not use any additional array or linked list other than l1 and l2.
HW: Free memory in a LinkedList #
void free(LinkedList l) {
    // free all memory used by a linked list l
}
HW: Sort a LinkedList #
LinkedList sort(LinkedList l) {
    // sort the linked list l and return it.
}