解题思路:
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分
149 人评分
if ( p->number < t )没看懂这句 t=p->number 自己跟自己比较大小?
int Sort_LinkList(LinkList *head)//排序 { LinkList *min,*p,*q; int i,j,t; q=head->next; while(q!=NULL) { p=q; t=p->num; min=p; while(p!=NULL) { if(p->num<t) { t=p->num; min=p; } p=p->next; } i=q->num; q->num=min->num; min->num=i; j=q->scorre; q->scorre=min->scorre; min->scorre=j; q=q->next; } }//自己卡在了这里 大神的思路真腻害
自己写的链表合并最后不知道怎么排序 借鉴了大神的思路 腻害腻害
pingfan443 2019-10-05 18:54:38 |
# include<stdio.h> # include<stdlib.h> # define LEN sizeof(struct student) typedef int elemtype; typedef struct student { int num; int scorre; struct student *next; }LinkList; LinkList *Creat_LinkList(int x) { int i; LinkList *head,*tail,*p; head=(LinkList *)malloc(LEN); if(head==NULL) return head; head->next=NULL; tail=head; p=(LinkList *)malloc(LEN); scanf("%d%d",&p->num,&p->scorre); for(i=0;i<x;i++) { tail->next=p; tail=p; if(i<x-1) { p=(LinkList *)malloc(LEN); scanf("%d%d",&p->num,&p->scorre); } } tail->next=NULL; return head; } LinkList *Merrge_LinkList(LinkList *a,LinkList *b) { LinkList *head; head=a; while(a->next!=NULL) a=a->next; a->next=b->next;//一直没整明白 是自己写的头节点 没有连接到首节点 return head; } int Sort_LinkList(LinkList *head)//排序 { LinkList *min,*p,*q; int i,j,t; q=head->next; while(q!=NULL) { p=q; t=p->num; min=p; while(p!=NULL) { if(p->num<t) { t=p->num; min=p; } p=p->next; } i=q->num; q->num=min->num; min->num=i; j=q->scorre; q->scorre=min->scorre; min->scorre=j; q=q->next; } } int main() { int N,M; scanf("%d%d",&N,&M); LinkList *A,*B,*C; A=Creat_LinkList(N); B=Creat_LinkList(M); C=Merrge_LinkList(A,B); Sort_LinkList(C); print_LinkList(C); // print_LinkList(B); return 0; } int print_LinkList(LinkList *p) { p=p->next; while(p!=NULL) { printf("%d %d\n",p->num,p->scorre); p=p->next; } }
creat尾插那里p->next直接等于NULL也是可以的吧,毕竟q总指向最后结点,你那样写让人误以为是头插法
花花 2021-03-11 21:45:33 |
正解,这样更好
#include<stdio.h> #include<stdlib.h> typedef struct info{ int XueHao; int ChengJi; struct info *ZhiZhen; }LianBiao; int ShuA = 0, ShuB = 0; LianBiao *He_Bing(LianBiao *a, LianBiao *b); LianBiao *Jia_Ru_Lian(LianBiao *LianTou, int XueHao, int ChengJi); void Pai_Xu(LianBiao *LianTou); int main() { int a, b; LianBiao *LianTouA=NULL, *LianTouB = NULL,*LianTouAB=NULL; scanf("%d %d", &ShuA, &ShuB); for (int i = 0;i < ShuA+ShuB;i++) { scanf("%d %d",&a, &b); if (i >= ShuA) { LianTouB = Jia_Ru_Lian(LianTouB, a, b); } else { LianTouA = Jia_Ru_Lian(LianTouA, a, b); }
/* 已有a、b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列。 */ #include <stdio.h> #include <stdlib.h> typedef struct student{//链表结点 int ID; int score; struct student *next;//前指向 struct student *back;//后指向 } Stu; typedef struct _list{ struct student *head1;//表头指针 struct student *tail1;//表尾指针 struct student *head2; struct student *tail2; } List; void creat_a_link(List *pList, int N);//创建a链表 void creat_b_link(List *pList, int N);//创建b链表 void connect_link(List *paList);//链接链表 void sort_link(List *paList);//排序链表 void free_link(List *pList);//释放链表 int main(){ List list; list.head1 = lis
C二级辅导-计负均正 (C语言代码)浏览:591 |
A+B for Input-Output Practice (C++代码)浏览:605 |
C语言训练-大、小写问题 (C语言代码)浏览:724 |
C语言程序设计教程(第三版)课后习题9.2 (C语言代码)浏览:555 |
C语言程序设计教程(第三版)课后习题11.5 (C语言代码)浏览:984 |
C语言程序设计教程(第三版)课后习题8.3 (C语言代码)浏览:382 |
【计算球体积】 (C语言代码)浏览:1548 |
C语言程序设计教程(第三版)课后习题11.3 (C语言代码)浏览:2158 |
C二级辅导-分段函数 (C语言代码)浏览:738 |
【偶数求和】 (C++代码)浏览:697 |
chenleo 2020-05-14 16:39:45 |
创建链表啊
Ibelieveit! 2020-05-26 11:29:26 |
返回一个头节点的地址
sqmw 2020-12-24 11:34:50 |
返回寻址地址
朱派金 2022-03-02 13:44:53 |
因为node是typedef定义的一个结构体指针别名,换成struct student*也能起同样的作用