将P Q链表合并(Q归并到P里),前提是P,Q链表都是升序的,当大小相同的时候,删除Q链表的内容。
放一下代码
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
}linklist;
int initlist(linklist *P,linklist *Q)
{
P->next=NULL;
Q->next=NULL;
}
int rearadd(linklist *P,linklist *Q)
{
int x;
linklist *s,*u;
s=P;
while(s->next)
s=s->next;
printf("输入P链表要插入的数(升序):");
int n,i;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
u=(linklist *)malloc(sizeof(linklist));
s->next=u;
scanf("%d",&u->data);
u->next=NULL;
s=s->next;
}
s=Q;
printf("输入Q链表要插入的数(升序):");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
u=(linklist *)malloc(sizeof(linklist));
s->next=u;
scanf("%d",&u->data);
u->next=NULL;
s=s->next;
}
}
int mergelink(linklist *P,linklist *Q)
{
linklist *a,*b,*u,*s;
s=P;
a=P->next;
Q=Q->next;
while(a!=NULL&&Q!=NULL)
{
if(a->data<b->data)
{
s=a;
a=a->next;
}
else
{
if(a->data>Q->data)
{
u=(linklist *)malloc(sizeof(linklist));
u->data=Q->data;
u->next=a;
s->next=u;
s=s->next;
}
Q=Q->next;
//printf("%d ",Q->data);
}
}
if(Q!=NULL)
{
s->next=Q;
}
}
int print(linklist *L)
{
linklist *p;
p=L;
printf("打印链表内容:\n");
while(p->next!=NULL)
{
p=p->next;
printf("%d ",p->data);
}
}
int main()
{
linklist P,Q;
initlist(&P,&Q);
rearadd(&P,&Q);
mergelink(&P,&Q);
print(&P);
}
修改如下,供参考:
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node* next;
}linklist;
int initlist(linklist* P, linklist* Q)
{
P->next = NULL;
Q->next = NULL;
return 0;
}
int rearadd(linklist* P, linklist* Q)
{
int x;
linklist* s, * u;
s = P;
while (s->next)
s = s->next;
printf("输入P链表要插入的数(升序):");
int n, i;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
u = (linklist*)malloc(sizeof(linklist));
s->next = u;
scanf("%d", &u->data);
u->next = NULL;
s = s->next;
}
s = Q;
while (s->next) //修改
s = s->next;
printf("输入Q链表要插入的数(升序):");
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
u = (linklist*)malloc(sizeof(linklist));
s->next = u;
scanf("%d", &u->data);
u->next = NULL;
s = s->next;
}
return 0;
}
int mergelink(linklist* P, linklist* Q)
{
linklist* a, * b, * u, * s;
s = P;
a = P->next;
u = b = Q->next; //Q = Q->next;
while (a != NULL && b != NULL) //(a != NULL && Q != NULL)
{
if (a->data < b->data)
{
s = a;
a = a->next;
}
else
{
b = b->next;
if (a->data > u->data)
{
u->next = a;
s->next = u;
s = s->next;
}
else
free(u);
u = b;
//u = (linklist*)malloc(sizeof(linklist));
//u->data = Q->data;
//u->next = a;
//s->next = b;
//s = s->next;
}
//Q = Q->next;
//printf("%d ",Q->data);
}
if (b != NULL)
{
s->next = b;
}
return 0;
}
int print(linklist* L)
{
linklist* p;
p = L;
printf("打印链表内容:\n");
while (p->next != NULL)
{
p = p->next;
printf("%d ", p->data);
}
printf("\n");
return 0;
}
int main()
{
linklist P, Q;
initlist(&P, &Q);
rearadd(&P, &Q);
mergelink(&P, &Q);
print(&P);
return 0;
}