C语言:无序链表合并成有序链表
**
将两个无序链表合并为一个有序链表,从小到大合并,不另外占领空间,且链表没有重复。(C语言)
人生如逆旅,我亦是行人。____苏轼《临江仙·送钱穆父》
#include<stdio.h> #include<stdlib.h> typedef struct node{ int data; struct node *next; }node;//创建一个结构体,名字为node node *la,*lb,*lc;//结构体指针变量 void link(node *la,node *lb,node *lc)//连接函数 { node *pa; node *pb; node *pc; pa=la->next;//pa和pb分别指向两个表的第一个结点 pb=lb->next; lc=la;//la的头结点表示lc的头结点 pc=lc;//pc的初值指向lc while(pa!=NULL&&pb!=NULL) { if(pa->data<=pb->data) { pc->next=pa; pc=pa; pa=pa->next; } else { pc->next=pb; pc=pb; pb=pb->next; } } pc->next=pa?pa:pb; delete lb; } void creat() { node *p1,*p2; la=(node*)malloc(sizeof(node)); lb=(node*)malloc(sizeof(node)); p1=la; p2=lb; p1->next=NULL; p2->next=NULL; int n,i; printf("请输入你要确定的链表长度:"); scanf("%d",&n); for(i=1;i<=n;i++) { node *newnode=(node*)malloc(sizeof(node)); printf("请输入链表的值:"); scanf("%d",&newnode->data); p1->next=newnode; p1=p1->next; } p1->next=NULL; for(i=1;i<=n;i++) { node *newnode=(node*)malloc(sizeof(node)); printf("请输入链表的值:"); scanf("%d",&newnode->data); p2->next=newnode; p2=p2->next; } p2->next=NULL; } void sort(node *la) { node *x,*y; node *head; head=la; x=(node*)malloc(sizeof(node)); y=(node*)malloc(sizeof(node)); int t; for(x=head;x!=NULL;x=x->next) { for(y=x->next;y!=NULL;y=y->next) { if(y->data<x->data) { t=y->data; y->data=x->data; x->data=t; } } } } void delete_hyb(node *la) { node *a,*b,*c; a=NULL; b=NULL; c=NULL; c=la; b=c->next; //方便删除 while(b!=NULL) { a=la; while(1) { if(a->data==b->data)//若此节点与前面值相同,则删除b { c->next=b->next; free(b); b=c->next; break; } if(a->next==b)//若此节点与前者不同,b往后移,继续寻找相同的结点 { b=b->next; c=c->next; break; } a=a->next; } } } void main() { creat(); link(la,lb,lc); delete_hyb(la); sort(la); node *p=la; while(la->next!=NULL) { printf("%d ",la->next->data); la=la->next; } }
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
Volatile保证可见性、不保证原子性