C语言-链表排序

题目

《算法笔记》练习题目,见http://codeup.hustoj.com/problem.php?cid=100000607&pid=1

代码

#include <stdio.h>
#include <stdlib.h>

typedef struct Node{
    int id;
    int grade;
    struct Node *next;
}LinkList,*PLinkList;


/*以下使用的是带头结点的单链表*/
void insert_list(PLinkList L,PLinkList node){
    while(L->next!=NULL){
        if((L->next)->id > (node->id)) break;
        L=L->next;
    };
    node->next=L->next;
    L->next=node;
}

void print_list(PLinkList L){
    L=L->next;
    while(L!=NULL){
        printf("%d %d\n",L->id,L->grade);
        L=L->next;
    }
}

/*初始化头结点和其它节点,如果只创建头结点设置i=0即可*/
void create_list(PLinkList *P,int i){
    PLinkList plst;
    *P=(PLinkList)malloc(sizeof(LinkList));
    (*P)->next=NULL;
    /*i先判断在减一*/
    while(i--){
        plst=(PLinkList)malloc(sizeof(LinkList));
        scanf("%d%d",&(plst->id),&(plst->grade));
        plst->next=NULL;
        insert_list(*P,plst);
    }
}

/*这里直接使用原来的链表节点进行排序,破坏了原来的链表结构*/
void sort_list(PLinkList src1,PLinkList src2,PLinkList dst){
    PLinkList p;
    src1=src1->next;
    src2=src2->next;
    while((src1!=NULL)&&(src2!=NULL)){
        if(src1->id < src2->id){
            p=src1->next;
            insert_list(dst,src1);
            src1=p;
        }
        else{
            p=src2->next;
            insert_list(dst,src2);
            src2=p;
        }
    }
    while(src1!=NULL){
        p=src1->next;
        insert_list(dst,src1);
        src1=p;
    }
    while(src2!=NULL){
        p=src2->next;
        insert_list(dst,src2);
        src2=p;
    }
}

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);

    PLinkList L1,L2,L3;
    create_list(&L1,n);
    create_list(&L2,m);
    create_list(&L3,0);
    sort_list(L1,L2,L3);
    
    print_list(L3);
    return 0;
}

遇到的bugs和处理

问题

  1. 节点无法正常插入,程序死循环。
  2. 链表输出有问题,数据不变,死循环。

解决

  1. 插入函数和输出函数循环体中都忘记将链表指针往后移,加入后问题解决。
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值