| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 689 人关注过本帖
标题:链表排序
只看楼主 加入收藏
双子若尘
Rank: 1
来 自:福州
等 级:新手上路
帖 子:21
专家分:0
注 册:2012-12-13
结帖率:100%
收藏
已结贴  问题点数:9 回复次数:4 
链表排序
谁能告诉我它为什么没有输出?超出时限



写一个结构体变量(包括年月日),输入N个年/月/日信息,用链表保证其有序,在输入一个k,最后输出第k天,即给定输入的时间最早的第k天。




输入格式


第一行输入一个整数N,表示给定的天数。
 
接下来N行,每行给出形如YYYY/MM/DD的格式,代表YYYY年MM月DD日。(例如:1991/06/21,0123/02/01)
 
最后一行一个整数K(1<=K<=N),如题所述。




输出格式


仅一行,输出给定的日子里面第K早之日,输出格式与输入格式相同。




样例输入


4
 
1937/05/23
 
1991/02/15
 
1946/10/30
 
1999/06/09
 
2




样例输出


1946/10/30
#include<stdio.h>
#include<stdlib.h>
#define len sizeof(struct s)
struct s
{
    char year[4];
    char month[4];
    char day[4];
    struct s * next;
};
 
int main ()
{
 int n,t,i,k;
 char ch='/';
 struct s *p1,*p2,*q1,*q2,*r;
 struct s *head,*head1;
 scanf("%d",&n);
  t=0;
 p1=(struct s*)malloc(len);                                          //创建链表
  p2=p1;
  scanf("%s%c%s%c%s",p1->year,&ch,p1->month,&ch,p1->day);
  head=NULL;
  while(t<=n)
  {
      t++;
      if(t==1)
          head=p1;
      else
      p2->next;
      p2=p1;
      p1=(struct s*)malloc(len);
scanf("%s%c%s%c%s",p1->year,&ch,p1->month,&ch,p1->day);
  }
  p2->next=p1;
  p1->next=NULL;
  
  head1=(struct s*)malloc(len);                                               //创建新链表,每一次在旧链表中找最大的日子,插在有空表头的新链表中,
  head1->next=NULL;
  t=n;                                                                      //每次的最大日都插在新链表的空表头之后,
  while(t>0)
  {
      p1=p2=head;                                                                  //得新链表从小到大排列
      q1=q2=head;
  while(p1!=NULL)
  {
      if((p1->year>q1->year)||(p1->year==q1->year&&p1->month>q1->month)||(p1->year==q1->year&&p1->month==q1->month&&p1->day>q1->day))
      {
          q2=p2;                                                        //找最大日
          q1=p1;
      }
  }
  if(q1==head)                                                      //最大日在表头
  {
      q2=head->next;
      head->next=head1->next;
      head1->next=head;
      head=q2;
  }
  else                                                              //最大日在表中
  {
      q2->next=q1->next;
      q1->next=head1->next;
      head1->next=q1;
  }
  t--;
   
}

r=head1;                                                                    // 输出新链表的第K个
 for(i=0;i<k;i++)
      r=r->next;
 printf("%s/%s/%s\n",r->year,r->month,r->day);                       
 printf("\n");
   return 0;
}

搜索更多相关主题的帖子: 结构体 年月日 时间 
2013-01-06 19:29
a151141
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:197
专家分:680
注 册:2012-10-19
收藏
得分:0 
。。。。。。。。
这错误太多了,改不过来,
你先自己好好看看,把基础的错误改改。

世界上幸福的事就是抓到一只羊,更幸福的事就是抓到两只羊……
2013-01-06 20:02
双子若尘
Rank: 1
来 自:福州
等 级:新手上路
帖 子:21
专家分:0
注 册:2012-12-13
收藏
得分:0 
bu
2013-01-06 21:56
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:5 
程序代码:
#include <stdio.h>
#include <stdlib.h>
#define len sizeof(struct date)
typedef struct date
{
    char year[5];
    char month[3];
    char day[3];
    struct date *next;
}date;
int compare(date a, date b)
{    //判断 a < b ?
    int i;
    for (i = 0;i < 4;++i)
    {
        if (a.year[i] == b.year[i])
            continue;
        return a.year[i] < b.year[i];
    }
    for (i = 0;i < 2;++i)
    {
        if (a.month[i] == b.month[i])
            continue;
        return a.month[i] < b.month[i];
    }
    for (i = 0;i < 2;++i)
    {
        if (a.day[i] == b.day[i])
            continue;
        return a.day[i] < b.day[i];
    }
    return 0;
}
void insert(date *head, date *node)
{
    date *p = head;
    while (p->next && compare(*(p->next), *node))
        p = p->next;
    node->next = p->next;
    p->next = node;
}
void Destroy(date *head)
{
    if (!head)    return;
    Destroy(head->next);
    free(head);head = NULL;
}
int main()
{
    int n;
    date *p, *head = (date *)malloc(len);
    head->next = NULL;
    scanf("%d", &n);
    while (n--)
    {
        p = (date *)malloc(len);
        scanf("%4s/%2s/%2s", p->year, p->month, p->day);
        insert(head, p);
    }
    p = head->next;
    scanf("%d", &n);
    while (--n)    p = p->next;
    printf("%4s/%2s/%2s\n", p->year, p->month, p->day);
    Destroy(head);
    return 0;
}


[fly]存在即是合理[/fly]
2013-01-06 22:34
ksddah
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:53
专家分:135
注 册:2012-12-11
收藏
得分:4 
程序代码:
#include<stdio.h>
#include<stdlib.h>

typedef struct time
{
    char year[5];
    char month[3];
    char day[3];
    struct time *next;
}Node;

Node *createLList(int );
Node *sortLList(Node *);
void print(Node *);

int main()
{
int n; 
Node *head,*newhead;
printf("请输入结点个数:\n"); 
scanf("%d",&n);
head=createLList(n);
print(head);
newhead=sortLList(head);
print(newhead);
}

Node *createLList(int n)
{
  Node *head,*p,*q;
  //char ch;
  if(n==0)
  {                                         //创建链表 
     printf("创建链表失败\n");
     return NULL;
  }
  head=(Node *)malloc(sizeof(Node));
  p=head;
  for(int t=1;t<=n-1;t++)
  {
    printf("请输入年/月/日:\n"); 
    scanf("%s%s%s",p->year,p->month,p->day);
    q=(Node *)malloc(sizeof(Node));
    p->next=q;
    p=p->next;
  }
    printf("请输入年/月/日:\n"); 
    scanf("%s%s%s",p->year,p->month,p->day);
    p->next=NULL;
    return head;
}

    
Node *sortLList(Node *head)               //链表排序 
{
    Node *first,*tail,*p,*p_max,*max;
    first=NULL;
    while(head!=NULL)
    {
        for(p=head,max=head;p->next!=NULL;p=p->next)
        {
             if((p->next->year>max->year)||(p->next->year==max->year&&p->next->month>max->month)
                ||(p->next->year==max->year&&p->next->month==max->month&&p->next->day>max->day))
               {
                  p_max=p;
                  max=p->next;
               }
        }
        
        if(first==NULL)
        {
            first=max;
            tail=max;
        }
        else
        {
            tail->next=max;
            tail=max;
        }
        if(max==head)
        {
            head=head->next;
        }
        else
        {
           p_max->next=max->next;
        }
    }
      
        
         if (first!=NULL) 
        {
           tail->next=NULL; 
        }
        head=first;
        return head;
}

          
void print(Node *head)
{ 
    Node *p;
    p=head;
    while(p->next!=NULL)
    {
       printf("%4s%4s%4s\n",p->year,p->month,p->day);
       p=p->next;
    }
       printf("%4s%4s%4s\n",p->year,p->month,p->day);
}
  

图片附件: 游客没有浏览图片的权限,请 登录注册
2013-01-07 15:19
快速回复:链表排序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036436 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved