PTA通讯录排序(C语言)

题意:

输入n个朋友的信息,包括姓名、生日、电话号码,本题要求编写程序,按照年龄从大到小的顺序依次输出通讯录。题目保证所有人的生日均不相同。

输入格式:

输入第一行给出正整数n(<10)。随后n行,每行按照“姓名 生日 电话号码”的格式给出一位朋友的信息,其中“姓名”是长度不超过10的英文字母组成的字符串,“生日”是yyyymmdd格式的日期,“电话号码”是不超过17位的数字及+-组成的字符串。

输出格式:

按照年龄从大到小输出朋友的信息,格式同输出。


输入样例:

3
zhang 19850403 13912345678
wang 19821020 +86-0571-88018448
qian 19840619 13609876543

输出样例:

wang 19821020 +86-0571-88018448
qian 19840619 13609876543
zhang 19850403 13912345678

代码:

#include 
#include 
typedef struct qq{
    char name[11];
    long old;
    char phone[18];
    struct qq *next;
}az;
void swap_link(az *h,az *p,az *q);//交换链表
az *create(int n);//创建链表
void sort(az *head,int n);//排序
void look(az *head);//输出
int main(){
    int n;
    scanf("%d",&n);
    az *head=create(n);
    sort(head,n);
    look(head);
    return 0;
}
az *create(int n){
    az *head=(az *)malloc(sizeof(az));
    az *q=head;
    for(int i=0;iname,&p->old,p->phone);
        p->next=NULL;
        q->next=p;
        q=q->next;
    }
    return head;
}
void sort(az *head,int n){
    az *p=head->next,*q=p->next,*h=head;
    for(int i=n-1;i>0;i--){
       for(int j=i;j>0;j--){       
    if(p->old > q->old){              
    swap_link(h,p,q);
    az *t=p; p=q; q=t;
  }
   if(p->next!=NULL){
   h=h->next;p=p->next;q=q->next;}
}
h=head;p=head->next;q=p->next;
  }
} 
void swap_link(az *h,az *p,az *q)
{
if(q->next==NULL){
    h->next=q;
    q->next=p;
    p->next=NULL;
}else{
h->next=q;
p->next=q->next;
q->next=p;
  }
}
void look(az *head){
while(head->next!=NULL){
    head=head->next;
    printf("%s %ld %s\n",head->name,head->old,head->phone);
  }
}

你可能感兴趣的:(算法,数据结构)