双向循环链表查找与排序

定义结构体:

typedef  struct flight       //航班信息
{
    char number[50];    //航班号
    char staddress[50];   //起点站
    char arraddress[50];   //终点站
    char DATE[20];       //班期
    char TYPE[20];       //机型
    int stime;          //起飞时间
    int atime;          //到达时间
    int value;           //票价
}datatype

typedef struct node

{

    datatype data;

    struct node *prev;

    struct node *next;

}node;

 排序:

 void sort(pnode h)

{
   
//头结点为空/表为空/只有一个结点时不用排序
    if(!h || h->next == h || h->next->next == h){
        return;
    }
    pnode p,q,t;
   
//从h->next->next开始遍历,t及t前面的都是排好序的,p是本轮待插入值,等于h时结束
    for(t=h->next,p=t->next;p!=h;p=t->next){
       
//从h->next开始遍历,等于t结束
        for(q=h;q!=t;q=q->next){
           
//插入后结束本次遍历
            if(p->data.stime < q->next->data.stime){
                t->next = p->next;
                p->next->prev = t;
               
//把p结点插入到q->next前面,即q的后面
                p->next = q->next;
                q->next->prev = p;
                q->next = p;
                p->prev = q;
                break;
            }
        }
        if(t == q){
//在t前面没有插入,就下移
            t = t->next;
        }

#if 0
        else{ //p已经处于插入位置
            printf("插入到%s的前面\n",p->next->data.number);
        }
#endif

    }
}

查找:(查找可参考单向链表,需注意字符串比较时不能用 == ,要用strcmp函数!

//根据终点站查找数据
bool search_arr(pnode h,char *key)  
{
    int hour,min;
    char start[10],end[10];
    pnode p=h;
    for(p=h->next; p!= h;p=p->next){

        //strcmp(str1,str2) 函数用于比较两个字符串

                结果=0则str1=str2

                结果>0则str1>str2

                结果<0则str1<str2

        //字符串比较的是地址,所以不能用 key == p->data.arraddress来比较
        if(strcmp(key,p->data.arraddress) ==0){  
            hour=p->data.stime / 60;
            min=p->data.stime % 60;
            sprintf(start,"%d:%d",hour,min);
            hour=p->data.atime / 60;
            min=p->data.atime % 60;
            sprintf(end,"%d:%d",hour,min);

            printf("%s %s %s %s %s %s %s %d元\n",p->data.number,p->data.staddress,p->data.arraddress,p->data.DATE,p->data.TYPE,start,end,p->data.value);
            return true;
        }
    }
}

补充:

1.字符串转int

char str[20] = "10:20";
int h,m;

sscanf(str,"%d:%d",&h,&m); //将字符串转为不同类型数据

printf("%s转换为整数时间为:%d:%d\n",str,h,m);

2.int转字符串

char str[20];
 int h,m;
 int a;
 h = 11;
 m = 34;

 sprintf(str,"%d:%d",h,m);   //将不同类型数据转为字符串
 printf("%s\n",str);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值