将带头结点的有序单链表A和B合并成一个新的有序表C……

来源:互联网 发布:斗鱼主播用的直播软件 编辑:程序博客网 时间:2024/05/20 06:41

问题链接……

运行结果:


#include<stdio.h>#include<stdlib.h>typedef struct LNode{  int data;  struct LNode *next;}LNode,*LinkList;LinkList link(LinkList S,LinkList T)//将S,T链接成新的链表并返回新链表指针……以S的顺序为主排序返回……{    LinkList p,q,r,s,t;int k=0;s=S;t=T;if(s->next->data<s->next->next->data)k=1;//用k来控制S为递增或递减的操作k==1代表升序的操作    p=q=(LinkList)malloc(sizeof(LNode));//带头节点    while(s->next!=NULL)//复制S链表    {        r=(LinkList)malloc(sizeof(LNode));        r->data=s->next->data;        q->next=r;        q=r;        s=s->next;    }q->next=NULL;q=p;    while(t->next!=NULL)//链接复制T链表    {        while(k==1&&q->next!=NULL&&q->next->data<=t->next->data||k==0&&q->next!=NULL&&q->next->data>=t->next->data)//用或来区别S是升序还是降序,来进行不同操作,得到不同顺序表q=q->next;if(q->data!=t->next->data)//如果存在相同元素,继续下一个而不存入新表中{r=(LinkList)malloc(sizeof(LNode));r->data=t->next->data;r->next=q->next;q->next=r;}q=p;                t=t->next;    }        return p;    //返回复制链表指针}void main(){    LinkList S,T,P,q,r;    int k=0;    S=q=(LinkList)malloc(sizeof(LNode));//S带头节点    while(20-k)    //为S分配空间及赋值    {        r=(LinkList)malloc(sizeof(LNode));        r->data=k;        q->next=r;        q=r;        k+=2;    }    q->next=NULL;    //S的最后一个节点的下一个节点置空    k=19;    T=q=(LinkList)malloc(sizeof(LNode));    //T带头节点    while(k>0)    //为T分配空间及赋值    {        r=(LinkList)malloc(sizeof(LNode));        r->data=k;        q->next=r;        q=r;        k-=2;    }    q->next=NULL;    //T的最后一个节点的下一个节点置空    P=link(S,T);    //调用函数得到S,T链接后的新链表,S,T的顺序调换,可能得到不同顺序表//下面为输出各链表的值    printf("S:\n");        while(S->next!=NULL)    {        printf("%d ",S->next->data);        S=S->next;    }    printf("\nT:\n");    while(T->next!=NULL)    {        printf("%d ",T->next->data);        T=T->next;    }    printf("\nP:\n");    while(P->next!=NULL)    {        printf("%d ",P->next->data);        P=P->next;    }    printf("\n\n");}


原创粉丝点击