C语言-链表排序

文章目录

  • 题目
  • 代码
  • 遇到的bugs和处理
    • 问题
    • 解决

题目

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

代码

#include 
#include 

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. 插入函数和输出函数循环体中都忘记将链表指针往后移,加入后问题解决。

你可能感兴趣的:(C语言之旅,链表,c语言,数据结构)