链表基础

#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);
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值