文章目录
题目
《算法笔记》练习题目,见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和处理
问题
- 节点无法正常插入,程序死循环。
- 链表输出有问题,数据不变,死循环。
解决
- 插入函数和输出函数循环体中都忘记将链表指针往后移,加入后问题解决。