合并两个有序单链表

来源:互联网 发布:什么是网络接口 编辑:程序博客网 时间:2024/06/08 00:46
#include<stdio.h>#include <malloc.h>typedef struct linknode{    int data;    linknode *next;} Node,*Linklist;//Linklist表示结构体指针Linklist CreateList_end(int n);//尾插法建立链表Linklist MergeLinklist(Linklist LA,Linklist LB);//将两个非递减的有序单链表合并成一个单链表void ShowList(Linklist L);//输出链表内容int main(void){    Linklist L1,L2,L;    int n;    scanf("%d",&n);    L1=CreateList_end(n);    L2=CreateList_end(n);    L=MergeLinklist(L1,L2);    ShowList(L);    return 0;}Linklist CreateList_end(int n){    Linklist head=(Linklist)malloc(sizeof(Node));    Node *p,*e;    p=head;    int x;    for(int i=0; i<n; i++)//尾插法建立链表    {        e=(Linklist)malloc(sizeof(Node));        scanf("%d",&x);        e->data=x;        p->next=e;        p=e;    }    p->next=NULL;//将链表的最后一个节点的指针域置空    return head;}void ShowList(Linklist L)//输出链表内容{    L=L->next;    while(L)    {        printf("%d ",L->data);        L=L->next;    }    printf("\n");}Linklist MergeLinklist(Linklist LA,Linklist LB)//将两个非递减的有序单链表合并成一个单链表{    Node *pa,*pb;    Linklist LC,r;//将LC初始置空表。pa和pb分别指向两个单链表LA和LB中的第一个节点,r初始值为LC且r始终指向LC的表尾。    pa=LA->next;    pb=LB->next;    LC=LA;    LC->next=NULL;    r=LC;    while(pa!=NULL&&pb!=NULL)//当两个表中均为处理完时,比较选择将较小值节点插入到新表LC中    {        if(pa->data<=pb->data)        {            r->next=pa;            r=pa;            pa=pa->next;        }        else        {            r->next=pb;            r=pb;            pb=pb->next;        }    }    if(pa)//若表LA未完,将表LA中后续元素链到新表LC表尾。        r->next=pa;    else        r->next=pb;//否则将表LA中后续元素链到新表LC表尾。    free(LB);    return LC;}

原创粉丝点击