链表函数(建立,删除重复元素,排序,输出)—— 链表的有序集合

/**************************************
      Problem id    : SDUT OJ 2178 
      User name    : Silence-Debug 
      Result        : Accepted 
      Take Memory    : 316K 
      Take Time    : 0MS 
      Submit Time    : 2013-05-31 21:05:15  
  **************************************/
 # include <stdio.h>
 # include <stdlib.h>
  
  struct node
  {
      int date;
      struct node *next;
  } ;
  
  struct node *creat(int n)
  {
      struct node *head, *tail, *p;
      head = (struct node *)malloc(sizeof(struct node));
      head -> next = NULL;
      tail = head;
      for(int i = 0; i < n; i++)
      {
          p = (struct node *)malloc(sizeof(struct node));
          scanf("%d", &p -> date);
          p -> next = NULL;
          tail -> next = p;
          tail = p;
      }
      return head;
  }
  
  void Delete(struct node *&head, int n)
  {
      struct node *p, *q, *t, *tail;
      p = head -> next;
      while(p)
      {
          q = p->next;
          t = p;
          while(q)
          {
              tail = q;
              if (p -> date == q -> date)
              {
                  n--;
                  t -> next = q -> next;
                  q = q -> next;
                  free(tail);
              }
              else
              {
                  q = q->next;
                  t = t->next;
              }
          }
          p = p -> next;
      }
  
  }
  
  void sortline(struct node *&head, int n)
  {
      struct node *p, *q;
      while(n--)
      {
          p = head -> next;
          q = p -> next;
          while(p -> next)
          {
              if(p -> date > q -> date)
              {
                  int t = p -> date;
                  p -> date = q -> date;
                  q -> date = t;
              }
              p = p -> next;
              q = q -> next;
          }
      }
  }
  
  void output(struct node *head)
  {
      struct node *r = head;
      while(r -> next -> next != NULL)
      {
          printf("%d ", r -> next -> date);
          r = r -> next;
      }
      printf("%d\n", r -> next -> date);
  }
  
  int main(void)
  {
      int n;
      while(~scanf("%d", &n))
      {
          struct node *head;
          head = creat(n);
          Delete(head, n);
          sortline(head, n);
          output(head);
      }
  
      return 0;
  }
View Code

 

 

posted @ 2013-05-31 21:11  GLSilence  阅读(219)  评论(0)    收藏  举报