Skip to content

Instantly share code, notes, and snippets.

Created January 29, 2015 03:58
Show Gist options
  • Save anonymous/c57b7a8d66948c73af57 to your computer and use it in GitHub Desktop.
Save anonymous/c57b7a8d66948c73af57 to your computer and use it in GitHub Desktop.
DLList - Remove Bug
#include <stdio.h>
#include <stdlib.h>
typedef struct DLNode Node;
typedef struct DLNode
{
int ID;
char *Fname;
char *Lname;
char *Dept;
float GPA;
Node * prev;
Node * next;
} Node;
typedef struct DLList
{
Node * first;
Node * last;
} List;
void DLList_init(List * list)
{
list->first = NULL;
list->last = NULL;
}
void DLList_add_node(List * list, int ID, char *Fname, char *Lname, char *Dept, float GPA)
{
Node * newNode;
newNode = (Node *)malloc(sizeof(Node));
if(!newNode)
{
printf("Malloc failed, new node not created.");
exit(EXIT_FAILURE);
}
newNode->ID = ID;
newNode->Fname = Fname;
newNode->Lname = Lname;
newNode->Dept = Dept;
newNode->GPA = GPA;
if(list->last)
{
list->last->next = newNode;
newNode->prev = list->last;
list->last = newNode;
} else {
list->first = newNode;
list->last = newNode;
}
}
void DLList_print(List * list, FILE *fout) //*fout HERE!!!
{
Node * node;
for(node = list->first; node != NULL; node = node->next)
{
fprintf(fout, "%d,%s,%s,%s,%f\n", node->ID, node->Fname, node->Lname, node->Dept, node->GPA);
}
}
void DLList_free(List * list)
{
Node * node;
Node * holder;
for(node = list->first; node != NULL; node = node->next)
{
holder = node->next;
free(node->Dept);
free(node->Lname);
free(node->Fname);
free(node);
node = holder;
}
}
Node * remove_node(List * list, Node * node){
Node * temp3;
temp3 = node;
node->next->prev = node->prev;
node->prev->next = node->next;
return temp3;
}
void Insertion_sort(List * list)
{
Node * index;
Node * node;
Node * temp;
Node * temp2;
for(index = list->first; index != NULL && index->next != NULL; index = index->next)
{
if(index->ID > index->next->ID && &index->next->ID != NULL)
{
node = remove_node(list, index->next);
temp = index;
while(temp->ID > node->ID)
{
if(temp != list->first)
{
temp = temp->prev;
} else {
break;
}
}
if(temp->ID < node->ID)
{
temp2 = temp->next;
node->prev = temp;
node->next = temp2;
temp->next = node;
temp2->prev = node;
} else {
node->next = temp;
list->first = node;
temp->prev = node;
}
index = index->prev;
}
if(index == list->last)
break;
}
}
int main(int argc, char *argv[])
{
FILE *fin, *fout;
int ID;
char *Fname;
char *Lname;
char *Dept;
float GPA;
char *fin_path;
char *fout_path;
/*Setting up list*/
List list;
DLList_init(& list);
/*Input & Output Files
if(argv[1] && argv[2])
{
fin_path = argv[1];
fout_path = argv[2];
} else {
printf("Input and output file names were not supplied!\n");
return 1;
}*/
/*Read file operations */
fin = fopen("in.txt", "r");
if(fin == NULL)
{
printf("Can't open input file!\n");
return 1;
}
while (fscanf(fin, "%d %ms %ms %ms %f", &ID, &Fname, &Lname, &Dept, &GPA) == 5)
{
DLList_add_node(& list, ID, Fname, Lname, Dept, GPA);
}
fclose(fin); //closing read file
/*Insertion sort of list*/
Insertion_sort(& list);
/* Write File Operations*/
fout = fopen("out.txt", "w");
if(fout == NULL)
{
printf("Can't open output file!");
return 1;
}
DLList_print(& list, fout); //printing list to output file
fclose(fout); //closing output file
DLList_free(& list); //freeing memory
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment