用C语言编一个程序:两个递增有序链表合并成一个递减链表,

2024-12-01 22:58:44
推荐回答(2个)
回答(1):

#include
#include

typedef struct node
{
int data;
struct node *next;
}node,*list;
void init(list &head)
{
head=(list)malloc(sizeof(node));
head->next=NULL;
}

void input(list &h)
{
list p,q;
q=h;
printf("输入数据的个数 n : ");
int n;
scanf("%d",&n);
printf("请输入 %d 个有序递增数据:\n",n);
for (int i=0;i {
// printf("第 %d 个: ",i+1);
p=(list)malloc(sizeof(node));
scanf("%d",&p->data);
p->next=q->next;
q->next=p;
q=p;
}
}

void output(list h)
{
list p;
p=h->next;
printf("输出数据\n");
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}

void combine(list &a,list &b,list &c)
{
list p,q,t;
p=a->next;
q=b->next;
free(b);
b=q;
c=a;
a=p;
c->next=NULL;
while(p&&q)
{
if (p->data<=q->data)
{
a=a->next;
p->next=c->next;
c->next=p;
p=a;
}
else
{
b=q->next;
q->next=c->next;
c->next=q;
q=b;
}
}
if (p!=NULL)
{
while(p)
{
a=a->next;
p->next=c->next;
c->next=p;
p=a;
}
}
if (q!=NULL)
{
while(q)
{
b=q->next;
q->next=c->next;
c->next=q;
q=b;
}
}

}
void main()
{
list a,b,c;
init(a);init(b);
printf("\n输入链表A :\n");
input(a);
printf("\n输入链表B :\n");
input(b);

printf("输出合并后的链表:\n");
combine(a,b,c);
output(c);
}
结果:
输入链表A :
输入数据的个数 n : 3
请输入 3 个有序递增数据:
4 5 9

输入链表B :
输入数据的个数 n : 4
请输入 4 个有序递增数据:
2 3 7 10

输出合并后的链表:
输出数据
10 9 7 5 4 3 2
Press any key to continue

回答(2):

//---------------------------------------------------------------------------

#include
#include

typedef struct node{
int d;
struct node *next;
} node,list;

list *merge(list *a,list *b) /*合并链表*/
{
list *rt=NULL,*now=NULL,*nc=NULL;
while (a&&b)
{
if (a->d>=b->d) {
nc=a;
a=a->next;
}
else {
nc=b;
b=b->next;
}

if (rt) {
now->next=nc;
now=now->next;
}
else rt=now=nc;

}

if (a) now->next=a;
else now->next=b;

return rt;
}
list *reverse(list **lp) /*反转列表*/
{
list *f=*lp,*m=NULL,*l=NULL;
while (f)
{
m=f->next ;

f->next=l;

l=f;

f=m;

}

return *lp=l;
}
list *insert(list *a,int c)
{
node *b=NULL;
if (a) {
a->next=insert(a->next,c);
b=a;
}
else {
b=malloc(sizeof(node));
b->d=c;
b->next=NULL;
}
return b;
}
void prt(list *p)
{
while (p) {
printf("%d ",p->d);
p=p->next;
}
}

int main(void)
{
list *a=NULL, *b=NULL;
int i;
for (i = 10; i>0; i-=2) {
a=insert(a,i);
b=insert(b,i-1);
}
printf("A:\t");
prt(a);
printf("\nB:\t");
prt(b);
a=reverse((a=merge(a,b),&a));
printf("\nA+B:\t");
prt(a);

return 0;
}
//---------------------------------------------------------------------------