【C语言题解/链表详细操作/冒泡排序】题目 1052: [编程入门]链表合并

题目链接[编程入门]链表合并 - C语言网 (dotcpp.com)

#include <stdio.h>
#include <malloc.h>
typedef struct student {
    double    number;
    double    grade;
 
    struct student * next;
}*node, Node;                   //结点
 
node creat( int);         //创建链表函数

void output(node);        //输出函数
 
void order( node, node);   //排序函数

void swap (node,node);
 
int main(){
    int    n, m;            //a ,b

    node    head1, head2;   //指向头节点的指针 
 
    scanf( "%d%d", &n, &m );  
 
    head1    = creat( n );   //创建链表a
    head2    = creat( m );   //创建链表b
 
    order( head1, head2 );   //排序
  
    return(0);
}
 
node creat( int n ){
    node h;         //头结点指针
    h = (node) malloc( sizeof(Node) );      //创建头结点,h为指向头节点的指针 
    h->next = NULL;                         //头节点指向NULL代表空链表 
    node  q = h;                            //q为尾指针,指向头节点,代表链表为空 
    node  p;                             	
 
    for ( int i = 0; i < n; i++ ){       //创建n个结点
        p = (node) malloc( sizeof(Node) );   //申请节点空间 
        scanf( "%lf%lf", &(*p).number, &(*p).grade );  //输入学号,成绩
 		//采用后差法插入节点
        q->next=p; 		//前一个尾结点指向当前结点 
        p->next=NULL;		//当前结点指向NULL 
        q = p;			//尾指针指向当前结点 
    }
 
    return h;   //返回头结点
}
 
void output( node l )      //输出链表每个结点的信息
{
    l = l->next;
    node q; //用于释放结点
    while ( l != NULL )
    {
        printf( "%.0f %0.f\n", l->number, l->grade );
        q=l;
        l = l->next;
        free(q);  //释放结点
    }
}
//交换函数 
void swap(node n, node m){
	double t;
	t=(*n).number;
	(*n).number=(*m).number;
	(*m).number=t;
	t=(*n).grade;
	(*n).grade=(*m).grade;
	(*m).grade=t;
}
//冒泡排序 
void order (node l1, node l2){
	int x;
	node temp0=l1,temp1,temp2;
	while (temp0->next!=NULL){
		temp0=temp0->next;
	}
	temp0->next=l2->next;
	free(l2); 
	while (1){
		x=1;
		temp1=l1->next; temp2=temp1->next;
		while (temp2 != NULL){
			if (temp1->number > temp2->number){
				swap(temp1,temp2);
				x=0;
			}
			temp1=temp1->next;
			temp2=temp2->next;
		}
		if (x)	break;
	}
	output(l1);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值