真的菜菜


私信TA

用户名:eyinpei

访问量:584

签 名:

我秃了,也变强了

等  级
排  名 4686
经  验 1652
参赛次数 0
文章发表 2
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

我还是个新手,链表尤其头疼,自己写出这个题解而且一遍过我真的太开心了

注意事项:

理清思路,一步一步来


参考代码:

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

typedef struct Node{
   int num;
   int score;
   struct Node *next;
}LNode,*Llist;

Llist Initlist(int n);                                            //初始化链表
Llist Copylist(LNode * heada,LNode * headb,int n,int m);          //将两个链表合并(将b的头节点复制到a的尾节点后面)
Llist Sortlist(LNode * heada,int n);                              //冒泡排序,实现学号的从小到大排列
void Output(LNode * heada,int n);                                 //输出

int main(){
   int n,m;
   scanf("%d %d",&n,&m);
   LNode * heada = (LNode *)malloc(sizeof(LNode));                //链表a的头节点
   LNode * headb = (LNode *)malloc(sizeof(LNode));                //链表b的头节点

   heada = Initlist(n);
   headb = Initlist(m);

   Copylist(heada,headb,n,m);
   Sortlist(heada,n+m);
   Output(heada,n+m);

   return 0;

}

Llist Initlist(int n){
   LNode * p = (Llist)malloc(sizeof(LNode));
   p->next = NULL;
   LNode * head = p;
   for(int i = 0;i<n;i++){
      LNode * tmp = (LNode *)malloc(sizeof(LNode));
      tmp->next = NULL;
      scanf("%d %d",&tmp->num,&tmp->score);
      p->next = tmp;
      p = tmp;
   }
   return head;
}

Llist Copylist(LNode * heada,LNode * headb,int n,int m){
   LNode * p = heada;
   int i = 0;
   while(i<n){                                                 //不断把tmp指针后移到链表a的尾节点,然后将a的尾节点tmp指向b的头节点的next节点
      i++;
      p = p->next;
   }
   p->next = headb->next;
   return heada;
}

Llist Sortlist(LNode * heada,int n){                        //冒泡排序
   LNode * tmp = (LNode *)malloc(sizeof(LNode));
   for(int i = 0;i<n-1;i++){
      LNode * p = heada->next;
      for(int j = 0;j <n-i-1;j++){
         if(p->num>p->next->num){                           //p和p的下一个节点的学号进行比较,如果p的学号大,交换数据
            tmp->num = p->next->num;
            tmp->score = p->next->score;
            p->next->num = p->num;
            p->next->score = p->score;
            p->num = tmp->num;
            p->score = tmp->score;
         }
         p = p->next;                                       //p节点后移
      }
   }
   free(tmp);
   return heada;
}

void Output(LNode * heada,int n){
   LNode * tmp = (LNode *)malloc(sizeof(LNode));
   for(int i = 0;i <n;i++){
      tmp = heada->next;                                    //tmp和head同步后移
      printf("%d %d\n",tmp->num,tmp->score);
      heada = tmp;
   }
   free(tmp);
}


 

0.0分

1 人评分

  评论区

  • «
  • »