欢迎来到入门教程网!

C语言

当前位置:主页 > 软件编程 > C语言 >

C语言中数据结构之链表归并排序实例代码

来源:本站原创|时间:2020-01-10|栏目:C语言|点击:

C语言中数据结构之链表归并排序实例代码

问题

       设有两个无头结点的单链表,头指针分别为ha,hb,链中有数据域data,链域next,两链表的数据都按递增排序存放,现要求将hb表归到ha表中,且归并后ha仍递增序,归并中ha表中已有的数据若hb中也有,则hb中的数据不归并到ha中,hb的链表在算法中不允许破坏。

源程序

#include <stdio.h> 
#include<stdlib.h> 
#define N1 6 /*链表La的长度*/  
#define N2 6 /*链表Lb的长度*/ 
struct listnode  
{ 
 int data; 
 struct listnode *next; 
}; 
void createlist(struct listnode * *,int);  
void listinsert(struct listnode * *,struct listnode * *); 
void readlist(struct listnode *); 
int main() 
{ 
  
 struct listnode *ha=NULL,*hb=NULL; 
 printf("请按照升序序列输入以下数字以建立链表La\n"); 
 printf("Please Input %d numbers:",N1); 
 createlist(&ha,N1); 
 printf("请按照升序序列输入以下数字以建立链表Lb\n"); 
 printf("Please Input %d numbers:",N2); 
 createlist(&hb,N2); 
 listinsert(&ha,&hb); 
 readlist(ha); 
 printf("\n");  
} 
 
 
void createlist(struct listnode * *p,int n) 
{ /*尾插法建立链表*/ 
 struct listnode *t,*q; 
 int i; 
 t=(struct listnode *)malloc(sizeof(struct listnode)); 
 scanf("%d",&t->data); 
 *p=t; 
 q=t;  
 for(i=n-1;i>0;i--) 
    { 
 t=(struct listnode *)malloc(sizeof(struct listnode)); 
 scanf("%d",&t->data); 
 q->next=t; 
 q=t; 
  } 
 q->next=NULL; 
} 
 
void listinsert(struct listnode * *a,struct listnode * *b)  
{ /*将两个链表按递增序列排序*/ 
 struct listnode *pa,*pb,*other,*la,*pre; 
 la=(struct listnode *)malloc(sizeof(struct listnode)); 
 la->next=*a; 
 pa=*a;    
 pb=*b; 
 pre=la;   
 while(pa&&pb) 
  { 
 if(pa->data<pb->data) 
   {   
  pre=pre->next; 
  pa=pa->next; 
  } 
 else if (pa->data>pb->data) 
 { 
  other=(struct listnode *)malloc(sizeof(struct listnode)); 
  other->data=pb->data; 
  other->next=pa; 
  pre->next=other; 
  pre=other; 
  pb=pb->next; 
   } 
  
 else 
 { 
  pre=pre->next; 
  pa=pa->next; 
  pb=pb->next; 
  } 
 } 
  
 if(!pa) 
 { 
 while(pb) 
 { 
  other=(struct listnode *)malloc(sizeof(struct listnode)); 
  other->data=pb->data;   
        pre->next=other; 
  pre=pre->next; 
  pb=pb->next; 
 } 
 pre->next=NULL; 
 } 
 *a=la->next; 
 free(la); 
} 
 
void readlist(struct listnode *p) 
{ /*遍历链表并输出最终结果*/ 
 struct listnode *q; 
 q=p; 
 printf("链表的排序结果为:\n"); 
 while(q!=NULL) 
   { 
 printf("%3d",q->data); 
 q=q->next; 
 } 
 printf("\n"); 
} 

运行结果

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

上一篇:C语言中形参和实参详解及实例代码

栏    目:C语言

下一篇:C语言判断字符串是否以str2开头代码

本文标题:C语言中数据结构之链表归并排序实例代码

本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/1547.html

网页制作CMS教程网络编程软件编程脚本语言数据库服务器

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:835971066 | 邮箱:835971066#qq.com(#换成@)

Copyright © 2002-2020 脚本教程网 版权所有