#include <stdlib.h> #include <stdio.h> #include <string.h> struct Node { char *City; int Temp; struct Node *Next; }; typedef struct Node * Link; Link Head; int NodeCount; // Add a node int AddNodeAscend(Link); // Create a empty list void CreateList(void); // Delete a node from the list int DeleteNode(Link); // Handle dumplicate inserts int DuplicateNode(Link, Link); // Free a node's memory void FreeNode(Link); // Show list of nodes void ShowNodes(void); // Compare tow nodes int NodeCmp(Link, Link); int AddNodeAscend(Link to_add) { Link pn, prev, curr; struct Node dummy; int i = 0; if (to_add == NULL) { return 0; } pn = (Link)malloc(sizeof(struct Node)); if (pn == NULL) { return 0; } memcpy(pn, to_add, sizeof(struct Node)); dummy.Next = Head; prev = &dummy; curr = Head; for (;; prev = curr, curr = curr->Next) { if (curr == NULL) { break; } i = NodeCmp(pn, curr); if (i <= 0) break; } if (curr && i == 0) { if ( DuplicateNode(curr, pn) == 0) return (1); } prev->Next = pn; pn->Next = curr; Head = dummy.Next; return (1); } int DuplicateNode(Link inlist, Link duplicate) { FreeNode(duplicate); return (0); } int DeleteNode(Link to_delete) { Link prev, curr; int i; if (Head == NULL) return 0; for (prev = NULL, curr = Head; curr != NULL && (i = NodeCmp(to_delete, curr)) > 0; prev = curr, curr = curr->Next) ; if (curr != NULL && i == 0) { if (prev != NULL) { prev->Next = curr->Next; } else { Head = curr->Next; } FreeNode(curr); NodeCount--; return (1); } return (0); } int NodeCmp(Link a, Link b) { if (a->Temp != b->Temp) { return (a->Temp - b->Temp); } return strcmp(a->City, b->City); } void CreateList(void) { Head = NULL; NodeCount = 0; } void FreeNode(Link n) { free(n->City); free(n); } void ShowNodes(void) { Link pn; int count = 0; int median = 0; for (pn = Head; pn != NULL; pn = pn->Next) { count++; } median = count / 2 + 1; if (count > 0) { count = 0; for (pn = Head; pn != NULL; pn = pn->Next) { printf("%-20s: %3d", pn->City, pn->Temp); count += 1; if(count == median) printf(" --Median-- "); printf("\n"); } } else { printf("Empty list\n"); } } int main(int argc, char *argv[]) { FILE *fin; char buffer[128]; struct Node n; if (argc != 2) { fprintf(stderr, "Usage: ctiytemp filename.txt\n"); exit( EXIT_FAILURE); } fin = fopen(argv[1], "rt"); if(fin == NULL) { fprintf(stderr, "Cannot open/find %s\n", argv[1]); exit( EXIT_FAILURE); } CreateList(); while (! feof(fin)) { if (fgets(buffer, 127, fin) == NULL) { break; } buffer[strlen(buffer) - 1] = '\0'; n.City = strdup(buffer + 3); buffer[3] = '\0'; n.Temp = atoi(buffer); if (AddNodeAscend(&n) == 0) { fprintf(stderr, "Error adding node. Aborting \n"); exit( EXIT_FAILURE); } } ShowNodes(); printf( "\n" ); DeleteNode(Head); ShowNodes(); while(Head != NULL && Head->Next != NULL) { printf(" \n "); DeleteNode(Head->Next); ShowNodes(); } DeleteNode(Head); ShowNodes(); fclose(fin); return (EXIT_SUCCESS); }