Manchester


私信TA

用户名:wenyajie

访问量:310667

签 名:

在历史前进的逻辑中前进,这个逻辑就是人心向背的逻辑

等  级
排  名 1
经  验 62388
参赛次数 1
文章发表 188
年  龄 0
在职情况 学生
学  校 Xiamen University
专  业 计算机科学

  自我简介:

在历史前进的逻辑中前进,这个逻辑就是人心向背的逻辑

解题思路:
1.先设计个结点,包括学号,成绩,后继指针;
2.输入a,b,程序中为n,m;

3.分别创建长度为n的链表,和长度为m的链表;

4.把两个链表连为一个,用选择排序法排序;

5.输出,边输出,边释放结点
讲的不好,代码时间有点长了,说实话,我都看了好长时间,佩服当初的自己

参考代码:

#include <stdio.h>
#include <malloc.h>

typedef struct student {
    double    number;
    double    gread;

    struct student * next;
}*node, Node;                   //结点

node creat( int n );         //创建链表函数

void output( node l );        //输出函数

void order( node l1, node l2 );   //排序函数


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->next = NULL;                         //next指针域赋空
    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).gread );  //输入学号,成绩

        p->next = q->next;           //采用后差法插入节点
        q->next = p;
        q    = p;
    }

    return(h);   //返回头结点
}
/*-------------------------------------------------------------*/

void output( node l )      //输出链表每个结点的信息
{
    l = l->next;
    node q; //用于释放结点
    while ( l != NULL )
    {
        printf( "%.0f %0.f\n", l->number, l->gread );
        q=l;
        l = l->next;
        free(q);  //释放结点
    }
}

/*-------------------------------------------------------------*/
void order( node l1, node l2 )   //排序
{
    node q;           //定义指针q
    q    = l1;           //q指向表a的头结点
    l2    = l2->next;        //表b的头结点下移

    while ( q->next != NULL )    //让q指向表a的最后一个结点
    {
        q = q->next;
    }
    q->next = l2;          //表a的最后一个结点的next指向表b的(首结点)完成连接

    q = l1->next;     //再次把q指向表a的头结点

    node min;       //定义指向最小学号结点的指针

 
    int    t;      //保存最小学号的变量
    int    n, g;   //交换学号,成绩的中间变量
    node    p;     //定义指针p,用于中间遍历求最小学号

    while ( q != NULL )  //开始遍历,选择排序最外层
    {
        p = q;         //p等于查找的第一个结点q

        t    = p->number;     //让t等于开始查找的第一个结点的学号
        min    = p;           //最小学号结点指正指向p
        while ( p != NULL )   //从结点p向后遍历
        {
            if ( p->number < t )
            {
                t    = p->number;    //记录最小学号
                min    = p;          //记录最小学号结点
            } 

            p = p->next;    //遍历p的下一个结点
        }

        n        = q->number;        //n等于第一个结点的学号
        q->number    = min->number;  //最小学号结点的学号与第一个结点的学号交换
        min->number    = n;

        g        = q->gread;        //同理把成绩也交换了
        q->gread    = min->gread;    /*整个排序思路就是选择排序*/
        min->gread    = g;

        q = q->next;   //第一遍排序完后q后移,也就是选择排序开始排第二遍时的第一个数      
    }

    output( l1 );    //排序完成后,输出链表
}

别忘点赞哦-.-

 

0.0分

146 人评分

  评论区

想问一下创建的头节点分配的内存是没有释放吗,  free(q);  //释放结点     ,这段我看是从开始记录数据的结点开始释放内存呢
2024-02-29 15:37:31
我觉得你代码的可读性很强,很棒
2023-09-07 21:29:20
输出时的q是否不是必要的?
2022-03-21 20:25:46
p和q的作用分别是什么呀
2021-12-27 14:21:38
为什么74行和83行头结点都要下移一下?
2021-12-09 20:57:31
我好佩服你啊,大佬!
2021-11-11 00:03:30
插入排序思想:
	struct A *La=initList(),*p,*r,*pre;
        p=La->next;
	r=p->next;
	p->next=NULL; //构造只有一个数据节点的有序表 
	p=r;
	
	while(p){
		r=p->next; // 保存p的后继 
		pre=La; // pre从头遍历 
		while(pre->next && pre->next->id < p->id){
			pre=pre->next; //在有序表中查找要插入的位置  
		}
		p->next=pre->next; // p插入到pre之后 
		pre->next=p;
		p=r;  // 扫描剩余节点 
	}
2021-04-16 01:25:14
//学号排序,冒泡排序 
void sort_lianbiao(LinkedList a,int M,int N){
	Node *p=a->next;
	int m,n;//交换成绩学号的中间变量 
	int i;
	for(i=1;i<M+N;i++){
		p=a->next;//将p重新指向链表头的下一个元素 
		while(p->next!=NULL){
		if(p->xuehao > p->next->xuehao){
			m=p->xuehao;
			p->xuehao=p->next->xuehao;//交换学号 
			p->next->xuehao=m;
			n=p->chengji;
			p->chengji=p->next->chengji;//交换成绩 
			p->next->chengji=n;
			}
			p=p->next;
		}
	}
}
2021-03-18 16:15:00