数据结构归并问题有人可以帮帮我吗?

将P Q链表合并(Q归并到P里),前提是P,Q链表都是升序的,当大小相同的时候,删除Q链表的内容。

img


才开始是按照上面的步骤写的,但是最后出现了问题(运行不出来),我感觉是free()的问题,然后按照上面的思路重新写了一个,可以运行但是有问题,反反复复排查了几个小时,最后把问题缩小到if(a->data>Q->data)里面(我的看法)

img


上图是我后面写的代码运行结果,如果Q链表单单输入一个2或者4是对的(第二个运行结果),但是如果Q链表有一个数大于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;
}
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;
}